
    mI                        S SK Jr  S SKrS SKrS SKJr  S SKJr  S SKJ	r	J
r
  S SKrS SKJr  S SKJr  S SKJr  S S	KJrJrJrJr  S S
KJrJr  S SKJr   " S S5      rg)    )annotationsN)resolvesLocalhostFQDN)mock)	MagicMockpatch)connection_from_url)HTTPSConnectionPool)LocationValueError)_DEFAULT_BLOCKSIZEPoolKeyPoolManagerkey_fn_by_scheme)retrytimeout)Urlc                     \ rS rSr\" 5       S,S j5       rS,S jrS,S jr\R                  R                  SSS/5      S-S j5       rS,S	 jrS,S
 jrS,S jrS,S jrS,S jrS,S jrS,S jrS,S jrS,S jrS,S jrS,S jrS,S jr\" S5      S.S j5       r\" S5          S/S j5       rS,S jrS,S jrS,S jrS,S jrS,S jrS,S jr S,S jr!S,S  jr"S,S! jr#\R                  R                  S"\$\$4S\$4S#/5            S0S$ j5       r%\R                  R                  S/ S%Q5      \" S&5            S1S' j5       5       r&\" S(5      \" S&5            S2S) j5       5       r'S,S* jr(S+r)g)3TestPoolManager   c                   [        S5      n[        S5      nX:w  d   e[        S5      nUR                  S5      nUR                  S5      nX:X  d   e[        S5      nUR                  S5      nUR                  S5      nX:w  d   eg )Nhttp://localhost:8081/foohttp://localhost:8081/bar      zhttp://localhost.:8081/foo)r   r   )selfconn1conn2ps       <platform/gsutil/third_party/urllib3/test/test_poolmanager.pytest_same_urlTestPoolManager.test_same_url   s     $$?@#$?@~~ N%%&AB%%&AB~~ N%%&BC%%&AB~~    c                    / SQn[        5       n[        S5      nU H%  nUR                  U5      nUR                  U5        M'     [	        U5      S:X  d   eg )N)r   zhttp://www.google.com/mailr   zhttps://www.google.com/zhttps://www.google.com/mailzhttp://yahoo.comzhttp://bing.comzhttp://yahoo.com/
      )setr   r   addlen)r   urlsconnectionsr   urlconns         r   test_many_urlsTestPoolManager.test_many_urls1   sV    	
 eOC((-DOOD!  ;1$$$r!   c                    [        S5      nUR                  S5        [        UR                  5      S:X  d   eUR	                  5         [        UR                  5      S:X  d   eg )Nr$   http://google.comr   r   )r   r   r'   poolsclearr   r   s     r   test_manager_clear"TestPoolManager.test_manager_clearG   sO    N	12177|q   		177|q   r!   r*   zhttp://@Nc                    [        S5      n[        R                  " [        5         UR	                  US9  S S S 5        g ! , (       d  f       g = f)Nr$   )r*   )r   pytestraisesr
   r   )r   r*   r   s      r   test_nohostTestPoolManager.test_nohostP   s5    N]]-.!!c!* /..s	   ?
Ac                    [        S5       nUR                  S5        [        UR                  5      S:X  d   e S S S 5        [        WR                  5      S:X  d   eg ! , (       d  f       N*= f)Nr   r/   r   )r   r   r'   r0   r2   s     r   test_contextmanager#TestPoolManager.test_contextmanagerV   sU    ^q!!"56qww<1$$$  177|q   	 ^s   -A
A,c                $  ^ [         R                  " S5      [        R                  " SSS9SS[        S-   S.n[        5       nUR                  S	5      UR                  S
5      UR                  S5      /mUR                  5        H3  u  p4XBR                  U'   TR                  UR                  S	5      5        M5     [        U4S j[        T5       5       5      (       d   e[        S UR                  R                  5        5       5      (       d   eg)z@Assert the HTTPPoolKey fields are honored when selecting a pool.Q	@   r   totalconnectT	127.0.0.1r   )r   retriesblocksource_address	blocksizehttp://example.com/zhttp://example.com:8000/zhttp://other.example.com/c              3  f   >#    U  H&  u  p[        T5        H  u  p4X:w  d  M  X$Lv   M     M(     g 7fN	enumerate.0ixjy
conn_poolss        r   	<genexpr><TestPoolManager.test_http_pool_key_fields.<locals>.<genexpr>q   7      
-!*-v AJ- -   11c              3  B   #    U  H  n[        U[        5      v   M     g 7frJ   
isinstancer   rN   keys     r   rT   rU   w        F~:c7++~   Nr   Timeoutr   Retryr   r   r   itemsconnection_pool_kwappendallrL   r0   keys)r   rc   r   r\   valuerS   s        @r   test_http_pool_key_fields)TestPoolManager.test_http_pool_key_fields]   s     t,{{A6)+a/
 M!!"78!!"<=!!"=>

 -224JC(-  %a334IJK 5  
!*-
 
 
 	
 
 Fqww||~FFFFFr!   c                  ^ [         R                  " S5      [        R                  " SSS9SSSSS	S
S[        S-   S.
n[        5       nUR                  S5      UR                  S5      UR                  S5      /m/ nUR                  5        HS  u  pEXRR                  U'   TR                  UR                  S5      5        UR                  UR                  S5      5        MU     [        U4S j[        T5       5       5      (       d   e[        U4S jU 5       5      (       d   e[        S UR                  R                  5        5       5      (       d   eg)zAAssert the HTTPSPoolKey fields are honored when selecting a pool.r>   r?   r   r@   TrC   /root/totally_legit.key/root/totally_legit.crtCERT_REQUIRED/root/path_to_pemSSLv23_METHODr   )
r   rD   rE   rF   key_file	cert_file	cert_reqsca_certsssl_versionrG   https://example.com/zhttps://example.com:4333/zhttps://other.example.com/c              3  f   >#    U  H&  u  p[        T5        H  u  p4X:w  d  M  X$Lv   M     M(     g 7frJ   rK   rM   s        r   rT   =TestPoolManager.test_https_pool_key_fields.<locals>.<genexpr>   rV   rW   c              3  ,   >#    U  H	  oT;   v   M     g 7frJ    )rN   poolrS   s     r   rT   rw      s     <)$:%)s   c              3  B   #    U  H  n[        U[        5      v   M     g 7frJ   rY   r[   s     r   rT   rw      r]   r^   Nr_   )r   rc   r   	dup_poolsr\   rg   rS   s         @r   test_https_pool_key_fields*TestPoolManager.test_https_pool_key_fieldsy   sD    t,{{A6)12(+*+a/
 M!!"89!!"=>!!">?

 	,224JC(-  %a334JKLQ223IJK 5
  
!*-
 
 
 	
 
 <)<<<<<Fqww||~FFFFFr!   c                z    [        5       nUR                  UR                  :X  d   eUR                  [        Ld   eg)z?Assert each PoolManager gets a copy of ``pool_keys_by_scheme``.N)r   r   r2   s     r    test_default_pool_key_funcs_copy0TestPoolManager.test_default_pool_key_funcs_copy   s8    M!!Q%7%7777!!)9999r!   c           	     
  ^ SSSSSS.n[        S0 UD6nUR                  SSS	S
9/mU H2  nSUR                  U'   TR                  UR                  SSS	S
95        M4     [	        U4S j[        T5       5       5      (       d   eg)zAAssert pools are still keyed correctly with connection_from_host.rk   rl   rm   rn   ro   )rp   rq   rr   rs   rt   example.comi  httpsschemenewvalc              3  f   >#    U  H&  u  p[        T5        H  u  p4X:w  d  M  X$Lv   M     M(     g 7frJ   rK   )rN   rO   rP   rQ   rR   connss        r   rT   BTestPoolManager.test_pools_keyed_with_from_host.<locals>.<genexpr>   s7      
(!%(v AJ( (rW   N)r$   )r   connection_from_hostrc   rd   re   rL   )r   ssl_kwr   kr   s       @r   test_pools_keyed_with_from_host/TestPoolManager.test_pools_keyed_with_from_host   s     22(+*
 $V$''s7'KLA&.A  #LL//s7/ST   
!%(
 
 
 	
 
r!   c                    [        5       nUR                  S5      nUR                  S5      nS[        UR                  5      :X  d   eX#L d   e[	        S UR                  R                  5        5       5      (       d   eg)z=Assert scheme case is ignored when pooling HTTPS connections.ru   zHTTPS://EXAMPLE.COM/r   c              3  B   #    U  H  n[        U[        5      v   M     g 7frJ   rY   r[   s     r   rT   RTestPoolManager.test_https_connection_from_url_case_insensitive.<locals>.<genexpr>   r]   r^   Nr   r   r'   r0   re   rf   r   r   rz   
other_pools       r   /test_https_connection_from_url_case_insensitive?TestPoolManager.test_https_connection_from_url_case_insensitive   sn    M$$%;<**+AB
CL   !!!Fqww||~FFFFFr!   c                    [        5       nUR                  SSS9nUR                  SSS9nS[        UR                  5      :X  d   eX#L d   e[	        S UR                  R                  5        5       5      (       d   eg)	?Assert scheme case is ignored when getting the https key class.r   r   r   EXAMPLE.COMHTTPSr   c              3  B   #    U  H  n[        U[        5      v   M     g 7frJ   rY   r[   s     r   rT   STestPoolManager.test_https_connection_from_host_case_insensitive.<locals>.<genexpr>   r]   r^   Nr   r   r'   r0   re   rf   r   s       r   0test_https_connection_from_host_case_insensitive@TestPoolManager.test_https_connection_from_host_case_insensitive   sv    M%%mG%D++M'+J
CL   !!!Fqww||~FFFFFr!   c                   [        5       nSSSS.nSSSS.nUR                  U5      nUR                  U5      nS[        UR                  5      :X  d   eXEL d   e[	        S UR                  R                  5        5       5      (       d   eg	)
r   r   r   443r   hostportr   r   r   c              3  B   #    U  H  n[        U[        5      v   M     g 7frJ   rY   r[   s     r   rT   VTestPoolManager.test_https_connection_from_context_case_insensitive.<locals>.<genexpr>   r]   r^   Nr   connection_from_contextr'   r0   re   rf   r   r   contextother_contextrz   r   s         r   3test_https_connection_from_context_case_insensitiveCTestPoolManager.test_https_connection_from_context_case_insensitive   s    M$mUK#*M5Q((1..}=
CL   !!!Fqww||~FFFFFr!   c                    [        5       nUR                  S5      nUR                  S5      nS[        UR                  5      :X  d   eX#L d   e[	        S UR                  R                  5        5       5      (       d   eg)z<Assert scheme case is ignored when pooling HTTP connections.rH   zHTTP://EXAMPLE.COM/r   c              3  B   #    U  H  n[        U[        5      v   M     g 7frJ   rY   r[   s     r   rT   QTestPoolManager.test_http_connection_from_url_case_insensitive.<locals>.<genexpr>   r]   r^   Nr   r   s       r   .test_http_connection_from_url_case_insensitive>TestPoolManager.test_http_connection_from_url_case_insensitive   sn    M$$%:;**+@A
CL   !!!Fqww||~FFFFFr!   c                    [        5       nUR                  SSS9nUR                  SSS9nS[        UR                  5      :X  d   eX#L d   e[	        S UR                  R                  5        5       5      (       d   eg)	r   r   httpr   r   HTTPr   c              3  B   #    U  H  n[        U[        5      v   M     g 7frJ   rY   r[   s     r   rT   RTestPoolManager.test_http_connection_from_host_case_insensitive.<locals>.<genexpr>   r]   r^   Nr   r   s       r   /test_http_connection_from_host_case_insensitive?TestPoolManager.test_http_connection_from_host_case_insensitive   sv    M%%mF%C++M&+I
CL   !!!Fqww||~FFFFFr!   c                    Sn[        SUS9nUR                  S5      nS[        UR                  5      :X  d   e[	        U[
        5      (       d   eUR                  (       d   eXR                  :X  d   eg)zCAssert that pool manager can accept hostname and fingerprint flags.z;92:81:FE:85:F7:0C:26:60:EC:D6:B3:BF:93:CF:F9:71:CC:07:7D:0AT)assert_hostnameassert_fingerprintru   r   N)r   r   r'   r0   rZ   r	   r   r   )r   fingerprintr   rz   s       r   )test_assert_hostname_and_fingerprint_flag9TestPoolManager.test_assert_hostname_and_fingerprint_flag   so    SM$$%;<CL   $ 34444####55555r!   c                   [        5       nSSSS.nSSSS.nUR                  U5      nUR                  U5      nS[        UR                  5      :X  d   eXEL d   e[	        S UR                  R                  5        5       5      (       d   eg	)
r   r   r   8080r   r   r   r   c              3  B   #    U  H  n[        U[        5      v   M     g 7frJ   rY   r[   s     r   rT   UTestPoolManager.test_http_connection_from_context_case_insensitive.<locals>.<genexpr>  r]   r^   Nr   r   s         r   2test_http_connection_from_context_case_insensitiveBTestPoolManager.test_http_connection_from_context_case_insensitive   s    M#]FK#)=&Q((1..}=
CL   !!!Fqww||~FFFFFr!   z4urllib3.poolmanager.PoolManager.connection_from_hostc                   [        S5      Ul        [        5       n[        R                  " [
        5       n[        R                  " [         5         UR                  SSS9  S S S 5        S S S 5        Sn[        W5      S:X  d   e[        US   R                  [
        5      (       d   eUS   R                  R                  S   U:X  d   eg ! , (       d  f       Np= f! , (       d  f       Ny= f)NzNot attempting connectionGETzevil.com://good.com)methodr*   a	  URLs without a scheme (ie 'https://') are deprecated and will raise an error in a future version of urllib3. To avoid this DeprecationWarning ensure all URLs start with 'https://' or 'http://'. Read more in this issue: https://github.com/urllib3/urllib3/issues/2920r   r   )ConnectionErrorside_effectr   r6   warnsDeprecationWarningr7   requestr'   rZ   messageargs)r   r   r   recordsmsgs        r   test_deprecated_no_scheme)TestPoolManager.test_deprecated_no_scheme  s     ,;;V+W(M\\,-/		,A	B 0 .
= 	 7|q   '!*,,.@AAAAqz!!&&q)S000 0/ .-s#   CC!C
C	C
C*z8urllib3.poolmanager.PoolManager.connection_from_pool_keyc                x   [        5       nSSSSS.n[        R                  " [        5       nUR	                  U5        S S S 5        SnWS   n[        UR                  [        5      (       d   eUR                  R                  S   U:X  d   eUR                  u  pxUS   SSSS	.:X  d   eg ! , (       d  f       Ns= f)
Nr   r   i  T)r   r   r   strictzdThe 'strict' parameter is no longer needed on Python 3+. This will raise an error in urllib3 v2.1.0.r   request_contextr   )
r   r6   r   r   r   rZ   r   Warningr   	call_args)	r   connection_from_pool_keyr   r   r   r   record_kwargss	            r   )test_connection_from_context_strict_param9TestPoolManager.test_connection_from_context_strict_param  s     M!	
 \\,-%%g. .: 	 &..'2222~~""1%,,,,66	'(!-
 
 	
 
 .-s   B++
B9c                    [        S5      nS UR                  S'   UR                  SSS0S9nUR                  SSS0S9nUR                  SSS	S
.S9nS[        UR                  5      :X  d   eX$L d   eX#Ld   eg)z6Assert it is possible to define a custom key function.r#   c                    [        U S   5      $ )Nr\   )tuple)rP   s    r   <lambda>6TestPoolManager.test_custom_pool_key.<locals>.<lambda><  s    uQuXr!   r   http://example.comr\   rg   pool_kwargsotherrR   )r\   rP   r   N)r   r   r   r'   r0   )r   r   pool1pool2pool3s        r   test_custom_pool_key$TestPoolManager.test_custom_pool_key8  s    O%>6"%% ug.> & 
 %% ug.> & 
 %% gC.H & 
 CL   ~~!!!r!   c                (   [        5       nSSS.nUR                  S5      nUR                  SUS9n[        R                  R                  UR
                  :X  d   eUR                  (       a   eSUR
                  :X  d   eUR                  (       d   eg)z=Assert overriding pool kwargs works with connection_from_url.d   TrD   rE   rH   r   N)r   r   r   ra   DEFAULTrD   rE   r   r   r   default_pooloverride_pools        r   test_override_pool_kwargs_url-TestPoolManager.test_override_pool_kwargs_urlK  s    M"%5,,-BC--!{ . 
 {{""l&:&::::%%%%m+++++""""r!   c                (   [        5       nSSS.nUR                  SSS9nUR                  SSUS9n[        R                  R                  UR
                  :X  d   eUR                  (       a   eSUR
                  :X  d   eUR                  (       d   eg)	z=Assert overriding pool kwargs works with connection_from_hostr   Tr   r   r   r   r   r   N)r   r   r   ra   r   rD   rE   r   s        r   test_override_pool_kwargs_host.TestPoolManager.test_override_pool_kwargs_host[  s    M"%5--mF-K..&k / 
 {{""l&:&::::%%%%m+++++""""r!   c                8   [        / S9n[        R                  [        R                  S4[        R                  [        R
                  S4/nSU0nUR                  SSS9nUR                  SSUS9nUR                  S   / :X  d   eUR                  S   U:X  d   eg)	z=Assert passing socket options works with connection_from_host)socket_optionsr   r   r   r   r   r   N)r   socket
SOL_SOCKETSO_REUSEADDRIPPROTO_TCPTCP_NODELAYr   conn_kw)r   r   override_optsr   r   r   s         r   test_pool_kwargs_socket_options/TestPoolManager.test_pool_kwargs_socket_optionsk  s    r* 3 3Q7!3!3Q7
 (7--mF-K..&k / 
 ##$45;;;$$%56-GGGr!   c                R    [        SS9nUR                  SS05      nSSS.U:X  d   eg)z1Assert _merge_pool_kwargs works in the happy caser   rD   new_keyrg   )rD   r  Nr   _merge_pool_kwargsr   r   mergeds      r   test_merge_pool_kwargs&TestPoolManager.test_merge_pool_kwargs|  s4    $%%y'&:;73v===r!   c                    [        SS9nUR                  0 5      nUR                  U:X  d   eUR                  S5      nUR                  U:X  d   eg)z>Assert false-y values to _merge_pool_kwargs result in defaultsr   r  Nr   r
  rc   r  s      r   test_merge_pool_kwargs_none+TestPoolManager.test_merge_pool_kwargs_none  sT    $%%b)##v---%%d+##v---r!   c                L    [        SS9nUR                  SS05      nSU;  d   eg)z2Assert keys can be removed with _merge_pool_kwargsr   r  rD   Nr	  r  s      r   !test_merge_pool_kwargs_remove_key1TestPoolManager.test_merge_pool_kwargs_remove_key  s/    $%%y$&78&&&r!   c                `    [        SS9nUR                  SS05      nUR                  U:X  d   eg)zBAssert removing invalid keys with _merge_pool_kwargs doesn't breakr   r  invalid_keyNr  r  s      r   "test_merge_pool_kwargs_invalid_key2TestPoolManager.test_merge_pool_kwargs_invalid_key  s5    $%%}d&;<##v---r!   c                    [        5       nUR                  [        S5      5      SL d   eUR                  [        S5      5      SL d   eg)zBValides we won't send a request with absolute form without a proxyr   Fzhttps://example.comN)r   !_proxy_requires_url_absolute_formr   r2   s     r   &test_pool_manager_no_url_absolute_form6TestPoolManager.test_pool_manager_no_url_absolute_form  sI    M2237K3LMQVVVV2237L3MNRWWWWr!   z"input_blocksize,expected_blocksize)    r  c                    [        5       nUR                  SSU05      nUR                  S   U:X  d   eUR                  5       R                  U:X  d   eg)z*Assert PoolManager sets blocksize properlyr   rG   N)r   r   r  	_get_connrG   )r   input_blocksizeexpected_blocksizer   pool_blocksizes        r   test_poolmanager_blocksize*TestPoolManager.test_poolmanager_blocksize  s_     M.. ;"@
 %%k26HHHH'')337IIIIr!   )z[a::b%zone]z[a::b%25zone]zhttp://[a::b%zone]zhttp://[a::b%25zone]z)urllib3.util.connection.create_connectionc                    [        5       nUR                  U5      nUR                  5       nUR                  5         UR                  S   S   S:X  d   eg)zChecks that IPv6 scoped addresses are properly handled end-to-end.

This is not strictly speaking a pool manager unit test - this test
lives here in absence of a better code location for e2e/integration
tests.
r   )z	a::b%zoneP   Nr   r   r   rB   r   )r   create_connectionr*   r   	conn_poolr+   s         r   test_e2e_connect_to_ipv6_scoped/TestPoolManager.test_e2e_connect_to_ipv6_scoped  sQ    & M))#.	""$ **1-a04EEEEr!   z"urllib3.connection.ssl_wrap_socketc                    [        5       nUR                  SSS0S9nUR                  5       nUR                  5         UR                  S   S   S:X  d   eg )Nzhttps://[a::b%zone]r   Fr   r   server_hostnameza::br(  )r   r)  ssl_wrap_socketr   r*  r+   s         r   #test_e2e_connect_to_ipv6_scoped_tls3TestPoolManager.test_e2e_connect_to_ipv6_scoped_tls  sc    
 M))!0A5/I * 
	 ""$((+,=>&HHHr!   c                r   [        SS9nUR                  S5      nUR                  S5      nUR                  S5      nUR                  c   eUR                  c   eUR                  c   eUR                  nUR                  5       S:  d   eA[        R
                  " 5         UR                  5       S:X  d   eg )Nr   )	num_poolszhttp://host_x:80/zhttp://host_y:80/zhttp://host_z:80r   )r   r   rz   qsizegccollect)r   pool_managerpool_1pool_2pool_3
conn_queues         r   test_thread_safty!TestPoolManager.test_thread_safty  s    "Q/ 112EF 112EF 112DE {{&&&{{&&&{{&&&[[
!A%%% 


 !Q&&&r!   ry   )returnNone)r*   z
str | Noner>  r?  )r   mock.MagicMockr>  r?  )r   r@  r>  r?  )r!  intr"  rA  r>  r?  )r)  r   r*   strr>  r?  )r)  r   r/  r   r>  r?  )*__name__
__module____qualname____firstlineno__r   r   r,   r3   r6   markparametrizer8   r;   rh   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r   r$  r+  r0  r<  __static_attributes__ry   r!   r   r   r      s    .%,! [[UZ$67+ 8+
!G8$GL:
.GG
GGG6
G AB1 C1( EF
(6
	
 G
8"&# # H">.'.X [[,!34%&	

J"
J8;
J	
J
J [[	
 67F!*F14F	F 8F  /0
67
I!*
I=F
I	
I 8 1
I'r!   r   )
__future__r   r5  r   testr   unittestr   unittest.mockr   r   r6   urllib3r   urllib3.connectionpoolr	   urllib3.exceptionsr
   urllib3.poolmanagerr   r   r   r   urllib3.utilr   r   urllib3.util.urlr   r   ry   r!   r   <module>rT     sA    " 	  &  *  ' 6 1  (  Y' Y'r!   