
    De                       d dl mZ d dlZd dl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 d dlZd dlZd dlmZm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ZdZ dZ!dZ"dZ#d!dZ$d"dZ%d#dZ&d$dZ'd%dZ(	 	 d&	 	 	 	 	 	 	 	 	 d'dZ)	 d(	 	 	 	 	 d)dZ* G d d      Z+ G d de      Z, G d de      Z- G d d e      Z.y# e$ r	 dZdZdZY pw xY w)*    )annotationsN)getaddrinfo)timeout)SHORT_TIMEOUT)Mockpatch)
DEFAULT_CADEFAULT_CERTS)IPV4SocketDummyServerTestCase)socks)ConnectTimeoutErrorNewConnectionError)ssl_TF             c                    t        j                          }|j                  | df       |j                         d   }|j                          |S )zp
    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                h    d}|dkD  r*| j                  |      }||z  }|t        |      z  }|dkD  r*|S )z@
    Read *exactly* ``amt`` bytes from the socket ``sock``.
    r   r   )recvlen)sockamtdatachunks       r   _read_exactlyr'   2   sD     D
'		#s5z '
 Kr   c                |    g }	 | j                  d      }|j                  |       ||k(  rn)dj                  |      S )z?
    Read from the socket until the character is received.
    r   r   )r!   appendjoin)r#   charchunksr&   s       r   _read_untilr-   @   sE     F
		!eD=	  88Fr   c                L   | j                  d      }|dk(  r!t        | d      }t        j                  |      S |dk(  r0t        | d      }t        j                  t        j
                  |      S |dk(  r&t        | j                  d            }t        | |      S t        d|      )z3
    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|$T8,,3I=ABBr   c                b    	 	 	 	 	 	 	 	 	 	 dd}| j                  t        j                  d|       y )Nc                ~    t        | |||      }|D cg c]  }|d   t        j                  k(  s| }}|d d S c c}w )Nr   r   )real_getaddrinfor   AF_INET)addrr   familysocket_typegai_listgais         r   fake_getaddrinfoz2_set_up_fake_getaddrinfo.<locals>.fake_getaddrinfom   sI     $D$D#+H8Cs1v/GC8H| Is   ::r   )
rA   strr   intrB   rH   rC   rH   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_getaddrinforM   a   sJ    &)8;
 8HIr   c              #    K   | j                  d      }|t        k(  sJ t        | j                  d            }t        | |      }|rt        |v sJ t        t        z   }| j                  |       | j                  d      }|dk(  sJ t        | j                  d            }	t        | |	      }
t        | j                  d            }t        | |      }||
k(  r||k(  r| j                  d       nJ| j                  d       | j                          yt        |v sJ t        t        z   }| j                  |       | j                  d      }| j                  d      }| j                  d      }t        |       }t        | d      }t        |dd       dz  t        |dd       z   }|t        k(  sJ |dk(  sJ |d	k(  sJ ||f}|r
t        d
z   }n	t        dz   }| j                  |       yw)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_negotiationrf      s     yy|3333499Q< HD(+G)W444(+EE	Y #iil"g---499Q< )$5499Q< )$5((X9J-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   G'G)c              #    K   | j                  d      }| j                  d      }t        | d      }t        |dd       dz  t        |dd       z   }t        | d      }t        | d      dd }|d	k(  rt        | d      dd }nt	        j
                  |      }|t        k(  sJ |d
k(  sJ |'||k7  r"| j                  d       | j                          y||f}	|	rd}
nd}
| j                  |
       yw)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   rO   r   rP   r0   r   Ns      r/   s    ]      s    Z`  s    [      )	r!   r'   r6   r-   r   r3   SOCKS_VERSION_SOCKS4rS   r   )r#   rV   rX   ra   rc   r   addr_rawr^   rA   rd   re   s              r   handle_socks4_negotiationrk      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   C.C0c                      e Zd ZddZy)TestSOCKSProxyManagerc                    t        j                  t        d      5  t        j                  d       d d d        y # 1 sw Y   y xY w)Nz!Unable to determine SOCKS versionmatchzhttp://example.org)	proxy_url)pytestraises
ValueErrorr   SOCKSProxyManager)selfs    r   (test_invalid_socks_version_is_valueerrorz>TestSOCKSProxyManager.test_invalid_socks_version_is_valueerror   s-    ]]:-PQ##.BC RQQs	   <ANrI   None)__name__
__module____qualname__rw    r   r   rm   rm      s    Dr   rm   c                  ~    e Zd ZdZddZddZddZ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y)TestSocks5Proxyz.
    Test the SOCKS proxy in SOCKS5 mode.
    c                L   d
d}| j                  |       d| j                   d| j                   }t        j                  |      5 }|j                  dd      }|j                  dk(  sJ |j                  dk(  sJ |j                  d   d	k(  sJ 	 d d d        y # 1 sw Y   y xY w)Nc                   | j                         d   }t        |d      }t        |      \  }}|dk(  sJ |dk(  sJ t        j                  t
              5  |j                  d       d d d        	 |j                  d      }|j                  d      rn$|j                  d	       |j                          y # 1 sw Y   PxY w)
Nr   FrU   16.17.18.19P   T     

?   HTTP/1.1 200 OK
Server: SocksTestServer
Content-Length: 0

acceptrf   nextrr   rs   StopIterationsendr!   endswithrS   r   listenerr#   handlerrA   r   bufs         r   request_handlerz;TestSocks5Proxy.test_basic_request.<locals>.request_handler   s    ??$Q'D/FGgJD$=(((2::}-T" . ii&<<, 
 LL JJL .-   B77C 	socks5://:GEThttp://16.17.18.19   r   ServerSocksTestServerr   socket.socketrI   ry   	_start_serverr   r   r   ru   requeststatusr%   headersrv   r   rq   pmre   s        r   test_basic_requestz"TestSocks5Proxy.test_basic_request   s    	0 	?+		{!DII;7	$$Y/2zz%)=>H??c)))==C'''##H-1BBBB 0//   A	BB#c                L   d
d}| j                  |       d| j                   d| j                   }t        j                  |      5 }|j                  dd      }|j                  dk(  sJ |j                  dk(  sJ |j                  d   d	k(  sJ 	 d d d        y # 1 sw Y   y xY w)Nc                   | j                         d   }t        |d      }t        |      \  }}|dv sJ |dk(  sJ t        j                  t
              5  |j                  d       d d d        	 |j                  d      }|j                  d      rn$|j                  d	       |j                          y # 1 sw Y   PxY w)
Nr   Fr   )	127.0.0.1z::1r   Tr   r   r   r   r   s         r   r   z7TestSocks5Proxy.test_local_dns.<locals>.request_handler  s    ??$Q'D/FGgJD$////2::}-T" . ii&<<, 
 LL JJL .-s   B66B?r   r   r   http://localhostr   r   r   r   r   r   r   s        r   test_local_dnszTestSocks5Proxy.test_local_dns  s    	0 	?+		{!DII;7	$$Y/2zz%);<H??c)))==C'''##H-1BBBB 0//r   c                   dd}| j                  |       d| j                   d| j                   }t        j                  |      5 }|j                  dd      }|j                  dk(  sJ 	 d d d        y # 1 sw Y   y xY w)Nc                   | j                         d   }t        |d      }t        |      \  }}|dk(  sJ |dk(  sJ t        j                  t
              5  |j                  d       d d d        d}	 ||j                  d      z  }|j                  d	      rn'|j                  d
      sJ d|v sJ |j                  d       |j                          y # 1 sw Y   nxY w)Nr   Fr      example.comr   Tr   r   r      GET / HTTP/1.1   Host: example.comr   )r   rf   r   rr   rs   r   r   r!   r   
startswithrS   r   r   s         r   r   zATestSocks5Proxy.test_correct_header_line.<locals>.request_handler=  s    ??$Q'D/FGgJD$>)))2::}-T" . Ctyy''<<, 
 >>"3444'3...LL JJL% .-s   CC
socks5h://r   r   http://example.comr   r   r   r   r   r   ru   r   r   r   s        r   test_correct_header_linez(TestSocks5Proxy.test_correct_header_line<  p    	8 	?+ 1TYYK8	$$Y/2zz%)=>H??c))) 0//   $A55A>c                   t        j                         dfd}| j                  |       d| j                   d| j                   }t        j                  |      5 }t        j                  t              5  |j                  ddt        d       d d d        j                          d d d        y # 1 sw Y   "xY w# 1 sw Y   y xY w)	Nc                &    j                          y N)waitr   events    r   r   zATestSocks5Proxy.test_connection_timeouts.<locals>.request_handlerb  s    JJLr   r   r   r   r   F)r   retriesr   )	threadingEventr   r   r   r   ru   rr   rs   r   r   r   setrv   r   rq   r   r   s       @r   test_connection_timeoutsz(TestSocks5Proxy.test_connection_timeouts_  s    !	 	?+ 1TYYK8	$$Y/223

/PU   4 IIK 0/33 0/s$   B?8B3B?3B<	8B??Czsocks.create_connectionc                6   t               |_        d| j                   d| j                   }t	        j
                  |      5 }t        j                  t        d      5  |j                  ddd       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)	Nr   r   z	timed outro   r   r   Fr   )
SocketTimeoutside_effectr   r   r   ru   rr   rs   r   r   )rv   create_connectionrq   r   s       r   test_socket_timeoutz#TestSocks5Proxy.test_socket_timeoutn  sw    (5% 1TYYK8	$$Y/22+F

5"6
F G 0/FF 0/s$   BB2BB	BBc                   t        j                         dfd}| j                  |       d| j                   d| j                   }t        j                  |      5 }j                          t        j                  t              5  |j                  ddd       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)	Nc                F    | j                          j                          y r   )r   r   r   s    r   r   z@TestSocks5Proxy.test_connection_failure.<locals>.request_handlery  s    NNIIKr   r   r   r   r   Fr   r   )r   r   r   r   r   r   ru   r   rr   rs   r   r   r   s       @r   test_connection_failurez'TestSocks5Proxy.test_connection_failurev  s    !	 	?+ 1TYYK8	$$Y/2JJL12

5"6
F 3 0/22 0/s$   *B:B.B:.B7	3B::Cc                   t        |       t        j                         dfd}| j                  |       d| j                   d| j
                   }t        j                  |      5 }t        j                  t              5  |j                  ddd       d d d        j                          d d d        y # 1 sw Y   "xY w# 1 sw Y   y xY w)	Nc                    | j                         d   }t        |d      }t        |      \  }}t        j                  t
              5  |j                  d       d d d        j                          |j                          y # 1 sw Y   *xY w)Nr   Fr   )	r   rf   r   rr   rs   r   r   r   r   r   r#   r   rA   r   evts        r   r   z=TestSocks5Proxy.test_proxy_rejection.<locals>.request_handler  sg    ??$Q'D/FGgJD$}-U# . HHJJJL	 .-s   	BBr   r   r   r   Fr   r   rM   r   r   r   r   r   r   ru   rr   rs   r   r   r   rv   rL   r   rq   r   r   s        @r   test_proxy_rejectionz$TestSocks5Proxy.test_proxy_rejection       -oo		 	?+ 1TYYK8	$$Y/212

5"6
F 3GGI 0/22 0/$   )CB9C9C	>CCc                R   dd}| j                  |       d| j                   d| j                   }t        j                  |dd      5 }|j                  dd      }|j                  d	k(  sJ |j                  d
k(  sJ |j                  d   dk(  sJ 	 d d d        y # 1 sw Y   y xY w)Nc                   | j                         d   }t        |ddd      }t        |      \  }}|dk(  sJ |dk(  sJ t        j                  t
              5  |j                  d       d d d        	 |j                  d      }|j                  d	      rn$|j                  d
       |j                          y # 1 sw Y   PxY wNr   T   user   passrU   rV   rW   r   r   r   r   r   r   r   s         r   r   zATestSocks5Proxy.test_socks_with_password.<locals>.request_handler      ??$Q'D/wG gJD$=(((2::}-T" . ii&<<, 
 LL JJL .-   B99Cr   r   userpassrV   rW   r   r   r   r   r   r   r   r   r   s        r   test_socks_with_passwordz(TestSocks5Proxy.test_socks_with_password  s    	4 	?+		{!DII;7	$$Y&QUWzz%)=>H??c)))==C'''##H-1BBBB RQQs   
A	BB&c                L   dd}| j                  |       d| j                   d| j                   }t        j                  |      5 }|j                  dd      }|j                  dk(  sJ |j                  dk(  sJ |j                  d   d	k(  sJ 	 d
d
d
       y
# 1 sw Y   y
xY w)z
        Test when we have auth info in url, i.e.
        socks5://user:pass@host:port and no username/password as params
        c                   | j                         d   }t        |ddd      }t        |      \  }}|dk(  sJ |dk(  sJ t        j                  t
              5  |j                  d       d d d        	 |j                  d      }|j                  d	      rn$|j                  d
       |j                          y # 1 sw Y   PxY wr   r   r   s         r   r   zDTestSocks5Proxy.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_urlz+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                ^   t        |       dd}| j                  |       d| j                   d| j                   }t	        j
                  |dd      5 }t        j                  t        d      5  |j                  d	d
d       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nc                    | j                         d   }t        |ddd      }t        j                  t              5  t        |       d d d        y # 1 sw Y   y xY w)Nr   Tr   r   r   )r   rf   rr   rs   r   r   r   r#   r   s      r   r   zITestSocks5Proxy.test_socks_with_invalid_password.<locals>.request_handler  sG    ??$Q'D/wG }-W .--s   AAr   r   r   badpassr   zSOCKS5 authentication failedro   r   r   Fr   r   )
rM   r   r   r   r   ru   rr   rs   r   r   )rv   rL   r   rq   r   s        r    test_socks_with_invalid_passwordz0TestSocks5Proxy.test_socks_with_invalid_password  s     -	 	?+ 1TYYK8	$$
"*H 

5"6
F
 
 
 
s$   B#1BB#B 	B##B,c                :   t        | j                        d	fd}| j                  |       d| j                   d| j                   }t	        j
                  |df      5 }|j                  dd      }|j                  dk(  sJ 	 d d d        y # 1 sw Y   y xY w)
Nc                   | j                         d   }|j                         d   dk(  sJ |j                         d   k(  sJ t        |d      }t        |      \  }}|dk(  sJ |dk(  sJ t	        j
                  t              5  |j                  d       d d d        	 |j                  d	      }|j                  d
      rn$|j                  d       |j                          y # 1 sw Y   PxY w)Nr   r   r   Fr   r   r   Tr   r   r   )r   getpeernamerf   r   rr   rs   r   r   r!   r   rS   r   )r   r#   r   rA   r   r   expected_ports         r   r   zBTestSocks5Proxy.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((C1r   r   r   )source_addressr   r   r   r   )r   r   r   r   r   ru   r   r   )rv   r   rq   r   re   r   s        @r   test_source_address_worksz)TestSocks5Proxy.test_source_address_works  s    &tyy1	4 	?+		{!DII;7	$${M&B
zz%)=>H??c)))	
 
 
s   #$BBNrx   )r   r   rI   ry   rL   zpytest.MonkeyPatchrI   ry   )rz   r{   r|   __doc__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                  @    e Zd ZdZd	dZd	dZd	dZd
dZd	dZd	dZ	y)TestSOCKS4Proxyz
    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                L   d
d}| j                  |       d| j                   d| j                   }t        j                  |      5 }|j                  dd      }|j                  dk(  sJ |j                  d   dk(  sJ |j                  d	k(  sJ 	 d d d        y # 1 sw Y   y xY w)Nc                   | j                         d   }t        |      }t        |      \  }}|dk(  sJ |dk(  sJ t        j                  t
              5  |j                  d       d d d        	 |j                  d      }|j                  d      rn$|j                  d       |j                          y # 1 sw Y   PxY w)Nr   r   r   Tr   r   r   r   rk   r   rr   rs   r   r   r!   r   rS   r   r   s         r   r   z;TestSOCKS4Proxy.test_basic_request.<locals>.request_handler,  s    ??$Q'D/5GgJD$=(((2::}-T" . ii&<<, 
 LL JJL .-   B55B>	socks4://r   r   r   r   r   r   r   r   	r   r   r   r   ru   r   r   r   r%   r   s        r   r   z"TestSOCKS4Proxy.test_basic_request+  s    	0 	?+		{!DII;7	$$Y/2zz%)=>H??c)))##H-1BBBB==C''' 0//r   c                L   d
d}| j                  |       d| j                   d| j                   }t        j                  |      5 }|j                  dd      }|j                  dk(  sJ |j                  d   dk(  sJ |j                  d	k(  sJ 	 d d d        y # 1 sw Y   y xY w)Nc                   | j                         d   }t        |      }t        |      \  }}|dk(  sJ |dk(  sJ t        j                  t
              5  |j                  d       d d d        	 |j                  d      }|j                  d      rn$|j                  d       |j                          y # 1 sw Y   PxY w)Nr   r   r   Tr   r   r   r   r   s         r   r   z7TestSOCKS4Proxy.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   zTestSOCKS4Proxy.test_local_dnsM  s    	0 	?+		{!DII;7	$$Y/2zz%);<H??c)))##H-1BBBB==C''' 0//r   c                   dd}| j                  |       d| j                   d| j                   }t        j                  |      5 }|j                  dd      }|j                  dk(  sJ 	 d d d        y # 1 sw Y   y xY w)Nc                   | j                         d   }t        |      }t        |      \  }}|dk(  sJ |dk(  sJ t        j                  t
              5  |j                  d       d d d        d}	 ||j                  d      z  }|j                  d      rn'|j                  d      sJ d	|v sJ |j                  d
       |j                          y # 1 sw Y   nxY w)Nr   r   r   Tr   r   r   r   r   r   )r   rk   r   rr   rs   r   r   r!   r   r   rS   r   r   s         r   r   zATestSOCKS4Proxy.test_correct_header_line.<locals>.request_handlerp  s    ??$Q'D/5GgJD$>)))2::}-T" . Ctyy''<<, 
 >>"3444'3...LL JJL% .-s   CC
socks4a://r   r   r   r   r   r   r   s        r   r   z(TestSOCKS4Proxy.test_correct_header_lineo  r   r   c                   t        |       t        j                         dfd}| j                  |       d| j                   d| j
                   }t        j                  |      5 }t        j                  t              5  |j                  ddd       d d d        j                          d d d        y # 1 sw Y   "xY w# 1 sw Y   y xY w)	Nc                   | j                         d   }t        |      }t        |      \  }}t        j                  t
              5  |j                  d       d d d        j                          |j                          y # 1 sw Y   *xY w)Nr   F)	r   rk   r   rr   rs   r   r   r   r   r   s        r   r   z=TestSOCKS4Proxy.test_proxy_rejection.<locals>.request_handler  se    ??$Q'D/5GgJD$}-U# . HHJJJL	 .-s   BBr   r   r   r   Fr   r   r   r   s        @r   r   z$TestSOCKS4Proxy.test_proxy_rejection  r   r   c                P   dd}| j                  |       d| j                   d| j                   }t        j                  |d      5 }|j                  dd      }|j                  dk(  sJ |j                  d	k(  sJ |j                  d
   dk(  sJ 	 d d d        y # 1 sw Y   y xY w)Nc                   | j                         d   }t        |d      }t        |      \  }}|dk(  sJ |dk(  sJ t        j                  t
              5  |j                  d       d d d        	 |j                  d      }|j                  d      rn$|j                  d	       |j                          y # 1 sw Y   PxY w)
Nr   r   rV   r   r   Tr   r   r   r   r   s         r   r   zBTestSOCKS4Proxy.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_usernamez)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                F   dd}| j                  |       d| j                   d| j                   }t        j                  |d      5 }t        j                  t        d      5  |j                  dd	d
       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nc                \    | j                         d   }t        |d      }t        |d        y )Nr   r   r  )r   rk   r   r   s      r   r   zITestSOCKS4Proxy.test_socks_with_invalid_username.<locals>.request_handler  s)    ??$Q'D/wGG$r   r   r   baduserr  zdifferent user-idsro   r   r   Fr   r   )	r   r   r   r   ru   rr   rs   r   r   )rv   r   rq   r   s       r    test_socks_with_invalid_usernamez0TestSOCKS4Proxy.test_socks_with_invalid_username  s    	  	?+ 1TYYK8	$$YCr19MN

5"6
F O DCNN DCs$   	B%B:BB	BB Nrx   r   )
rz   r{   r|   r   r   r   r   r   r  r  r}   r   r   r   r   #  s+     (D (D!*F, CDGr   r   c                  Z    e Zd ZdZej
                  j                  e d      dd       Zy)TestSOCKSWithTLSz;
    Test that TLS behaves properly for SOCKS proxies.
    zNo TLS available)reasonc                X   dd}| j                  |       d| j                   d| j                   }t        j                  |t
              5 }|j                  dd      }|j                  dk(  sJ |j                  dk(  sJ |j                  d	   d
k(  sJ 	 d d d        y # 1 sw Y   y xY w)Nc                   | j                         d   }t        |d      }t        |      \  }}|dk(  sJ |dk(  sJ t        j                  t
              5  |j                  d       d d d        t        j                  t        j                        }|j                  t        d   t        d          |j                  |d	      }d
}	 ||j                  d      z  }|j                  d      rn'|j!                  d      sJ |j#                  d       |j%                          |j%                          y # 1 sw Y   xY w)Nr   Fr   s	   localhosti  Tcertfilekeyfile)server_sider   r   r   s   GET / HTTP/1.1
r   )r   rf   r   rr   rs   r   r   
better_ssl
SSLContextsslPROTOCOL_SSLv23load_cert_chainr
   wrap_socketr!   r   r   rS   r   )r   r#   r   rA   r   contexttlsr   s           r   r   z<TestSOCKSWithTLS.test_basic_request.<locals>.request_handler  s   ??$Q'D/FGgJD$<'''3;;}-T" . !++C,?,?@G##M*$=}Y?WX%%d%=CCsxx&<<, 
 >>"7888KK IIKJJL/ .-s   D55D>r   r   )ca_certsr   zhttps://localhostr   r   r   r   r   )
r   r   r   r   ru   r	   r   r   r%   r   r   s        r   r   z#TestSOCKSWithTLS.test_basic_request  s    	B 	?+ 1TYYK8	$$YDzz%)<=H??c)))==C'''##H-1BBBB EDDs   A	B  B)Nrx   )	rz   r{   r|   r   rr   markskipifHAS_SSLr   r}   r   r   r	  r	    s5     [[G,>?)C @)Cr   r	  )r   rG   rI   rH   )r#   r   r$   rH   rI   bytes)r#   r   r+   r  rI   r  )r#   r   rI   zbytes | strr   )NN)
r#   r   rU   boolrV   bytes | NonerW   r  rI   5typing.Generator[tuple[bytes | str, int], bool, None]r   )r#   r   rV   r  rI   r  )/
__future__r   r   r   typingr   r?   r   r   testr   unittest.mockr   r   rr   r   rK   dummyserver.socketserverr	   r
   dummyserver.testcaser   urllib3.contriburllib3.exceptionsr   r   r  urllib3.utilr   r  r  ImportErrorrT   rR   ri   rQ   r   r'   r-   r<   rM   rf   rk   rm   r   r   r	  r}   r   r   <module>r*     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