
    0hh`                     J   S SK r S SKrS SKrS SKrS SKrS SK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   S SKr\R(                  " SS9  \R*                  R-                  \5      r\R*                  R3                  \SS	5      r\R*                  R3                  \SS
5      r " S S\R8                  R:                  5      r " S S\R>                  5      r  " S S5      r! " S S\R8                  RD                  5      r# " S S\R8                  RD                  5      r$ " S S\	RJ                  5      r&\RN                  " SSS9 " S S\	RJ                  5      5       r(S r) " S S\	RJ                  \5      r*S r+\,S:X  a  \	RZ                  " 5         gg! \ a    Sr GN_f = f)     N)support)hashlib_helper)threading_helper)ExtraAssertionsT)modulecertdatazkeycert.pemzkeycert2.pemc                   $    \ rS rSrSrS rS rSrg)LoopbackHttpServer    zVHTTP server w/ a few modifications that make it useful for
loopback testing purposes.
c                     [         R                  R                  R                  U UU5        U R                  R                  S5        g )Ng?)httpserver
HTTPServer__init__socket
settimeout)selfserver_addressRequestHandlerClasss      C/opt/python-3.13.8/usr/lib/python3.13/test/test_urllib2_localnet.pyr   LoopbackHttpServer.__init__%   s6    ''(6(;	= 	s#    c                 b    U R                   R                  5       u  pUR                  S5        X4$ )zHTTPServer method, overridden.g      $@)r   acceptr   )r   requestclient_addresss      r   get_requestLoopbackHttpServer.get_request.   s2     #'++"4"4"6
 	4 ((r    N)__name__
__module____qualname____firstlineno____doc__r   r   __static_attributes__r   r   r   r
   r
       s    $
)r   r
   c                   *    \ rS rSrSrS rS rS rSrg)LoopbackHttpServerThread:   z2Stoppable thread that runs a loopback http server.c                     [         R                  R                  U 5        SU l        [         R                  " 5       U l        SUl        [        SU5      U l        U R                  R                  U l
        g )NFzHTTP/1.0)z	127.0.0.1r   )	threadingThreadr   _stop_serverEventreadyprotocol_versionr
   httpdserver_portportr   request_handlers     r   r   !LoopbackHttpServerThread.__init__=   sW    !!$'!__&
+5('(8(79
JJ**	r   c                 f    SU l         U R                  5         U R                  R                  5         g)z.Stops the webserver if it's currently running.TN)r,   joinr0   server_closer   s    r   stopLoopbackHttpServerThread.stopF   s%     !		

!r   c                     U R                   R                  5         U R                  (       d.  U R                  R	                  5         U R                  (       d  M-  g g N)r.   setr,   r0   handle_requestr9   s    r   runLoopbackHttpServerThread.runN   s7    

##JJ%%' ###r   )r,   r0   r2   r.   N)	r    r!   r"   r#   r$   r   r:   r@   r%   r   r   r   r'   r'   :   s    <+"(r   r'   c                   N    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rSrg)DigestAuthHandlerU   z-Handler for performing digest authentication.c                 J    SU l         / U l        0 U l        SU l        SU l        g )Nr   z
Test Realmauth)_request_num_nonces_users_realm_name_qopr9   s    r   r   DigestAuthHandler.__init__X   s'    '	r   c                     Xl         g r=   )rK   )r   qops     r   set_qopDigestAuthHandler.set_qop_   s    	r   c                     Xl         g r=   )rI   )r   userss     r   	set_usersDigestAuthHandler.set_usersb   s    r   c                     Xl         g r=   )rJ   )r   realms     r   	set_realmDigestAuthHandler.set_realmf   s     r   c                     U =R                   S-  sl         [        R                  " [        U R                   5      R	                  S5      5      R                  5       nU R                  R                  U5        U$ )N   ascii)rG   hashlibmd5strencode	hexdigestrH   append)r   nonces     r   _generate_nonce!DigestAuthHandler._generate_noncei   sW    QC 1 1299'BCMMOE"r   c                    UR                  S5      nXS-   S  nUR                  S5      n0 nU HR  nUR                  S5      u  pgUR                  5       nUS   S:X  a  US   S:X  a  USS nOUR                  5       nXtU'   MT     U$ )N rZ   ,=r   ")findsplitstrip)r   auth_strfirst_space_indexparts	auth_dictpartnamevalues           r   _create_auth_dict#DigestAuthHandler._create_auth_dicto   s    $MM#.a/01s#	D**S/KD::<DQx359#3a#dO  r   c                    0 nUR                  U5        X%S'   X5S'   XES'   SU-  n[        R                  " UR                  S5      5      R	                  5       nSU-  n[        R                  " UR                  S5      5      R	                  5       n	XuS'   XS'   S	U-  n
[        R                  " U
R                  S5      5      R	                  5       nXS
   :H  $ )Npasswordmethoduriz#%(username)s:%(realm)s:%(password)sr[   z%(method)s:%(uri)sHA1HA2z3%(HA1)s:%(nonce)s:%(nc)s:%(cnonce)s:%(qop)s:%(HA2)sresponse)updater\   r]   r_   r`   )r   rq   rx   ry   rz   
final_dictHA1_strr{   HA2_strr|   response_strr}   s               r   _validate_auth DigestAuthHandler._validate_auth   s    
)$!):%857*Dkk'..12<<>&3kk'..12<<>5546@A;;|227;<FFHZ000r   c           
      $   UR                  SS5        UR                  SS5        UR                  SSU R                  < SU R                  < SU R	                  5       < S	35        UR                  5         UR                  R                  S
5        g)Ni  zProxy Authentication RequiredContent-Type	text/htmlzProxy-AuthenticatezDigest realm="z", qop="z	",nonce="z", s   Proxy Authentication Required.F)send_responsesend_headerrJ   rK   rc   end_headerswfilewriter3   s     r   _return_auth_challenge(DigestAuthHandler._return_auth_challenge   s}    %%c+JK##NK@##  tyy$*>*>*@#B	C 	##%##$EFr   c                    [        U R                  5      S:X  a  gSUR                  ;  a  U R                  U5      $ U R	                  UR                  S   5      nUS   U R                  ;   a  U R                  US      nOU R                  U5      $ UR                  S5      U R                  ;  a  U R                  U5      $ U R                  R                  US   5        SnUR                  UR                  4 H*  nU R                  UUUR                  U5      (       d  M(  SnM,     U(       d  U R                  U5      $ g)zPerforms digest authentication on the given HTTP request
handler.  Returns True if authentication was successful, False
otherwise.

If no users have been set, then digest auth is effectively
disabled and this method will always return True.
r   TzProxy-Authorizationusernamerb   F)lenrI   headersr   ru   getrH   removepath
short_pathr   command)r   r4   rq   rx   auth_validatedr   s         r   r?    DigestAuthHandler.handle_request   s1    t{{q  (?(??..??..''(=>I $3;;	*(=?22?CC==)T\\922?CC##Ig$67"N )--/I/IJ&&y'/'6'>'>'+- - &*N K "22?CCr   )rH   rK   rJ   rG   rI   N)r    r!   r"   r#   r$   r   rO   rS   rW   rc   ru   r   r   r?   r%   r   r   r   rC   rC   U   s2    7!"1$*r   rC   c                       \ rS rSrSrSrSrSr\< S\< 3r\	R                  " \R                  S5      5      R                  S5      rS rS	 rS
 rS rS rSrg)BasicAuthHandler   z,Handler for performing basic authentication.testUsertestPassTest:r[   c                 `    [         R                  R                  R                  " U /UQ70 UD6  g r=   )r   r   BaseHTTPRequestHandlerr   )r   argskwargss      r   r   BasicAuthHandler.__init__   s$    **33DJ4J6Jr   c                     g r=   r   r   formatr   s      r   log_messageBasicAuthHandler.log_message   s    r   c                 j    U R                  S5        U R                  SS5        U R                  5         g )N   Content-typer   )r   r   r   r9   s    r   do_HEADBasicAuthHandler.do_HEAD   s,    35r   c                     U R                  S5        U R                  SSU R                  -  5        U R                  SS5        U R                  5         g )Ni  zWWW-AuthenticatezBasic realm="%s"r   r   )r   r   REALMr   r9   s    r   do_AUTHHEADBasicAuthHandler.do_AUTHHEAD   sG    3+-ADJJ-NO5r   c                    U R                   R                  SS5      (       d,  U R                  5         U R                  R	                  S5        g U R                   R                  SS5      SU R
                  -   :X  a=  U R                  S5        U R                  5         U R                  R	                  S5        g U R                  5         g )NAuthorization s   No Auth header receivedzBasic r   s   It works)r   r   r   r   r   ENCODED_AUTHr   r   r9   s    r   do_GETBasicAuthHandler.do_GET   s    ||44JJ78\\%(043D3D(DEs#JJ[) r   r   N)r    r!   r"   r#   r$   USERPASSWDr   USER_PASSWDbase64	b64encoder_   decoder   r   r   r   r   r   r%   r   r   r   r   r      s^    6DFE!6*K##K$6$6w$?@GGPLK
r   r   c                   *    \ rS rSrSrS rS rS rSrg)FakeProxyHandler   zThis is a 'fake proxy' that makes it look like the entire
internet has gone down due to a sudden zombie invasion.  It main
utility is in providing us with authentication support for
testing.
c                 l    Xl         [        R                  R                  R                  " U /UQ70 UD6  g r=   )digest_auth_handlerr   r   r   r   )r   r   r   r   s       r   r   FakeProxyHandler.__init__  s,     $7 **33DJ4J6Jr   c                     g r=   r   r   s      r   r   FakeProxyHandler.log_message  s     	r   c                    [         R                  R                  U R                  S5      u  pp4pVX0l        U R
                  R                  U 5      (       a  U R                  SS5        U R                  SS5        U R                  5         U R                  R                  [        SU R                  -  S5      5        U R                  R                  S5        g g )	Nr   r   OKr   r   zYou've reached %s!<BR>r[   sF   Our apologies, but our server is down due to a sudden zombie invasion.)urllibparseurlparser   r   r   r?   r   r   r   r   r   bytes)r   scmnetlocr   paramsqueryfragments          r   r   FakeProxyHandler.do_GET  s    7=||7L7LIIv84dE##22488sD)^[9JJU#;dii#G#*, -JJ : ; 9r   )r   r   N)	r    r!   r"   r#   r$   r   r   r   r%   r   r   r   r   r      s    K
;r   r   c                   V   ^  \ rS rSrSrSrSrSrU 4S jrS r	U 4S jr
S	 rS
 rSrU =r$ )BasicAuthTestsi  r   r   	Incorrectr   c                 >  > [         [        U ]  5         S n[        U5      U l        U R                  U R                  5        SU R                  R                  -  U l        U R                  R                  5         U R                  R                  R                  5         g )Nc                      [        U 0 UD6$ r=   )r   )r   r   s     r   #http_server_with_basic_auth_handlerABasicAuthTests.setUp.<locals>.http_server_with_basic_auth_handler$  s    #T4V44r   zhttp://127.0.0.1:%s)superr   setUpr'   r   
addCleanupstop_serverr2   
server_urlstartr.   wait)r   r   	__class__s     r   r   BasicAuthTests.setUp!  sp    nd)+	5./RS(()/$++2B2BB r   c                 F    U R                   R                  5         S U l         g r=   r   r:   r9   s    r   r   BasicAuthTests.stop_server,      r   c                 *   > [         [        U ]  5         g r=   )r   r   tearDown)r   r   s    r   r   BasicAuthTests.tearDown0  s    nd,.r   c                 &   [         R                  R                  5       nUR                  U R                  U R
                  U R                  U R                  5        [         R                  R                  [         R                  R                  U5      5         U R                  [         R                  R                  U R
                  5      5        g ! [         R                  R                   a!    U R                  SU R
                  -  5         g f = f)Nz!Basic auth failed for the url: %s)r   r   HTTPBasicAuthHandleradd_passwordr   r   r   r   install_openerbuild_opener
assertTrueurlopenerror	HTTPErrorfail)r   ahs     r   test_basic_auth_success&BasicAuthTests.test_basic_auth_success3  s    ^^002


DOOTYYL%%fnn&A&A"&EF	MOOFNN224??CD||%% 	MII9DOOKL	Ms   8C <DDc                 <   [         R                  R                  5       nUR                  U R                  U R
                  U R                  U R                  5        [         R                  R                  [         R                  R                  U5      5        U R                  [         R                  R                  5       n[         R                  R                  U R
                  5        S S S 5        WR                  R                  5         g ! , (       d  f       N)= fr=   )r   r   r   r   r   r   r   INCORRECT_PASSWDr   r   assertRaisesr   r   r   	exceptionclose)r   r   cms      r   test_basic_auth_httperror(BasicAuthTests.test_basic_auth_httperror<  s    ^^002


DOOTYY@U@UV%%fnn&A&A"&EFv||556"NN""4??3 7
 76s    *D
D)r   r   )r    r!   r"   r#   r   r   r   r   r   r   r   r   r   r%   __classcell__r   s   @r   r   r     s7    DF"E	!/M r   r   r]   )opensslc                   V   ^  \ rS rSrSrSrSrSrU 4S jrS r	S r
S	 rS
 rS rSrU =r$ )ProxyAuthTestsiE  zhttp://localhosttestertest123	TestRealmc                   >^  [         [        T ]  5         S nT R                  U[        R
                  R                  5       5        S[        R
                  S'   S[        R
                  S'   [        5       T l        T R                  R                  T R                  T R                  05        T R                  R                  T R                  5        U 4S jn[        U5      T l        T R                  T R                   5        T R                  R#                  5         T R                  R$                  R'                  5         ST R                  R(                  -  n[*        R,                  R/                  SU05      n[*        R,                  R1                  5       T l        [*        R,                  R5                  UT R2                  5      T l        g )Nc                 ~    [         R                  R                  5         [         R                  R                  U 5        g r=   osenvironclearr~   old_environs    r   restore_environ-ProxyAuthTests.setUp.<locals>.restore_environP  $    JJJJk*r   r   NO_PROXYno_proxyc                  6   > [        TR                  /U Q70 UD6$ r=   )r   r   )r   r   r   s     r   create_fake_proxy_handler7ProxyAuthTests.setUp.<locals>.create_fake_proxy_handler[  s    #D$<$<NtNvNNr   zhttp://127.0.0.1:%dr   )r   r  r   r   r  r  copyrC   r   rS   r   r   rW   r   r'   r   r   r   r.   r   r2   r   r   ProxyHandlerProxyDigestAuthHandlerproxy_digest_handlerr   opener)r   r  r  	proxy_urlhandlerr   s   `    r   r   ProxyAuthTests.setUpM  s@   nd)+	+ 	):;!#

:!#

:#4#6   **DIIt{{+CD  **4::6	O //HI(() )DKK,<,<<	..--v	.BC$*NN$I$I$K!nn11T..0r   c                 F    U R                   R                  5         S U l         g r=   r   r9   s    r   r   ProxyAuthTests.stop_serverh  r   r   c                    U R                   R                  U R                  U R                  U R                  U R
                  S-   5        U R                  R                  S5        U R                  [        R                  R                  5       nU R                  R                  U R                  5        S S S 5        WR                  R                  5         g ! , (       d  f       N)= f)NbadrF   )r  r   r   URLr   r   r   rO   r   r   r   r   r  openr   r   r   r   s     r   -test_proxy_with_bad_password_raises_httperror<ProxyAuthTests.test_proxy_with_bad_password_raises_httperrorl  s    !!..tzz488/3yy$++e:K	M  ((0v||556"KKTXX& 7
 76s   &C
C%c                 >   U R                   R                  S5        U R                  [        R                  R
                  5       nU R                  R                  U R                  5        S S S 5        WR                  R                  5         g ! , (       d  f       N)= fNrF   )r   rO   r   r   r   r   r  r%  r$  r   r   r&  s     r   ,test_proxy_with_no_password_raises_httperror;ProxyAuthTests.test_proxy_with_no_password_raises_httperrort  sd      ((0v||556"KKTXX& 7
 76s   &B
Bc                    U R                   R                  U R                  U R                  U R                  U R
                  5        U R                  R                  S5        U R                  R                  U R                  5       nUR                  5       (       a   UR                  5       (       a  M  S S S 5        g ! , (       d  f       g = fr*  )r  r   r   r$  r   r   r   rO   r  r%  readr   results     r   test_proxy_qop_auth_works(ProxyAuthTests.test_proxy_qop_auth_worksz  s    !!..tzz488/3yy$++	G  ((0[[dhh'6++-- ++-- (''s   ,B>>
Cc                    U R                   R                  U R                  U R                  U R                  U R
                  5        U R                  R                  S5         U R                  R                  U R                  5      nU   UR                  5       (       a   UR                  5       (       a  M  S S S 5        g ! , (       d  f       g = f! [        R                  R                   a     g f = f)Nzauth-int)r  r   r   r$  r   r   r   rO   r  r%  r.  r   r   URLErrorr/  s     r   0test_proxy_qop_auth_int_works_or_throws_urlerror?ProxyAuthTests.test_proxy_qop_auth_int_works_or_throws_urlerror  s    !!..tzz488/3yy$++	G  ((4
	[[%%dhh/F kkmm kkmm  ||$$ 	 		s   #%C 
,C
CC32C3)r   r  r  r   )r    r!   r"   r#   r$  r   r   r   r   r   r'  r+  r1  r5  r%   r   r  s   @r   r  r  E  s:    
CDFE06 r   r  c                 X   ^ ^  " UU 4S jS[         R                  R                  5      mT$ )Nc                   F   > \ rS rSrSr/ r/ rSrS rS r	U U4S jr
S rSrg	)
1GetRequestHandler.<locals>.FakeHTTPRequestHandleri  z	TestHTTP/P   c                     U R                  5       nU(       a)  U R                  R                  U5      nXS  nU(       a  M(  g g r=   )	send_headr   r   )r   bodydones      r   r   8GetRequestHandler.<locals>.FakeHTTPRequestHandler.do_GET  s5    >>#Dzz''-E{ $r   c                     U R                   S   nU R                  R                  [        U5      5      nU R	                  5         U R
                  R                  U5        g )NzContent-Length)r   rfiler.  intr   requestsra   )r   content_length	post_datas      r   do_POST9GetRequestHandler.<locals>.FakeHTTPRequestHandler.do_POST  sC    !\\*:;N

N(;<IKKMMM  +r   c                   > U R                   Tl        U R                  R                  U R                  5        TR                  S5      u  pnU R                  U5        U H%  u  pEU R                  XESU R                  0-  5        M'     U(       a$  U R                  SS5        U R                  5         U$ U R                  5         g )Nr   r2   r   z
text/plain)
r   headers_receivedrC  ra   r   popr   r   r2   r   )r   response_coder   r=  headerrt   FakeHTTPRequestHandler	responsess         r   r<  ;GetRequestHandler.<locals>.FakeHTTPRequestHandler.send_head  s    6:ll"3MM  ++4==+;(MD}-#*  &1C)CD $+  >  "r   c                     g r=   r   )r   r   s     r   r   =GetRequestHandler.<locals>.FakeHTTPRequestHandler.log_message  s    r   r   N)r    r!   r"   r#   server_versionrC  rI  r2   r   rF  r<  r   r%   )rM  rN  s   r   rM  r9    s,    $	#	,		r   rM  )r   r   r   )rN  rM  s   `@r   GetRequestHandlerrS    s'    # #!C!C #L "!r   c                      ^  \ rS rSrSrU 4S jrSS jrS rSS jrSS jr	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rSrU =r$ )TestUrlopeni  a:  Tests urllib.request.urlopen using the network.

These tests are not exhaustive.  Assuming that testing using files does a
good job overall of some of the basic interface features.  There are no
tests exercising the optional 'data' and 'proxies' arguments.  No tests
for transparent redirection have been written.
c                 *  > [         [        U ]  5         U R                  [        R
                  R                  5        S nU R                  U[        R                  R                  5       5        S[        R                  S'   S[        R                  S'   g )Nc                 ~    [         R                  R                  5         [         R                  R                  U 5        g r=   r
  r  s    r   r  *TestUrlopen.setUp.<locals>.restore_environ  r  r   *r  r  )
r   rU  r   r   r   r   
urlcleanupr  r  r  )r   r  r   s     r   r   TestUrlopen.setUp  sd    k4&( 	112	+ 	):;!$

:!$

:r   c                    / n[         R                  R                  " X40 UD6n UR                  UR	                  S5      5        UR                  UR                  5       5        UR                  UR                  S5      5        UR                  UR                  5       5        UR                  5         SR                  U5      $ ! UR                  5         f = f)Nr   i   r   )
r   r   r   extend	readlinesra   readliner.  r   r7   )r   urldatar   lfs         r   r   TestUrlopen.urlopen  s    NN""377	HHQ[[%&HHQZZ\"HHQVVD\"HHQVVXGGIxx{ GGIs   A>C Cc                 F    U R                   R                  5         S U l         g r=   r   r9   s    r   r   TestUrlopen.stop_server  r   r   c                 8   Uc  S/ S4/n[        U5      n[        U5      U l        U R                  U R                  5        U R                  R                  5         U R                  R                  R                  5         U R                  R                  nX2l        U$ )Nr   s   we don't care)	rS  r'   r   r   r   r   r.   r   r2   )r   rN  r  r2   s       r   start_serverTestUrlopen.start_server  s    r#345I#I..w7(() {{r   c                     [        [        R                  S5      (       d  U R                  S5        SSKJn  Uc  S/ S4/n[        U5      nU" U 4SU0UD6nUR                  Ul        U$ )NHTTPSHandlerzssl support requiredr   )make_https_serverr      we care a bithandler_class)hasattrr   r   skipTesttest.ssl_serversrl  rS  r2   )r   rN  r   rl  r  r   s         r   start_https_serverTestUrlopen.start_https_server  sg    v~~~66MM016r#345I#I."4IwI&I{{r   c                     SnSS/S4S/ U4/nU R                  U5      nU R                  SUR                  -  5      nU R                  XA5        U R                  UR                  SS/5        g )	Ns   We got here...i.  )Locationz(http://localhost:%(port)s/somewhere_elser   r   http://localhost:%s//z/somewhere_elserh  r   r2   assertEqualrC  )r   expected_responserN  r  ra  s        r   test_redirectionTestUrlopen.test_redirection  s    -KL"'(
	 ##I.||2W\\AB1))C1B+CDr   c                     SnSnSS/U4/nU R                  U5      nU R                  SUR                  -  5      nU R                  XQ5        g )Ns   hello worlds   a
hello worl
1
d
0
r   )zTransfer-Encodingchunkedrv  )rh  r   r2   ry  )r   rz  chunked_startr}   r  ra  s         r   test_chunkedTestUrlopen.test_chunked  s]    *! 	 ;<mLM##H-||2W\\AB1r   c                    SnU R                  S/ U4/5      n U R                  SUR                  -  5        U R                  S5        U R                  WU5        U R                  UR                  S/5        g ! [        R
                  R                   a*  nUR                  5       nUR                  5          S nANsS nAff = f)Ns   Bad bad bad...i  zhttp://localhost:%s/weeblez404 should raise URLErrorz/weeble)rh  r   r2   r   r   r   r4  r.  r   ry  rC  )r   rz  r  rc  ra  s        r   test_404TestUrlopen.test_404  s    -##c2/@%A$BC	3LL5DE
 II1201))I;7 ||$$ 	668DGGII	s   A8 8C  B;;C c                     SnU R                  S/ U4/5      nU R                  SUR                  -  5      nU R                  X15        U R                  UR                  S/5        g )N   pycon 2008...r   http://localhost:%s/bizarre/bizarrerx  r   rz  r  ra  s       r   test_200TestUrlopen.test_200(  sa    ,##c2/@%A$BC||9GLLHI1))J<8r   c                     SnU R                  S/ U4/5      nU R                  SUR                  -  S5      nU R                  X15        U R                  UR                  SS/5        g )Nr  r   r  s   get=with_feelingr  rx  r  s       r   test_200_with_parameters$TestUrlopen.test_200_with_parameters/  sj    ,##c2/@%A$BC||9GLLH021))J8K+LMr   c                     U R                  5       n[        R                  " [        S9nU R	                  SUR
                  -  US9nU R                  US5        g )Ncafilezhttps://localhost:%s/bizarrecontextrm  )rr  sslcreate_default_contextCERT_localhostr   r2   ry  )r   r  r  ra  s       r   
test_httpsTestUrlopen.test_https7  sN    ))+,,NC||:W\\ISZ|[/0r   c                   ^ [         c  U R                  S5        [         R                  (       d  U R                  S5        S mU4S jn[         R                  " [         R                  5      nUR                  U5        U R                  U[        S9n[         R                  " [        S9nU R                  SUR                  -  US9  U R                  TS5        g )	Nzssl module requiredzSNI support required in OpenSSLc                 
   > Umg r=   r   )ssl_sockserver_nameinitial_contextsni_names      r   cb_sni*TestUrlopen.test_https_sni.<locals>.cb_sniC  s    "Hr   )r  certfiler  zhttps://localhost:%sr  	localhost)r  rp  HAS_SNI
SSLContextPROTOCOL_TLS_SERVERset_servername_callbackrr  r  r  r   r2   ry  )r   r  r  r  r  s       @r   test_https_sniTestUrlopen.test_https_sni=  s    ;MM/0{{MM;<	# ..!8!89''/))'N)S,,NC+gll:GL;/r   c                 0   U R                  5       n[        R                  R                  SUR                  -  SS0S9n[        R                  R                  U5          S S S 5        U R                  UR                  S   S5        g ! , (       d  f       N.= f)Nrv  Rangezbytes=20-39r   )rh  r   r   Requestr2   r   ry  rI  r   r  reqs      r   test_sending_headers TestUrlopen.test_sending_headersM  s|    ##%nn$$%;gll%J.5}-E % G^^##C( )11':MJ )(s   B
Bc                    U R                  5       n[        R                  R                  SUR                  -  SS0S9n[        R                  R                  U5          S S S 5        U R                  SUR                  R                  5       5        U R                  SUR                  R                  5       5        g ! , (       d  f       Nc= f)Nrv  zX-SoMe-hEaderfoobarr  zX-Some-Header)
rh  r   r   r  r2   r   assertInrI  keysassertNotInr  s      r   test_sending_headers_camel&TestUrlopen.test_sending_headers_camelU  s    ##%nn$$%;gll%J.=x-H % J^^##C( )ow'?'?'D'D'FG'*B*B*G*G*IJ )(s   B<<
C
c                 $   U R                  5       n[        R                  R                  SUR                  -  5       nS H  nU R                  X#5        M     U R                  UR                  5       S5        S S S 5        g ! , (       d  f       g = f)Nhttp://localhost:%s)r.  r   infogeturlzcalling 'read' failed)rh  r   r   r   r2   assertHasAttrr   r.  )r   r  open_urlattrs       r   
test_basicTestUrlopen.test_basic^  sh    ##%^^##$9GLL$HIX;""82 <OOHMMO-DE JIIs   ;B
Bc                 j   U R                  5       n[        R                  R                  SUR                  -  5      nU   UR                  5       nS S S 5        U R                  W[        R                  R                  S5        U R                  UR                  5       S5        g ! , (       d  f       NZ= f)Nr  zEobject returned by 'info' is not an instance of email.message.Messageplain)rh  r   r   r   r2   r  assertIsInstanceemailmessageMessagery  get_content_subtype)r   r  r  info_objs       r   	test_infoTestUrlopen.test_infoe  s    ##%>>))!GLL02}}H h(=(=B	C 	557A Xs   B$$
B2c                    U R                  5       n[        R                  R                  SUR                  -  5      nU   UR                  5       nS S S 5        U R                  WSUR                  -  5        g ! , (       d  f       N.= f)Nr  )rh  r   r   r   r2   r  ry  )r   r  r  r`  s       r   test_geturlTestUrlopen.test_geturlp  sd    ##%>>))*?',,*NO//#C 3gllBC Xs   A88
Bc                     SnU R                  S/ U4/5      n[        R                  R                  SUR                  -  5      nU H  nU R                  XA5        M     g )Nr  r   r  )rh  r   r   r   r2   ry  )r   rz  r  ra  lines        r   test_iterationTestUrlopen.test_iterationx  sY    ,##c2/@%A$BC~~%%&;gll&JKDT5 r   c                    SSSSS-  S-   /nSR                  U5      nU R                  S/ U4/5      n[        R                  R	                  S	UR
                  -  5      n[        U5       H:  u  pVU R                  XaU   S
U< S[        X   5      < S[        U5      < 35        M<     U R                  WS-   [        U5      5        g )Ns   We
s   got
s   here
s	   verylong i       
r   r   r  zFetched line number z1 doesn't match expected:
    Expected length was z, got rZ   )	r7   rh  r   r   r   r2   	enumeratery  r   )r   linesrz  r  ra  indexr  s          r   test_line_iterationTestUrlopen.test_line_iteration  s    (I|d/BU/JKHHUO##c2/@%A$BC~~%%&;gll&JK$T?KET< $S%6D	CD +
 	CJ/r   c                 z   U R                  S/ S4S/ S4/5      n[        R                  R                  5       n[        R                  R	                  SUR
                  -  5      nU R                  S UR                  5        UR                  USR                  S5      5        U R                  SUR                  5        U R                  SUR                  S5      5        UR                  USR                  S5      5        U R                  S	UR                  5        U R                  S
UR                  S5      5        g )Nr   s   anyr  1zus-ascii   1zContent-length
1234567890s
   123456789010)rh  r   r   r   r  r2   ry  ra  r%  r_   
get_header)r   r  r  r   s       r   test_issue16464TestUrlopen.test_issue16464  s    ##"f"f%
  ,,...(()>)MNw||,GSZZ
34w||,g001ABCG\00<=5w112BCDr   )r   r=   )r    r!   r"   r#   r$   r   r   r   rh  rr  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r%   r   r  s   @r   rU  rU    sz    %	E289N10 KKF	BD6
0E Er   rU  c                  x    [         R                  " 5       n [        R                  " [         R                  /U Q76   g r=   )r   threading_setupunittestaddModuleCleanupthreading_cleanup)thread_infos    r   setUpModuler    s*    "224K.@@O;Or   __main__).r   r  r  urllib.parser   urllib.requesthttp.serverr   r*   r  r\   testr   test.supportr   r   test.support.testcaser   r  ImportErrorrequires_working_socketr   dirname__file__herer7   r  CERT_fakehostnamer   r   r
   r+   r'   rC   r   r   r   TestCaser   requires_hashdigestr  rS  rU  r  r    mainr   r   r   <module>r     s    	         ' ) 1   t ,	wwx dJ>GGLLz>B 
)// )4(y// (6v vr&t{{99 &X;t{{99 ;B'X&& 'T ##E48JX&& J 9JZ("V^E(##_ ^E@P
 zMMO c  
Cs   F F"!F"