
    mI                        d dl mZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	m
Z
 d dlZd dlmZ d dlmZ d dlmZ d d	lmZmZmZmZ d d
lmZmZ d dlmZ  G d d      Zy)    )annotationsN)resolvesLocalhostFQDN)mock)	MagicMockpatch)connection_from_url)HTTPSConnectionPool)LocationValueError)_DEFAULT_BLOCKSIZEPoolKeyPoolManagerkey_fn_by_scheme)retrytimeout)Urlc                     e Zd Z e       d*d       Zd*dZd*dZej                  j                  dddg      d+d       Z
d*dZd*d	Zd*d
Zd*dZd*dZd*dZd*dZd*dZd*dZd*dZd*dZd*dZ ed      d,d       Z ed      	 	 	 	 d-d       Zd*dZd*dZd*dZd*dZd*dZd*dZd*dZ d*dZ!d*d Z"ej                  j                  d!e#e#fde#fd"g      	 	 	 	 	 	 d.d#       Z$ej                  j                  dg d$       ed%      	 	 	 	 	 	 d/d&              Z% ed'       ed%      	 	 	 	 	 	 d0d(              Z&d*d)Z'y)1TestPoolManagerc                   t        d      }t        d      }||k7  sJ t        d      }|j                  d      }|j                  d      }||k(  sJ t        d      }|j                  d      }|j                  d      }||k7  sJ y )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_urlzTestPoolManager.test_same_url   s     $$?@#$?@~~ N%%&AB%%&AB~~ N%%&BC%%&AB~~    c                    g d}t               }t        d      }|D ]$  }|j                  |      }|j                  |       & t	        |      dk(  sJ y )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_urlszTestPoolManager.test_many_urls1   sV    	
 eOC((-DOOD!  ;1$$$r   c                    t        d      }|j                  d       t        |j                        dk(  sJ |j	                          t        |j                        dk(  sJ y )Nr"   http://google.comr   r   )r   r   r%   poolsclearr   r   s     r   test_manager_clearz"TestPoolManager.test_manager_clearG   sO    N	12177|q   		177|q   r   r(   zhttp://@Nc                    t        d      }t        j                  t              5  |j	                  |       d d d        y # 1 sw Y   y xY w)Nr"   )r(   )r   pytestraisesr
   r   )r   r(   r   s      r   test_nohostzTestPoolManager.test_nohostP   s5    N]]-.!!c!* /..s   AA
c                    t        d      5 }|j                  d       t        |j                        dk(  sJ 	 d d d        t        j                        dk(  sJ y # 1 sw Y   $xY w)Nr   r,   r   )r   r   r%   r-   r/   s     r   test_contextmanagerz#TestPoolManager.test_contextmanagerV   sU    ^q!!"56qww<1$$$  177|q   	 ^s   ,AA%c                   t        j                  d      t        j                  dd      ddt        dz   d}t               }|j                  d	      |j                  d
      |j                  d      g|j                         D ]4  \  }}||j                  |<   j                  |j                  d	             6 t        fdt              D              sJ t        d |j                  j                         D              sJ y)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  \   K   | ]#  \  }}t              D ]  \  }}||k7  r||u  % y wN	enumerate.0ixjy
conn_poolss        r   	<genexpr>z<TestPoolManager.test_http_pool_key_fields.<locals>.<genexpr>q   >      
-1!*-1Av QJ- -   ),c              3  <   K   | ]  }t        |t                y wrD   
isinstancer   rH   keys     r   rN   z<TestPoolManager.test_http_pool_key_fields.<locals>.<genexpr>w        F~:c7+~   Nr   Timeoutr   Retryr   r   r   itemsconnection_pool_kwappendallrF   r-   keys)r   r\   r   rU   valuerM   s        @r   test_http_pool_key_fieldsz)TestPoolManager.test_http_pool_key_fields]   s     t,{{A6)+a/
 M!!"78!!"<=!!"=>

 -224JC(-A  %a334IJK 5  
!*-
 
 	
 
 Fqww||~FFFFr   c                   t        j                  d      t        j                  dd      ddddd	d
dt        dz   d
}t               }|j                  d      |j                  d      |j                  d      gg }|j                         D ]T  \  }}||j                  |<   j                  |j                  d             |j                  |j                  d             V t        fdt              D              sJ t        fd|D              sJ t        d |j                  j                         D              sJ y)zAAssert the HTTPSPoolKey fields are honored when selecting a pool.r8   r9   r   r:   Tr=   /root/totally_legit.key/root/totally_legit.crtCERT_REQUIRED/root/path_to_pemSSLv23_METHODr   )
r   r>   r?   r@   key_file	cert_file	cert_reqsca_certsssl_versionrA   https://example.com/zhttps://example.com:4333/zhttps://other.example.com/c              3  \   K   | ]#  \  }}t              D ]  \  }}||k7  r||u  % y wrD   rE   rG   s        r   rN   z=TestPoolManager.test_https_pool_key_fields.<locals>.<genexpr>   rO   rP   c              3  &   K   | ]  }|v  
 y wrD    )rH   poolrM   s     r   rN   z=TestPoolManager.test_https_pool_key_fields.<locals>.<genexpr>   s     <)$4:%)s   c              3  <   K   | ]  }t        |t                y wrD   rR   rT   s     r   rN   z=TestPoolManager.test_https_pool_key_fields.<locals>.<genexpr>   rV   rW   NrX   )r   r\   r   	dup_poolsrU   r`   rM   s         @r   test_https_pool_key_fieldsz*TestPoolManager.test_https_pool_key_fieldsy   s=    t,{{A6)12(+*+a/
 M!!"89!!"=>!!">?

 	,224JC(-A  %a334JKLQ223IJK 5
  
!*-
 
 	
 
 <)<<<<Fqww||~FFFFr   c                v    t               }|j                  |j                  k(  sJ |j                  t        usJ y)z?Assert each PoolManager gets a copy of ``pool_keys_by_scheme``.N)r   r   r/   s     r    test_default_pool_key_funcs_copyz0TestPoolManager.test_default_pool_key_funcs_copy   s8    M!!Q%7%7777!!)9999r   c                   dddddd}t        di |}|j                  ddd	
      g|D ]4  }d|j                  |<   j                  |j                  ddd	
             6 t	        fdt              D              sJ y)zAAssert pools are still keyed correctly with connection_from_host.rc   rd   re   rf   rg   )rh   ri   rj   rk   rl   example.comi  httpsschemenewvalc              3  \   K   | ]#  \  }}t              D ]  \  }}||k7  r||u  % y wrD   rE   )rH   rI   rJ   rK   rL   connss        r   rN   zBTestPoolManager.test_pools_keyed_with_from_host.<locals>.<genexpr>   s>      
(1!%(1Av QJ( (rP   N)r"   )r   connection_from_hostr\   r]   r^   rF   )r   ssl_kwr   kr~   s       @r   test_pools_keyed_with_from_hostz/TestPoolManager.test_pools_keyed_with_from_host   s     22(+*
 $V$''s7'KLA&.A  #LL//s7/ST   
!%(
 
 	
 
r   c                    t               }|j                  d      }|j                  d      }dt        |j                        k(  sJ ||u sJ t	        d |j                  j                         D              sJ y)z=Assert scheme case is ignored when pooling HTTPS connections.rm   zHTTPS://EXAMPLE.COM/r   c              3  <   K   | ]  }t        |t                y wrD   rR   rT   s     r   rN   zRTestPoolManager.test_https_connection_from_url_case_insensitive.<locals>.<genexpr>   rV   rW   Nr   r   r%   r-   r^   r_   r   r   rq   
other_pools       r   /test_https_connection_from_url_case_insensitivez?TestPoolManager.test_https_connection_from_url_case_insensitive   sm    M$$%;<**+AB
CL   z!!!Fqww||~FFFFr   c                    t               }|j                  dd      }|j                  dd      }dt        |j                        k(  sJ ||u sJ t	        d |j                  j                         D              sJ y)	?Assert scheme case is ignored when getting the https key class.rx   ry   rz   EXAMPLE.COMHTTPSr   c              3  <   K   | ]  }t        |t                y wrD   rR   rT   s     r   rN   zSTestPoolManager.test_https_connection_from_host_case_insensitive.<locals>.<genexpr>   rV   rW   Nr   r   r%   r-   r^   r_   r   s       r   0test_https_connection_from_host_case_insensitivez@TestPoolManager.test_https_connection_from_host_case_insensitive   su    M%%mG%D++M'+J
CL   z!!!Fqww||~FFFFr   c                   t               }dddd}dddd}|j                  |      }|j                  |      }dt        |j                        k(  sJ ||u sJ t	        d |j                  j                         D              sJ y	)
r   ry   rx   443r{   hostportr   r   r   c              3  <   K   | ]  }t        |t                y wrD   rR   rT   s     r   rN   zVTestPoolManager.test_https_connection_from_context_case_insensitive.<locals>.<genexpr>   rV   rW   Nr   connection_from_contextr%   r-   r^   r_   r   r   contextother_contextrq   r   s         r   3test_https_connection_from_context_case_insensitivezCTestPoolManager.test_https_connection_from_context_case_insensitive   s    M$mUK#*M5Q((1..}=
CL   z!!!Fqww||~FFFFr   c                    t               }|j                  d      }|j                  d      }dt        |j                        k(  sJ ||u sJ t	        d |j                  j                         D              sJ y)z<Assert scheme case is ignored when pooling HTTP connections.rB   zHTTP://EXAMPLE.COM/r   c              3  <   K   | ]  }t        |t                y wrD   rR   rT   s     r   rN   zQTestPoolManager.test_http_connection_from_url_case_insensitive.<locals>.<genexpr>   rV   rW   Nr   r   s       r   .test_http_connection_from_url_case_insensitivez>TestPoolManager.test_http_connection_from_url_case_insensitive   sm    M$$%:;**+@A
CL   z!!!Fqww||~FFFFr   c                    t               }|j                  dd      }|j                  dd      }dt        |j                        k(  sJ ||u sJ t	        d |j                  j                         D              sJ y)	r   rx   httprz   r   HTTPr   c              3  <   K   | ]  }t        |t                y wrD   rR   rT   s     r   rN   zRTestPoolManager.test_http_connection_from_host_case_insensitive.<locals>.<genexpr>   rV   rW   Nr   r   s       r   /test_http_connection_from_host_case_insensitivez?TestPoolManager.test_http_connection_from_host_case_insensitive   su    M%%mF%C++M&+I
CL   z!!!Fqww||~FFFFr   c                    d}t        d|      }|j                  d      }dt        |j                        k(  sJ t	        |t
              sJ |j                  sJ ||j                  k(  sJ y)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_fingerprintrm   r   N)r   r   r%   r-   rS   r	   r   r   )r   fingerprintr   rq   s       r   )test_assert_hostname_and_fingerprint_flagz9TestPoolManager.test_assert_hostname_and_fingerprint_flag   sn    SM$$%;<CL   $ 3444####d55555r   c                   t               }dddd}dddd}|j                  |      }|j                  |      }dt        |j                        k(  sJ ||u sJ t	        d |j                  j                         D              sJ y	)
r   r   rx   8080r   r   r   r   c              3  <   K   | ]  }t        |t                y wrD   rR   rT   s     r   rN   zUTestPoolManager.test_http_connection_from_context_case_insensitive.<locals>.<genexpr>  rV   rW   Nr   r   s         r   2test_http_connection_from_context_case_insensitivezBTestPoolManager.test_http_connection_from_context_case_insensitive   s    M#]FK#)=&Q((1..}=
CL   z!!!Fqww||~FFFFr   z4urllib3.poolmanager.PoolManager.connection_from_hostc                   t        d      |_        t               }t        j                  t
              5 }t        j                  t               5  |j                  dd       d d d        d d d        d}t              dk(  sJ t        |d   j                  t
              sJ |d   j                  j                  d   |k(  sJ y # 1 sw Y   dxY w# 1 sw Y   hxY w)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   r2   warnsDeprecationWarningr3   requestr%   rS   messageargs)r   r   r   recordsmsgs        r   test_deprecated_no_schemez)TestPoolManager.test_deprecated_no_scheme  s     ,;;V+W(M\\,-/		,A	B 0 .
= 	 7|q   '!*,,.@AAAqz!!&&q)S000 0/ .-s#   CC"CC	
CCz8urllib3.poolmanager.PoolManager.connection_from_pool_keyc                `   t               }ddddd}t        j                  t              5 }|j	                  |       d d d        d}d   }t        |j                  t              sJ |j                  j                  d   |k(  sJ |j                  \  }}|d   dddd	k(  sJ y # 1 sw Y   hxY w)
Nr   rx   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   r2   r   r   r   rS   r   Warningr   	call_args)	r   connection_from_pool_keyr   r   r   r   record_kwargss	            r   )test_connection_from_context_strict_paramz9TestPoolManager.test_connection_from_context_strict_param  s     M!	
 \\,-%%g. .: 	 &..'222~~""1%,,,,66	6'(!-
 
 	
 
 .-s   B$$B-c                   t        d      }d |j                  d<   |j                  dddi      }|j                  dddi      }|j                  ddd	d
      }dt        |j                        k(  sJ ||u sJ ||usJ y)z6Assert it is possible to define a custom key function.r!   c                    t        | d         S )NrU   )tuple)rJ   s    r   <lambda>z6TestPoolManager.test_custom_pool_key.<locals>.<lambda><  s    uQuXr   r   http://example.comrU   r`   pool_kwargsotherrL   )rU   rJ   r   N)r   r   r   r%   r-   )r   r   pool1pool2pool3s        r   test_custom_pool_keyz$TestPoolManager.test_custom_pool_key8  s    O%>6"%% ug.> & 
 %% ug.> & 
 %% gC.H & 
 CL   ~~E!!!r   c                   t               }ddd}|j                  d      }|j                  d|      }t        j                  j                  |j
                  k(  sJ |j                  rJ d|j
                  k(  sJ |j                  sJ y)z=Assert overriding pool kwargs works with connection_from_url.d   Tr>   r?   rB   r   N)r   r   r   rZ   DEFAULTr>   r?   r   r   r   default_pooloverride_pools        r   test_override_pool_kwargs_urlz-TestPoolManager.test_override_pool_kwargs_urlK  s    M"%5,,-BC--!{ . 
 {{""l&:&::::%%%%m+++++""""r   c                   t               }ddd}|j                  dd      }|j                  dd|      }t        j                  j                  |j
                  k(  sJ |j                  rJ d|j
                  k(  sJ |j                  sJ y)	z=Assert overriding pool kwargs works with connection_from_hostr   Tr   rx   r   rz   r{   r   N)r   r   r   rZ   r   r>   r?   r   s        r   test_override_pool_kwargs_hostz.TestPoolManager.test_override_pool_kwargs_host[  s    M"%5--mF-K..&k / 
 {{""l&:&::::%%%%m+++++""""r   c                F   t        g       }t        j                  t        j                  dft        j                  t        j
                  dfg}d|i}|j                  dd      }|j                  dd|      }|j                  d   g k(  sJ |j                  d   |k(  sJ y)	z=Assert passing socket options works with connection_from_host)socket_optionsr   r   rx   r   rz   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_optionsz/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                V    t        d      }|j                  ddi      }ddd|k(  sJ y)z1Assert _merge_pool_kwargs works in the happy caser   r>   new_keyr`   )r>   r   Nr   _merge_pool_kwargsr   r   mergeds      r   test_merge_pool_kwargsz&TestPoolManager.test_merge_pool_kwargs|  s4    $%%y'&:;73v===r   c                    t        d      }|j                  i       }|j                  |k(  sJ |j                  d      }|j                  |k(  sJ y)z>Assert false-y values to _merge_pool_kwargs result in defaultsr   r   Nr   r   r\   r   s      r   test_merge_pool_kwargs_nonez+TestPoolManager.test_merge_pool_kwargs_none  sT    $%%b)##v---%%d+##v---r   c                N    t        d      }|j                  ddi      }d|vsJ y)z2Assert keys can be removed with _merge_pool_kwargsr   r   r>   Nr   r   s      r   !test_merge_pool_kwargs_remove_keyz1TestPoolManager.test_merge_pool_kwargs_remove_key  s/    $%%y$&78&&&r   c                d    t        d      }|j                  ddi      }|j                  |k(  sJ y)zBAssert removing invalid keys with _merge_pool_kwargs doesn't breakr   r   invalid_keyNr   r   s      r   "test_merge_pool_kwargs_invalid_keyz2TestPoolManager.test_merge_pool_kwargs_invalid_key  s5    $%%}d&;<##v---r   c                    t               }|j                  t        d            du sJ |j                  t        d            du sJ y)zBValides we won't send a request with absolute form without a proxyr   Fzhttps://example.comN)r   !_proxy_requires_url_absolute_formr   r/   s     r   &test_pool_manager_no_url_absolute_formz6TestPoolManager.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                    t               }|j                  dd|i      }|j                  d   |k(  sJ |j                         j                  |k(  sJ y)z*Assert PoolManager sets blocksize properlyr   rA   N)r   r   r   	_get_connrA   )r   input_blocksizeexpected_blocksizer   pool_blocksizes        r   test_poolmanager_blocksizez*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                    t               }|j                  |      }|j                         }|j                          |j                  d   d   dk(  sJ y)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   r<   r   )r   create_connectionr(   r   	conn_poolr)   s         r   test_e2e_connect_to_ipv6_scopedz/TestPoolManager.test_e2e_connect_to_ipv6_scoped  sQ    & M))#.	""$ **1-a04EEEEr   z"urllib3.connection.ssl_wrap_socketc                    t               }|j                  dddi      }|j                         }|j                          |j                  d   d   dk(  sJ y )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_tlsz3TestPoolManager.test_e2e_connect_to_ipv6_scoped_tls  sc    
 M))!0A5/I * 
	 ""$((+,=>&HHHr   c                l   t        d      }|j                  d      }|j                  d      }|j                  d      }|j                  J |j                  J |j                  J |j                  }|j                         dkD  sJ ~t	        j
                          |j                         dk(  sJ y )Nr   )	num_poolszhttp://host_x:80/zhttp://host_y:80/zhttp://host_z:80r   )r   r   rq   qsizegccollect)r   pool_managerpool_1pool_2pool_3
conn_queues         r   test_thread_saftyz!TestPoolManager.test_thread_safty  s    "Q/ 112EF 112EF 112DE {{&&&{{&&&{{&&&[[
!A%%% 


 !Q&&&r   )returnNone)r(   z
str | Noner  r  )r   mock.MagicMockr  r  )r   r  r  r  )r   intr   r  r  r  )r  r   r(   strr  r  )r  r   r  r   r  r  )(__name__
__module____qualname__r   r   r*   r0   r2   markparametrizer4   r6   ra   rt   rv   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  rp   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   r  r   testr   unittestr   unittest.mockr   r   r2   urllib3r   urllib3.connectionpoolr	   urllib3.exceptionsr
   urllib3.poolmanagerr   r   r   r   urllib3.utilr   r   urllib3.util.urlr   r   rp   r   r   <module>r(     sA    " 	  &  *  ' 6 1  (  Y' Y'r   