
    De                       S SK Jr  S SKrS SK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  S SKrS SKrS SKJrJ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rSr Sr!Sr"Sr#S!S jr$S"S jr%S#S jr&S$S jr'S%S jr(  S&         S'S jjr) S(     S)S jjr* " S S5      r+ " S S\5      r, " S S\5      r- " S S \5      r.g! \ a	    SrSrSr Nzf = f)*    )annotationsN)getaddrinfo)timeout)SHORT_TIMEOUT)Mockpatch)
DEFAULT_CADEFAULT_CERTS)IPV4SocketDummyServerTestCase)socks)ConnectTimeoutErrorNewConnectionError)ssl_TF             c                    [         R                   " 5       nUR                  U S45        UR                  5       S   nUR                  5         U$ )zd
Gets a free port by opening a socket, binding it, checking the assigned
port, and then closing it.
r      )socketbindgetsocknameclose)hostsports      >platform/gsutil/third_party/urllib3/test/contrib/test_socks.py_get_free_portr   &   s=    
 	AFFD!9==?1DGGIK    c                l    SnUS:  a+  U R                  U5      nX#-  nU[        U5      -  nUS:  a  M+  U$ )z8
Read *exactly* ``amt`` bytes from the socket ``sock``.
r   r   )recvlen)sockamtdatachunks       r   _read_exactlyr'   2   sB     D
'		#s5z '
 Kr   c                ~    / n U R                  S5      nUR                  U5        X1:X  a  OM*  SR                  U5      $ )z7
Read from the socket until the character is received.
r   r   )r!   appendjoin)r#   charchunksr&   s       r   _read_untilr-   @   sC     F
		!e=	  88Fr   c                V   U R                  S5      nUS:X  a"  [        U S5      n[        R                  " U5      $ US:X  a1  [        U S5      n[        R                  " [        R
                  U5      $ US:X  a%  [        U R                  S5      5      n[        X5      $ [        SU< 35      e)z+
Returns the address from the SOCKS socket
r         r         zUnexpected addr type: )r!   r'   r   	inet_ntoa	inet_ntopAF_INET6ordRuntimeError)r#   	addr_type	ipv4_addr	ipv6_addraddr_lens        r   _address_from_socketr<   N   s     		!IG!$*		**	g	!$+	;;	g	tyy|$T,,3I=ABBr   c                d              SS jnU R                  [        R                  SU5        g )Nc                    [        XX#5      nU Vs/ s H  oUS   [        R                  :X  d  M  UPM     nnUS S $ s  snf )Nr   r   )real_getaddrinfor   AF_INET)addrr   familysocket_typegai_listgais         r   fake_getaddrinfo2_set_up_fake_getaddrinfo.<locals>.fake_getaddrinfom   sC     $DD#+H8C1v/GC8H| Is   <<r   )
rA   strr   intrB   rI   rC   rI   returnzklist[tuple[socket.AddressFamily, socket.SocketKind, int, str, tuple[str, int] | tuple[str, int, int, int]]])setattrpy_socksr   )monkeypatchrF   s     r   _set_up_fake_getaddrinforN   a   sJ    &)8;
 8HIr   c              #    #    U R                  S5      nU[        :X  d   e[        U R                  S5      5      n[        X5      nU(       a  [        U;   d   e[        [        -   nU R                  U5        U R                  S5      nUS:X  d   e[        U R                  S5      5      n	[        X	5      n
[        U R                  S5      5      n[        X5      nX*:X  a  X<:X  a  U R                  S5        OLU R                  S5        U R                  5         g[        U;   d   e[        [        -   nU R                  U5        U R                  S5      nU R                  S5      nU R                  S5      n[        U 5      n[        U S5      n[        USS 5      S-  [        USS 5      -   nU[        :X  d   eUS:X  d   eUS	:X  d   eUU4v nU(       a
  [        S
-   nO	[        S-   nU R                  U5        g7f)z
Handle the SOCKS5 handshake.

Returns a generator object that allows us to break the handshake into
steps so that the test code can intervene at certain useful points.
r   r/   s    s   N   r      r   s	       `)	r!   SOCKS_VERSION_SOCKS5r6   r'   SOCKS_NEGOTIATION_PASSWORDsendallr   SOCKS_NEGOTIATION_NONEr<   )r#   	negotiateusernamepasswordreceived_versionnmethodsmethods	send_datanegotiation_versionulenprovided_usernameplenprovided_passwordcommandreservedrA   port_rawr   succeedresponses                       r   handle_socks5_negotiationrg      s     yy|3333499Q< HD+G)W444(+EE	Y #iil"g---499Q< )$5499Q< )$5(X-JLL%LL%JJL%000(+AA	Y yy|iilGyy|H%DT1%H1!#HQqM(:;D 3333gw $JG'*QQ (*4LLs   G7G9c              #    #    U R                  S5      nU R                  S5      n[        U S5      n[        USS 5      S-  [        USS 5      -   n[        U S5      n[        U S5      SS nUS	:X  a  [        U S5      SS nO[        R
                  " U5      nU[        :X  d   eUS
:X  d   eUb'  X:w  a"  U R                  S5        U R                  5         gX4v n	U	(       a  Sn
OSn
U R                  U
5        g7f)z
Handle the SOCKS4 handshake.

Returns a generator object that allows us to break the handshake into
steps so that the test code can intervene at certain useful points.
r   rP   r   rQ   r0   r   Ns      r/   s    ]      s    Z`  s    [      )	r!   r'   r6   r-   r   r3   SOCKS_VERSION_SOCKS4rT   r   )r#   rW   rY   rb   rd   r   addr_rawr_   rA   re   rf   s              r   handle_socks4_negotiationrl      s	     yy|iilGT1%H1!#HQqM(:;DT1%H#D'23B7 &&4)#2.) 3333g =89

 JG66LLs   C7C9c                      \ rS rSrSS jrSrg)TestSOCKSProxyManager   c                    [         R                  " [        SS9   [        R                  " SS9  S S S 5        g ! , (       d  f       g = f)Nz!Unable to determine SOCKS versionmatchzhttp://example.org)	proxy_url)pytestraises
ValueErrorr   SOCKSProxyManager)selfs    r   (test_invalid_socks_version_is_valueerror>TestSOCKSProxyManager.test_invalid_socks_version_is_valueerror   s-    ]]:-PQ##.BC RQQs	   8
A NrJ   None)__name__
__module____qualname____firstlineno__ry   __static_attributes__r{   r   r   rn   rn      s    Dr   rn   c                      \ rS rSrS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S	 jrSS
 jrSS jrSS jrSS jrSS jrSrg)TestSocks5Proxy   z&
Test the SOCKS proxy in SOCKS5 mode.
c                `   S
S jnU R                  U5        SU R                   SU R                   3n[        R                  " U5       nUR                  SS5      nUR                  S:X  d   eUR                  S:X  d   eUR                  S   S	:X  d   e S S S 5        g ! , (       d  f       g = f)Nc                   U R                  5       S   n[        USS9n[        U5      u  p4US:X  d   eUS:X  d   e[        R                  " [
        5         UR                  S5        S S S 5         UR                  S5      nUR                  S5      (       a  OM*  UR                  S	5        UR                  5         g ! , (       d  f       N[= f)
Nr   FrV   16.17.18.19P   T     

?   HTTP/1.1 200 OK
Server: SocksTestServer
Content-Length: 0

acceptrg   nextrt   ru   StopIterationsendr!   endswithrT   r   listenerr#   handlerrA   r   bufs         r   request_handler;TestSocks5Proxy.test_basic_request.<locals>.request_handler   s    ??$Q'D/FGgJD=(((2::}-T" . ii&<<,, 
 LL JJL .-   B<<
C
	socks5://:GEThttp://16.17.18.19   r   ServerSocksTestServerr   socket.socketrJ   r}   	_start_serverr   r   r   rw   requeststatusr%   headersrx   r   rs   pmrf   s        r   test_basic_request"TestSocks5Proxy.test_basic_request   s    	0 	?+		{!DII;7	$$Y/2zz%)=>H??c)))==C'''##H-1BBBB 0//   	AB
B-c                `   S
S jnU R                  U5        SU R                   SU R                   3n[        R                  " U5       nUR                  SS5      nUR                  S:X  d   eUR                  S:X  d   eUR                  S   S	:X  d   e S S S 5        g ! , (       d  f       g = f)Nc                   U R                  5       S   n[        USS9n[        U5      u  p4US;   d   eUS:X  d   e[        R                  " [
        5         UR                  S5        S S S 5         UR                  S5      nUR                  S5      (       a  OM*  UR                  S	5        UR                  5         g ! , (       d  f       N[= f)
Nr   Fr   )	127.0.0.1z::1r   Tr   r   r   r   r   s         r   r   7TestSocks5Proxy.test_local_dns.<locals>.request_handler  s    ??$Q'D/FGgJD////2::}-T" . ii&<<,, 
 LL JJL .-r   r   r   r   http://localhostr   r   r   r   r   r   r   s        r   test_local_dnsTestSocks5Proxy.test_local_dns  s    	0 	?+		{!DII;7	$$Y/2zz%);<H??c)))==C'''##H-1BBBB 0//r   c                   SS jnU R                  U5        SU R                   SU R                   3n[        R                  " U5       nUR                  SS5      nUR                  S:X  d   e S S S 5        g ! , (       d  f       g = f)Nc                   U R                  5       S   n[        USS9n[        U5      u  p4US:X  d   eUS:X  d   e[        R                  " [
        5         UR                  S5        S S S 5        Sn XQR                  S5      -  nUR                  S	5      (       a  OM,  UR                  S
5      (       d   eSU;   d   eUR                  S5        UR                  5         g ! , (       d  f       N= f)Nr   Fr      example.comr   Tr   r   r      GET / HTTP/1.1   Host: example.comr   )r   rg   r   rt   ru   r   r   r!   r   
startswithrT   r   r   s         r   r   ATestSocks5Proxy.test_correct_header_line.<locals>.request_handler=  s    ??$Q'D/FGgJD>)))2::}-T" . Cyy''<<,, 
 >>"34444'3...LL JJL% .-s   C  
C.
socks5h://r   r   http://example.comr   r   r   r   r   r   rw   r   r   r   s        r   test_correct_header_line(TestSocks5Proxy.test_correct_header_line<  p    	8 	?+ 1TYYK8	$$Y/2zz%)=>H??c))) 0//   	%A88
Bc           	       ^ [         R                  " 5       mSU4S jjnU R                  U5        SU R                   SU R                   3n[
        R                  " U5       n[        R                  " [        5         UR                  SS[        SS9  S S S 5        TR                  5         S S S 5        g ! , (       d  f       N'= f! , (       d  f       g = f)	Nc                &   > TR                  5         g N)waitr   events    r   r   ATestSocks5Proxy.test_connection_timeouts.<locals>.request_handlerb  s    JJLr   r   r   r   r   F)r   retriesr   )	threadingEventr   r   r   r   rw   rt   ru   r   r   r   setrx   r   rs   r   r   s       @r   test_connection_timeouts(TestSocks5Proxy.test_connection_timeouts_  s    !	 	?+ 1TYYK8	$$Y/223

/PU   4 IIK 0/33 0/s$   "C=B5C5
C	?C
Czsocks.create_connectionc                B   [        5       Ul        SU R                   SU R                   3n[        R
                  " U5       n[        R                  " [        SS9   UR                  SSSS9  S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)	Nr   r   z	timed outrq   r   r   Fr   )
SocketTimeoutside_effectr   r   r   rw   rt   ru   r   r   )rx   create_connectionrs   r   s       r   test_socket_timeout#TestSocks5Proxy.test_socket_timeoutn  sw    (5% 1TYYK8	$$Y/22+F

5"6
F G 0/FF 0/s$   BA?.B?
B		B
Bc                  ^ [         R                  " 5       mSU4S jjnU R                  U5        SU R                   SU R                   3n[
        R                  " U5       nTR                  5         [        R                  " [        5         UR                  SSSS9  S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)	Nc                F   > U R                  5         TR                  5         g r   )r   r   r   s    r   r   @TestSocks5Proxy.test_connection_failure.<locals>.request_handlery  s    NNIIKr   r   r   r   r   Fr   r   )r   r   r   r   r   r   rw   r   rt   ru   r   r   r   s       @r   test_connection_failure'TestSocks5Proxy.test_connection_failurev  s    !	 	?+ 1TYYK8	$$Y/2JJL12

5"6
F 3 0/22 0/s$   "+CB0C0
B>	:C
Cc                  ^ [        U5        [        R                  " 5       mSU4S jjnU R                  U5        SU R                   SU R
                   3n[        R                  " U5       n[        R                  " [        5         UR                  SSSS9  S S S 5        TR                  5         S S S 5        g ! , (       d  f       N'= f! , (       d  f       g = f)	Nc                $  > U R                  5       S   n[        USS9n[        U5      u  p4[        R                  " [
        5         UR                  S5        S S S 5        TR                  5         UR                  5         g ! , (       d  f       N/= f)Nr   Fr   )	r   rg   r   rt   ru   r   r   r   r   r   r#   r   rA   r   evts        r   r   =TestSocks5Proxy.test_proxy_rejection.<locals>.request_handler  se    ??$Q'D/FGgJD}-U# . HHJJJL	 .-s   B
Br   r   r   r   Fr   r   rN   r   r   r   r   r   r   rw   rt   ru   r   r   r   rx   rM   r   rs   r   r   s        @r   test_proxy_rejection$TestSocks5Proxy.test_proxy_rejection       -oo		 	?+ 1TYYK8	$$Y/212

5"6
F 3GGI 0/22 0/$   -CB;C;
C		C
Cc                `   SS jnU R                  U5        SU R                   SU R                   3n[        R                  " USSS9 nUR                  SS5      nUR                  S	:X  d   eUR                  S
:X  d   eUR                  S   S:X  d   e S S S 5        g ! , (       d  f       g = f)Nc                   U R                  5       S   n[        USSSS9n[        U5      u  p4US:X  d   eUS:X  d   e[        R                  " [
        5         UR                  S5        S S S 5         UR                  S5      nUR                  S	5      (       a  OM*  UR                  S
5        UR                  5         g ! , (       d  f       N[= fNr   T   user   passrV   rW   rX   r   r   r   r   r   r   r   s         r   r   ATestSocks5Proxy.test_socks_with_password.<locals>.request_handler      ??$Q'D/wG gJD=(((2::}-T" . ii&<<,, 
 LL JJL .-   B>>
Cr   r   userpassrW   rX   r   r   r   r   r   r   r   r   r   s        r   test_socks_with_password(TestSocks5Proxy.test_socks_with_password  s    	4 	?+		{!DII;7	$$Y&QUWzz%)=>H??c)))==C'''##H-1BBBB RQQr   c                `   SS jnU R                  U5        SU R                   SU R                   3n[        R                  " U5       nUR                  SS5      nUR                  S:X  d   eUR                  S:X  d   eUR                  S   S	:X  d   e S
S
S
5        g
! , (       d  f       g
= f)zj
Test when we have auth info in url, i.e.
socks5://user:pass@host:port and no username/password as params
c                   U R                  5       S   n[        USSSS9n[        U5      u  p4US:X  d   eUS:X  d   e[        R                  " [
        5         UR                  S5        S S S 5         UR                  S5      nUR                  S	5      (       a  OM*  UR                  S
5        UR                  5         g ! , (       d  f       N[= fr   r   r   s         r   r   DTestSocks5Proxy.test_socks_with_auth_in_url.<locals>.request_handler  r   r   zsocks5://user:pass@r   r   r   r   r   r   r   Nr   r   r   s        r   test_socks_with_auth_in_url+TestSocks5Proxy.test_socks_with_auth_in_url  s    	4 	?+)$))Adii[A	$$Y/2zz%)=>H??c)))==C'''##H-1BBBB 0//r   c                f   [        U5        SS jnU R                  U5        SU R                   SU R                   3n[        R
                  " USSS9 n[        R                  " [        SS9   UR                  S	S
SS9  S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nc                    U R                  5       S   n[        USSSS9n[        R                  " [        5         [        U5        S S S 5        g ! , (       d  f       g = f)Nr   Tr   r   r   )r   rg   rt   ru   r   r   r   r#   r   s      r   r   ITestSocks5Proxy.test_socks_with_invalid_password.<locals>.request_handler  sG    ??$Q'D/wG }-W .--s   A
Ar   r   r   badpassr   zSOCKS5 authentication failedrq   r   r   Fr   r   )
rN   r   r   r   r   rw   rt   ru   r   r   )rx   rM   r   rs   r   s        r    test_socks_with_invalid_password0TestSocks5Proxy.test_socks_with_invalid_password  s     -	 	?+ 1TYYK8	$$
"*H 

5"6
F
 
 
 
s$   B".B B"
B	B""
B0c                F  ^ [        U R                  5      mS	U4S jjnU R                  U5        SU R                   SU R                   3n[        R
                  " UST4S9 nUR                  SS5      nUR                  S:X  d   e S S S 5        g ! , (       d  f       g = f)
Nc                   > U R                  5       S   nUR                  5       S   S:X  d   eUR                  5       S   T:X  d   e[        USS9n[        U5      u  p4US:X  d   eUS:X  d   e[        R
                  " [        5         UR                  S5        S S S 5         UR                  S	5      nUR                  S
5      (       a  OM*  UR                  S5        UR                  5         g ! , (       d  f       N[= f)Nr   r   r   Fr   r   r   Tr   r   r   )r   getpeernamerg   r   rt   ru   r   r   r!   r   rT   r   )r   r#   r   rA   r   r   expected_ports         r   r   BTestSocks5Proxy.test_source_address_works.<locals>.request_handler   s    ??$Q'D##%a(K777##%a(M999/FGgJD=(((2::}-T" . ii&<<,, 
 LL JJL .-s   C//
C=r   r   r   )source_addressr   r   r   r   )r   r   r   r   r   rw   r   r   )rx   r   rs   r   rf   r  s        @r   test_source_address_works)TestSocks5Proxy.test_source_address_works  s    &tyy1	4 	?+		{!DII;7	$${M&B
zz%)=>H??c)))	
 
 
s   #%B
B r{   Nr|   )r   r   rJ   r}   rM   zpytest.MonkeyPatchrJ   r}   )r~   r   r   r   __doc__r   r   r   r   r   r   r   r   r   r   r   r  r   r{   r   r   r   r      s`     CD CD!*F $%G &GG,"CH'CRG,#*r   r   c                  T    \ rS rSrS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	rg
)TestSOCKS4Proxyi#  z
Test the SOCKS proxy in SOCKS4 mode.

Has relatively fewer tests than the SOCKS5 case, mostly because once the
negotiation is done the two cases behave identically.
c                `   S
S jnU R                  U5        SU R                   SU R                   3n[        R                  " U5       nUR                  SS5      nUR                  S:X  d   eUR                  S   S:X  d   eUR                  S	:X  d   e S S S 5        g ! , (       d  f       g = f)Nc                   U R                  5       S   n[        U5      n[        U5      u  p4US:X  d   eUS:X  d   e[        R                  " [
        5         UR                  S5        S S S 5         UR                  S5      nUR                  S5      (       a  OM*  UR                  S5        UR                  5         g ! , (       d  f       N[= f)Nr   r   r   Tr   r   r   r   rl   r   rt   ru   r   r   r!   r   rT   r   r   s         r   r   ;TestSOCKS4Proxy.test_basic_request.<locals>.request_handler,  s    ??$Q'D/5GgJD=(((2::}-T" . ii&<<,, 
 LL JJL .-   B==
C	socks4://r   r   r   r   r   r   r   r   	r   r   r   r   rw   r   r   r   r%   r   s        r   r   "TestSOCKS4Proxy.test_basic_request+  s    	0 	?+		{!DII;7	$$Y/2zz%)=>H??c)))##H-1BBBB==C''' 0//r   c                `   S
S jnU R                  U5        SU R                   SU R                   3n[        R                  " U5       nUR                  SS5      nUR                  S:X  d   eUR                  S   S:X  d   eUR                  S	:X  d   e S S S 5        g ! , (       d  f       g = f)Nc                   U R                  5       S   n[        U5      n[        U5      u  p4US:X  d   eUS:X  d   e[        R                  " [
        5         UR                  S5        S S S 5         UR                  S5      nUR                  S5      (       a  OM*  UR                  S5        UR                  5         g ! , (       d  f       N[= f)Nr   r   r   Tr   r   r   r  r   s         r   r   7TestSOCKS4Proxy.test_local_dns.<locals>.request_handlerN  s    ??$Q'D/5GgJD;&&&2::}-T" . ii&<<,, 
 LL JJL .-r  r  r   r   r   r   r   r   r   r   r  r   s        r   r   TestSOCKS4Proxy.test_local_dnsM  s    	0 	?+		{!DII;7	$$Y/2zz%);<H??c)))##H-1BBBB==C''' 0//r   c                   SS jnU R                  U5        SU R                   SU R                   3n[        R                  " U5       nUR                  SS5      nUR                  S:X  d   e S S S 5        g ! , (       d  f       g = f)Nc                   U R                  5       S   n[        U5      n[        U5      u  p4US:X  d   eUS:X  d   e[        R                  " [
        5         UR                  S5        S S S 5        Sn XQR                  S5      -  nUR                  S5      (       a  OM,  UR                  S5      (       d   eS	U;   d   eUR                  S
5        UR                  5         g ! , (       d  f       N= f)Nr   r   r   Tr   r   r   r   r   r   )r   rl   r   rt   ru   r   r   r!   r   r   rT   r   r   s         r   r   ATestSOCKS4Proxy.test_correct_header_line.<locals>.request_handlerp  s    ??$Q'D/5GgJD>)))2::}-T" . Cyy''<<,, 
 >>"34444'3...LL JJL% .-s   C!!
C/
socks4a://r   r   r   r   r   r   r   s        r   r   (TestSOCKS4Proxy.test_correct_header_lineo  r   r   c                  ^ [        U5        [        R                  " 5       mSU4S jjnU R                  U5        SU R                   SU R
                   3n[        R                  " U5       n[        R                  " [        5         UR                  SSSS9  S S S 5        TR                  5         S S S 5        g ! , (       d  f       N'= f! , (       d  f       g = f)	Nc                &  > U R                  5       S   n[        U5      n[        U5      u  p4[        R                  " [
        5         UR                  S5        S S S 5        TR                  5         UR                  5         g ! , (       d  f       N/= f)Nr   F)	r   rl   r   rt   ru   r   r   r   r   r   s        r   r   =TestSOCKS4Proxy.test_proxy_rejection.<locals>.request_handler  sc    ??$Q'D/5GgJD}-U# . HHJJJL	 .-s   B
Br  r   r   r   Fr   r   r   r   s        @r   r   $TestSOCKS4Proxy.test_proxy_rejection  r   r   c                ^   SS jnU R                  U5        SU R                   SU R                   3n[        R                  " USS9 nUR                  SS5      nUR                  S:X  d   eUR                  S	:X  d   eUR                  S
   S:X  d   e S S S 5        g ! , (       d  f       g = f)Nc                   U R                  5       S   n[        USS9n[        U5      u  p4US:X  d   eUS:X  d   e[        R                  " [
        5         UR                  S5        S S S 5         UR                  S5      nUR                  S5      (       a  OM*  UR                  S	5        UR                  5         g ! , (       d  f       N[= f)
Nr   r   rW   r   r   Tr   r   r   r  r   s         r   r   BTestSOCKS4Proxy.test_socks4_with_username.<locals>.request_handler  s    ??$Q'D/wGGgJD=(((2::}-T" . ii&<<,, 
 LL JJL .-r   r  r   r   r%  r   r   r   r   r   r   r   r   r   s        r   test_socks4_with_username)TestSOCKS4Proxy.test_socks4_with_username  s    	0 	?+		{!DII;7	$$Y@Bzz%)=>H??c)))==C'''##H-1BBBB A@@s   AB
B,c                N   SS jnU R                  U5        SU R                   SU R                   3n[        R                  " USS9 n[
        R                  " [        SS9   UR                  SS	S
S9  S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nc                V    U R                  5       S   n[        USS9n[        US 5        g )Nr   r   r%  )r   rl   r   r   s      r   r   ITestSOCKS4Proxy.test_socks_with_invalid_username.<locals>.request_handler  s)    ??$Q'D/wGG$r   r  r   baduserr%  zdifferent user-idsrq   r   r   Fr   r   )	r   r   r   r   rw   rt   ru   r   r   )rx   r   rs   r   s       r    test_socks_with_invalid_username0TestSOCKS4Proxy.test_socks_with_invalid_username  s    	  	?+ 1TYYK8	$$YCr19MN

5"6
F O DCNN DCs$   B"B4B
B	B
B$r{   Nr|   r
  )r~   r   r   r   r  r   r   r   r   r'  r-  r   r{   r   r   r  r  #  s+     (D (D!*F, CDGr   r  c                  f    \ rS rSrSr\R                  R                  \(       + SS9SS j5       r	Sr
g)	TestSOCKSWithTLSi  z3
Test that TLS behaves properly for SOCKS proxies.
zNo TLS available)reasonc                f   SS jnU R                  U5        SU R                   SU R                   3n[        R                  " U[
        S9 nUR                  SS5      nUR                  S:X  d   eUR                  S:X  d   eUR                  S	   S
:X  d   e S S S 5        g ! , (       d  f       g = f)Nc                   U R                  5       S   n[        USS9n[        U5      u  p4US:X  d   eUS:X  d   e[        R                  " [
        5         UR                  S5        S S S 5        [        R                  " [        R                  5      nUR                  [        S   [        S   5        UR                  USS	9nS
n XvR                  S5      -  nUR                  S5      (       a  OM,  UR!                  S5      (       d   eUR#                  S5        UR%                  5         UR%                  5         g ! , (       d  f       N= f)Nr   Fr   s	   localhosti  Tcertfilekeyfile)server_sider   r   r   s   GET / HTTP/1.1
r   )r   rg   r   rt   ru   r   r   
better_ssl
SSLContextsslPROTOCOL_SSLv23load_cert_chainr
   wrap_socketr!   r   r   rT   r   )r   r#   r   rA   r   contexttlsr   s           r   r   <TestSOCKSWithTLS.test_basic_request.<locals>.request_handler  s   ??$Q'D/FGgJD<'''3;;}-T" . !++C,?,?@G##M*$=}Y?WX%%d%=CCxx&<<,, 
 >>"78888KK IIKJJL/ .-s   D<<
E
r   r   )ca_certsr   zhttps://localhostr   r   r   r   r   )
r   r   r   r   rw   r	   r   r   r%   r   r   s        r   r   #TestSOCKSWithTLS.test_basic_request  s    	B 	?+ 1TYYK8	$$YDzz%)<=H??c)))==C'''##H-1BBBB EDDs   AB""
B0r{   Nr|   )r~   r   r   r   r  rt   markskipifHAS_SSLr   r   r{   r   r   r0  r0    s5     [[G,>?)C @)Cr   r0  )r   rH   rJ   rI   )r#   r   r$   rI   rJ   bytes)r#   r   r+   rE  rJ   rE  )r#   r   rJ   zbytes | strr
  )NN)
r#   r   rV   boolrW   bytes | NonerX   rG  rJ   5typing.Generator[tuple[bytes | str, int], bool, None]r   )r#   r   rW   rG  rJ   rH  )/
__future__r   r   r   typingr   r?   r   r   testr   unittest.mockr   r   rt   r   rL   dummyserver.socketserverr	   r
   dummyserver.testcaser   urllib3.contriburllib3.exceptionsr   r   r9  urllib3.utilr   r7  rD  ImportErrorrU   rS   rj   rR   r   r'   r-   r<   rN   rg   rl   rn   r   r  r0  r{   r   r   <module>rS     s8   "    2 +  %   > > ! F	/G ! $   	C&JB "!	@
@@ @ 	@
 ;@H 37(
(#/(:(VD Dm*3 m*`	rG3 rGj/C4 /C  
CJGs   C
 
CC