
    <eCf                        d dl Z d dlZd dlZd dlZd dlZd dl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 	 d dlZn# e$ r dZY nw xY w ej        d           ej                            e          Zej                            ed          Zej                            ed	          Z G d
 dej        j                  Z G d dej                  Z G d d          Z  G d dej        j!                  Z" G d dej        j!                  Z# G d de	j$                  Z% ej&        dd           G d de	j$                              Z'd Z( G d de	j$                  Z)d Z*e+dk    r e	j,                     dS dS )    N)support)hashlib_helper)threading_helper)warnings_helperT)modulezkeycert.pemzkeycert2.pemc                       e Zd ZdZd Zd ZdS )LoopbackHttpServerz^HTTP server w/ a few modifications that make it useful for
    loopback testing purposes.
    c                     t           j        j                            | ||           | j                            d           d S )Ng?)httpserver
HTTPServer__init__socket
settimeout)selfserver_addressRequestHandlerClasss      1/usr/lib/python3.11/test/test_urllib2_localnet.pyr   zLoopbackHttpServer.__init__%   sE    ''(6(;	= 	= 	= 	s#####    c                 l    | j                                         \  }}|                    d           ||fS )zHTTPServer method, overridden.g      $@)r   acceptr   )r   requestclient_addresss      r   get_requestzLoopbackHttpServer.get_request.   s=     #'+"4"4"6"6
 	4   ((r   N)__name__
__module____qualname____doc__r   r    r   r   r	   r	       s<         $ $ $
) 
) 
) 
) 
)r   r	   c                   $    e Zd ZdZd Zd Zd ZdS )LoopbackHttpServerThreadz2Stoppable thread that runs a loopback http server.c                     t           j                            |            d| _        t          j                    | _        d|_        t          d|          | _        | j        j	        | _
        d S )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   z!LoopbackHttpServerThread.__init__=   s_    !!$'''!_&&
+5('(8(79 9
J*			r   c                 n    d| _         |                                  | j                                         dS )z.Stops the webserver if it's currently running.TN)r%   joinr)   server_closer   s    r   stopzLoopbackHttpServerThread.stopF   s3     !		
!!!!!r   c                     | j                                          | j        s"| j                                         | j         d S d S N)r'   setr%   r)   handle_requestr1   s    r   runzLoopbackHttpServerThread.runN   sT    
# 	(J%%''' # 	( 	( 	( 	( 	(r   N)r   r   r   r   r   r2   r7   r   r   r   r!   r!   :   sG        <<+ + +" " "( ( ( ( (r   r!   c                   H    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZdS )DigestAuthHandlerz-Handler for performing digest authentication.c                 L    d| _         g | _        i | _        d| _        d| _        d S )Nr   z
Test Realmauth)_request_num_nonces_users_realm_name_qopr1   s    r   r   zDigestAuthHandler.__init__X   s+    '			r   c                     || _         d S r4   )r@   )r   qops     r   set_qopzDigestAuthHandler.set_qop_   s    			r   c                     || _         d S r4   )r>   )r   userss     r   	set_userszDigestAuthHandler.set_usersb   s    r   c                     || _         d S r4   )r?   )r   realms     r   	set_realmzDigestAuthHandler.set_realmf   s     r   c                     | xj         dz  c_         t          j        t          | j                                       d                                                    }| j                            |           |S )N   ascii)r<   hashlibmd5strencode	hexdigestr=   append)r   nonces     r   _generate_noncez!DigestAuthHandler._generate_noncei   se    QC 12299'BBCCMMOOE"""r   c                 R   |                     d          }||dz   d          }|                    d          }i }|D ]j}|                    d          \  }}|                                }|d         dk    r|d         dk    r|dd         }n|                                }|||<   k|S )N rK   ,=r   ")findsplitstrip)r   auth_strfirst_space_indexparts	auth_dictpartnamevalues           r   _create_auth_dictz#DigestAuthHandler._create_auth_dicto   s    $MM#..-a/001s##	 	$ 	$D**S//KD%::<<DQx359#3#3ad#IdOOr   c                    i }|                     |           ||d<   ||d<   ||d<   d|z  }t          j        |                    d                                                    }d|z  }t          j        |                    d                                                    }	||d<   |	|d<   d	|z  }
t          j        |
                    d                                                    }||d
         k    S )Npasswordmethoduriz#%(username)s:%(realm)s:%(password)srL   z%(method)s:%(uri)sHA1HA2z3%(HA1)s:%(nonce)s:%(nc)s:%(cnonce)s:%(qop)s:%(HA2)sresponse)updaterM   rN   rP   rQ   )r   ra   rg   rh   ri   
final_dictHA1_strrj   HA2_strrk   response_strrl   s               r   _validate_authz DigestAuthHandler._validate_auth   s    
)$$$!)
:%
8
57*Dk'..1122<<>>&3k'..1122<<>>
5
546@A;|227;;<<FFHH9Z000r   c           
      2   |                     dd           |                    dd           |                    dd| j        d| j        d|                                 d	           |                                 |j                            d
           dS )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_headerr?   r@   rT   end_headerswfilewriter,   s     r   _return_auth_challengez(DigestAuthHandler._return_auth_challenge   s    %%c+JKKK##NK@@@##   tyyy$*>*>*@*@*@*@#B	C 	C 	C 	##%%%##$EFFFur   c                 Z   t          | j                  dk    rdS d|j        vr|                     |          S |                     |j        d                   }|d         | j        v r| j        |d                  }n|                     |          S |                    d          | j        vr|                     |          S | j                            |d                    d}|j        |j	        fD ]!}| 
                    |||j        |          rd}"|s|                     |          S dS )a  Performs 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usernamerS   F)lenr>   headersr{   re   getr=   removepath
short_pathrr   command)r   r-   ra   rg   auth_validatedr   s         r   r6   z DigestAuthHandler.handle_request   sU    t{q  4 (???..???..'(=> I $33;	*(=?22?CCC==))T\9922?CCC##Ig$6777"N )-/IJ * *&&y'/'6'>'+- - * &*N! D22?CCC4r   N)r   r   r   r   r   rC   rF   rI   rT   re   rr   r{   r6   r   r   r   r9   r9   U   s        77      ! ! !    "1 1 1$  * * * * *r   r9   c                       e Zd ZdZdZdZdZedeZ ej	        e
                    d                                        d          Zd Zd Zd	 Zd
 Zd ZdS )BasicAuthHandlerz,Handler for performing basic authentication.testUsertestPassTest:rL   c                 D    t          j        j        j        | g|R i | d S r4   )r   r   BaseHTTPRequestHandlerr   )r   argskwargss      r   r   zBasicAuthHandler.__init__   s.    *3DJ4JJJ6JJJJJr   c                     d S r4   r   r   formatr   s      r   log_messagezBasicAuthHandler.log_message   s    r   c                     |                      d           |                     dd           |                                  d S )N   Content-typeru   )rv   rw   rx   r1   s    r   do_HEADzBasicAuthHandler.do_HEAD   sD    3555r   c                     |                      d           |                     dd| j        z             |                     dd           |                                  d S )Ni  zWWW-AuthenticatezBasic realm="%s"r   ru   )rv   rw   REALMrx   r1   s    r   do_AUTHHEADzBasicAuthHandler.do_AUTHHEAD   sc    3+-ADJ-NOOO555r   c                    | j                             dd          s0|                                  | j                            d           d S | j                             dd          d| j        z   k    rE|                     d           |                                  | j                            d           d S |                                  d S )NAuthorization s   No Auth header receivedzBasic r   s   It works)r   r   r   ry   rz   ENCODED_AUTHrv   rx   r1   s    r   do_GETzBasicAuthHandler.do_GET   s    |44 
	J788888\% %(043D(DE Es###J[))))) r   N)r   r   r   r   USERPASSWDr   USER_PASSWDbase64	b64encoderP   decoder   r   r   r   r   r   r   r   r   r   r      s        66DFE!TT66*K#6#K$6$6w$?$?@@GGPPLK K K    
      r   r   c                   $    e Zd ZdZd Zd Zd ZdS )FakeProxyHandlerzThis 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                 R    || _         t          j        j        j        | g|R i | d S r4   )digest_auth_handlerr   r   r   r   )r   r   r   r   s       r   r   zFakeProxyHandler.__init__  s8     $7 *3DJ4JJJ6JJJJJr   c                     d S r4   r   r   s      r   r   zFakeProxyHandler.log_message  s	     	r   c                    t           j                            | j        d          \  }}}}}}|| _        | j                            |           r|                     dd           |                     dd           | 	                                 | j
                            t          d| j        z  d                     | j
                            d           d S d S )	Nr   r   OKrt   ru   zYou've reached %s!<BR>rL   sF   Our apologies, but our server is down due to a sudden zombie invasion.)urllibparseurlparser   r   r   r6   rv   rw   rx   ry   rz   bytes)r   scmnetlocr   paramsqueryfragments          r   r   zFakeProxyHandler.do_GET  s    7=|7L7LIv8 84fdFE8#22488 	;sD)))^[999JU#;di#G#*, , - - -J : ; ; ; ; ;	; 	;r   N)r   r   r   r   r   r   r   r   r   r   r   r      sN         K K K  
; ; ; ; ;r   r   c                   J     e Zd ZdZdZdZdZ fdZd Z fdZ	d Z
d	 Z xZS )
BasicAuthTestsr   r   	Incorrectr   c                 N   t          t          |                                            d }t          |          | _        |                     | j                   d| j        j        z  | _        | j        	                                 | j        j
                                         d S )Nc                      t          | i |S r4   )r   )r   r   s     r   #http_server_with_basic_auth_handlerzABasicAuthTests.setUp.<locals>.http_server_with_basic_auth_handler$  s    #T4V444r   zhttp://127.0.0.1:%s)superr   setUpr!   r   
addCleanupstop_serverr+   
server_urlstartr'   wait)r   r   	__class__s     r   r   zBasicAuthTests.setUp!  s    nd##))+++	5 	5 	5./RSS()))/$+2BB     r   c                 F    | j                                          d | _         d S r4   r   r2   r1   s    r   r   zBasicAuthTests.stop_server,  !    r   c                 V    t          t          |                                            d S r4   )r   r   tearDown)r   r   s    r   r   zBasicAuthTests.tearDown0  s%    nd##,,.....r   c                    t           j                                        }|                    | j        | j        | j        | j                   t           j                            t           j        	                    |                     	 | 
                    t           j                            | j                             d S # t           j        j        $ r! |                     d| j        z             Y d S w xY w)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_successz&BasicAuthTests.test_basic_auth_success3  s    ^0022

DOTYLLL%%fn&A&A"&E&EFFF	MOOFN224?CCDDDDD|% 	M 	M 	MII9DOKLLLLLL	Ms   7C 1C65C6c                    t           j                                        }|                    | j        | j        | j        | j                   t           j                            t           j        	                    |                     | 
                    t           j        j        t           j        j        | j                   d S r4   )r   r   r   r   r   r   r   INCORRECT_PASSWDr   r   assertRaisesr   r   r   r   s     r   test_basic_auth_httperrorz(BasicAuthTests.test_basic_auth_httperror<  s    ^0022

DOTY@UVVV%%fn&A&A"&E&EFFF&,0&.2H$/ZZZZZr   )r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r   s   @r   r   r     s        DF"E	! 	! 	! 	! 	!  / / / / /M M M[ [ [ [ [ [ [r   r   rN   )opensslc                   L     e Zd ZdZdZdZdZ fdZd Zd Z	d Z
d	 Zd
 Z xZS )ProxyAuthTestszhttp://localhosttestertest123	TestRealmc                 |    t          t                                                      d }                     |t          j                                                   dt          j        d<   dt          j        d<   t                       _         j        	                     j
         j        i            j                             j                    fd}t          |           _                              j                    j                                          j        j                                         d j        j        z  }t*          j                            d|i          }t*          j                                         _        t*          j                            | j                   _        d S )Nc                     t           j                                         t           j                            |            d S r4   osenvironclearrm   old_environs    r   restore_environz-ProxyAuthTests.setUp.<locals>.restore_environN  2    JJk*****r   r   NO_PROXYno_proxyc                  .    t          j        g| R i |S r4   )r   r   )r   r   r   s     r   create_fake_proxy_handlerz7ProxyAuthTests.setUp.<locals>.create_fake_proxy_handlerY  s$    #D$<NtNNNvNNNr   zhttp://127.0.0.1:%dr   )r   r   r   r   r   r   copyr9   r   rF   r   r   rI   r   r!   r   r   r   r'   r   r+   r   r   ProxyHandlerProxyDigestAuthHandlerproxy_digest_handlerr   opener)r   r   r   	proxy_urlhandlerr   s   `    r   r   zProxyAuthTests.setUpK  s   nd##))+++	+ 	+ 	+ 	):):;;;!#
:!#
:#4#6#6  **DIt{+CDDD **4:666	O 	O 	O 	O 	O //HII()))   )DK,<<	.--v	.BCC$*N$I$I$K$K!n11T.0 0r   c                 F    | j                                          d | _         d S r4   r   r1   s    r   r   zProxyAuthTests.stop_serverf  r   r   c                    | j                             | j        | j        | j        | j        dz              | j                            d           |                     t          j
        j        | j        j        | j                   d S )Nbadr;   )r   r   r   URLr   r   r   rC   r   r   r   r   r   openr1   s    r   -test_proxy_with_bad_password_raises_httperrorz<ProxyAuthTests.test_proxy_with_bad_password_raises_httperrorj  s    !..tz48/3y$+e:K	M 	M 	M ((000&,0+*(	$ 	$ 	$ 	$ 	$r   c                     | j                             d           |                     t          j        j        | j        j        | j                   d S Nr;   )	r   rC   r   r   r   r   r   r   r   r1   s    r   ,test_proxy_with_no_password_raises_httperrorz;ProxyAuthTests.test_proxy_with_no_password_raises_httperrorr  sO     ((000&,0+*(	$ 	$ 	$ 	$ 	$r   c                 ^   | j                             | j        | j        | j        | j                   | j                            d           | j        	                    | j                  5 }|
                                r	 |
                                d d d            d S # 1 swxY w Y   d S r   )r   r   r   r   r   r   r   rC   r   r   readr   results     r   test_proxy_qop_auth_worksz(ProxyAuthTests.test_proxy_qop_auth_worksx  s    !..tz48/3y$+	G 	G 	G ((000[dh'' 	6++--  ++-- 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   +*B""B&)B&c                    | j                             | j        | j        | j        | j                   | j                            d           	 | j        	                    | j                  }|5  |
                                r	 |
                                d d d            d S # 1 swxY w Y   d S # t          j        j        $ r Y d S w xY w)Nzauth-int)r   r   r   r   r   r   r   rC   r   r   r  r   r   URLErrorr  s     r   0test_proxy_qop_auth_int_works_or_throws_urlerrorz?ProxyAuthTests.test_proxy_qop_auth_int_works_or_throws_urlerror  s    !..tz48/3y$+	G 	G 	G ((444
	[%%dh//F   kkmm  kkmm                   |$ 	 	 	 DD		s$   B2 .*B%%B),B)2C
	C
)r   r   r   r   r   r   r   r   r   r   r   r  r  r   r   s   @r   r   r   C  s        
CDFE0 0 0 0 06  $ $ $$ $ $        r   r   c                 J      G  fddt           j        j                  S )Nc                   >    e Zd ZdZg Zg ZdZd Zd Z fdZ	d Z
dS )1GetRequestHandler.<locals>.FakeHTTPRequestHandlerz	TestHTTP/P   c                     |                                  }|r(| j                            |          }||d          }|&d S d S r4   )	send_headry   rz   )r   bodydones      r   r   z8GetRequestHandler.<locals>.FakeHTTPRequestHandler.do_GET  sY    >>##D #z''--DEE{  # # # # #r   c                     | j         d         }| j                            t          |                    }|                                  | j                            |           d S )NzContent-Length)r   rfiler  intr   requestsrR   )r   content_length	post_datas      r   do_POSTz9GetRequestHandler.<locals>.FakeHTTPRequestHandler.do_POST  sS    !\*:;N
N(;(;<<IKKMMMM  +++++r   c                    | j         _        | j                            | j                                       d          \  }}}|                     |           |D ]%\  }}|                     ||d| j        iz             &|r,|                     dd           | 	                                 |S | 	                                 d S )Nr   r+   r   z
text/plain)
r   headers_receivedr  rR   r   poprv   rw   r+   rx   )r   response_coder   r  headerrd   FakeHTTPRequestHandler	responsess         r   r  z;GetRequestHandler.<locals>.FakeHTTPRequestHandler.send_head  s    6:l"3M  ++++4==+;+;(M7D}---#* E E  &1C)CDDDD   >>>  """r   c                     d S r4   r   )r   r   s     r   r   z=GetRequestHandler.<locals>.FakeHTTPRequestHandler.log_message  s    Dr   N)r   r   r   server_versionr  r  r+   r   r  r  r   )r  r  s   r   r  r
    su        $	# 	# 	#	, 	, 	,	 	 	 	 	 		 	 	 	 	r   r  )r   r   r   )r  r  s   `@r   GetRequestHandlerr     sK    # # # # # # # #!C # # #L "!r   c                        e Zd ZdZ fdZddZd ZddZddZd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z xZS )TestUrlopenaN  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                 D   t          t          |                                            |                     t          j        j                   d }|                     |t          j        	                                           dt          j        d<   dt          j        d<   d S )Nc                     t           j                                         t           j                            |            d S r4   r   r   s    r   r   z*TestUrlopen.setUp.<locals>.restore_environ  r   r   *r   r   )
r   r"  r   r   r   r   
urlcleanupr   r   r   )r   r   r   s     r   r   zTestUrlopen.setUp  s    k4  &&((( 	1222	+ 	+ 	+ 	):):;;;!$
:!$
:r   Nc                    g }t          j        j        ||fi |}	 |                    |                    d                     |                    |                                           |                    |                    d                     |                    |                                           |                                 n# |                                 w xY wd	                    |          S )Nr   i   r   )
r   r   r   extend	readlinesrR   readliner  closer/   )r   urldatar   lfs         r   r   zTestUrlopen.urlopen  s    N"37777	HHQ[[%%&&&HHQZZ\\"""HHQVVD\\"""HHQVVXXGGIIIIAGGIIIIxx{{s   BC C%c                 F    | j                                          d | _         d S r4   r   r1   s    r   r   zTestUrlopen.stop_server  r   r   c                 $   |dg dfg}t          |          }t          |          | _        |                     | j                   | j                                         | j        j                                         | j        j        }||_        |S )Nr   s   we don't care)	r   r!   r   r   r   r   r'   r   r+   )r   r  r   r+   s       r   start_serverzTestUrlopen.start_server  s    r#345I#I...w77()))   {r   c                     t          t          j        d          s|                     d           ddlm} |dg dfg}t          |          } || fd|i|}|j        |_        |S )NHTTPSHandlerzssl support requiredr   )make_https_serverr      we care a bithandler_class)hasattrr   r   skipTesttest.ssl_serversr5  r   r+   )r   r  r   r5  r   r   s         r   start_https_serverzTestUrlopen.start_https_server  s    v~~66 	2MM0111666666r#345I#I..""4IIwI&II{r   c                     d}ddgdfdg |fg}|                      |          }|                     d|j        z            }|                     ||           |                     |j        ddg           d S )	Ns   We got here...i.  )Locationz(http://localhost:%(port)s/somewhere_elser   r   http://localhost:%s//z/somewhere_elser2  r   r+   assertEqualr  )r   expected_responser  r   r-  s        r   test_redirectionzTestUrlopen.test_redirection  s    -KL"'(
	 ##I..||2W\ABB0111)C1B+CDDDDDr   c                     d}d}ddg|fg}|                      |          }|                     d|j        z            }|                     ||           d S )Ns   hello worlds   a
hello worl
1
d
0
r   )zTransfer-Encodingchunkedr>  )r2  r   r+   rA  )r   rB  chunked_startrl   r   r-  s         r   test_chunkedzTestUrlopen.test_chunked	  sp    *! 	 ;<mLM##H--||2W\ABB011111r   c                    d}|                      dg |fg          }	 |                     d|j        z             |                     d           nI# t          j        j        $ r2}|                                }|                                 Y d }~nd }~ww xY w| 	                    ||           | 	                    |j
        dg           d S )Ns   Bad bad bad...i  zhttp://localhost:%s/weeblez404 should raise URLErrorz/weeble)r2  r   r+   r   r   r   r  r  r+  rA  r  )r   rB  r   r/  r-  s        r   test_404zTestUrlopen.test_404  s    -##c2/@%A$BCC	3LL5DEEE
 II12222	 |$ 	 	 	6688DGGIIIIIIII	 	0111)I;77777s   A B$(BBc                     d}|                      dg |fg          }|                     d|j        z            }|                     ||           |                     |j        dg           d S )N   pycon 2008...r   http://localhost:%s/bizarre/bizarrer@  r   rB  r   r-  s       r   test_200zTestUrlopen.test_200&  sw    ,##c2/@%A$BCC||9GLHII0111)J<88888r   c                     d}|                      dg |fg          }|                     d|j        z  d          }|                     ||           |                     |j        ddg           d S )NrK  r   rL  s   get=with_feelingrM  r@  rN  s       r   test_200_with_parametersz$TestUrlopen.test_200_with_parameters-  s    ,##c2/@%A$BCC||9GLH02 20111)J8K+LMMMMMr   c                     |                                  }t          j        t                    }|                     d|j        z  |          }|                     |d           d S )Ncafilehttps://localhost:%s/bizarrecontextr6  )r;  sslcreate_default_contextCERT_localhostr   r+   rA  )r   r   rW  r-  s       r   
test_httpszTestUrlopen.test_https5  sa    ))++,NCCC||:W\ISZ|[[/00000r   c                    |                      t                    }t          j        dt          f          5  |                     d|j        z  t                    }|                     |d           |                     t          j
        j                  5 }|                     d|j        z  t                     d d d            n# 1 swxY w Y   |                      t                    }|                     t          j
        j                  5 }|                     d|j        z  t                     d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Ncertfiler   rU  rS  r6  )r;  rZ  r   check_warningsDeprecationWarningr   r+   rA  r   r   r   r  CERT_fakehostname)r   r   r-  cms       r   test_https_with_cafilez"TestUrlopen.test_https_with_cafile;  s   ))>)BB+R1C,DEE 	7 	7<< > M'5   7 7DT#3444""6<#899 7R;glJ$5  7 7 77 7 7 7 7 7 7 7 7 7 7 7 7 7 7 --7H-IIG""6<#899 7R;glJ$5  7 7 77 7 7 7 7 7 7 7 7 7 7 7 7 7 7	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7s[   AE%C;EC	EC	AE%E6EE	E	E	
EE!Ec                 Z   |                      t                    }t          j        dt          f          5  |                     t          j        j                  5 }| 	                    d|j
        z  d           d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nr]  r   rU  T)	cadefault)r;  rZ  r   r_  r`  r   r   r   r  r   r+   )r   r   rb  s      r   test_https_with_cadefaultz%TestUrlopen.test_https_with_cadefaultL  s&   ))>)BB+R1C,DEE 	- 	-""6<#899 -R;glJ'+  - - -- - - - - - - - - - - - - - -	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s5   %B  B<B B	B B	B  B$'B$c                    t           |                     d           t           j        s|                     d           d fd}t          j        t           j                  }|                    |           |                     |t                    }t          j        t                    }| 	                    d|j
        z  |           |                     d           d S )	Nzssl module requiredzSNI support required in OpenSSLc                     |d S r4   r   )ssl_sockserver_nameinitial_contextsni_names      r   cb_sniz*TestUrlopen.test_https_sni.<locals>.cb_sniZ  s    "HHHr   )rW  r^  rS  zhttps://localhost:%srV  	localhost)rX  r9  HAS_SNI
SSLContextPROTOCOL_TLS_SERVERset_servername_callbackr;  rZ  rY  r   r+   rA  )r   rm  rW  r   rl  s       @r   test_https_snizTestUrlopen.test_https_sniT  s    ;MM/000{ 	=MM;<<<	# 	# 	# 	# 	# .!899''///))'N)SS,NCCC+gl:GLLL;/////r   c                 6   |                                  }t          j                            d|j        z  ddi          }t          j                            |          5  	 d d d            n# 1 swxY w Y   |                     |j        d         d           d S )Nr>  Rangezbytes=20-39r   )r2  r   r   Requestr+   r   rA  r  r   r   reqs      r   test_sending_headersz TestUrlopen.test_sending_headersd  s    ##%%n$$%;gl%J.5}-E % G G^##C(( 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	1':MJJJJJ   A--A14A1c                    |                                  }t          j                            d|j        z  ddi          }t          j                            |          5  	 d d d            n# 1 swxY w Y   |                     d|j                                                   | 	                    d|j                                                   d S )Nr>  zX-SoMe-hEaderfoobarrv  zX-Some-Header)
r2  r   r   rw  r+   r   assertInr  keysassertNotInrx  s      r   test_sending_headers_camelz&TestUrlopen.test_sending_headers_camell  s    ##%%n$$%;gl%J.=x-H % J J^##C(( 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	ow'?'D'D'F'FGGG'*B*G*G*I*IJJJJJr{  c                 V   |                                  }t          j                            d|j        z            5 }dD ])}|                     t          ||          d|z             *|                     |                                d           d d d            d S # 1 swxY w Y   d S )Nhttp://localhost:%s)r  r+  infogeturlz3object returned from urlopen lacks the %s attributezcalling 'read' failed)r2  r   r   r   r+   r   r8  r  )r   r   open_urlattrs       r   
test_basiczTestUrlopen.test_basicu  s   ##%%^##$9GL$HII 	FX; F F$ 7 7 :>@D:E F F F FOOHMMOO-DEEE		F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	Fs   ABB"%B"c                 t   |                                  }t          j                            d|j        z            }|5  |                                }d d d            n# 1 swxY w Y   |                     |t          j        j	        d           | 
                    |                                d           d S )Nr  zEobject returned by 'info' is not an instance of email.message.Messageplain)r2  r   r   r   r+   r  assertIsInstanceemailmessageMessagerA  get_content_subtype)r   r   r  info_objs       r   	test_infozTestUrlopen.test_info}  s    ##%%>))!GL02 2 	' 	'}}H	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	'h(=B	C 	C 	C 	5577AAAAA   AA#&A#c                    |                                  }t          j                            d|j        z            }|5  |                                }d d d            n# 1 swxY w Y   |                     |d|j        z             d S )Nr  )r2  r   r   r   r+   r  rA  )r   r   r  r,  s       r   test_geturlzTestUrlopen.test_geturl  s    ##%%>))*?',*NOO 	$ 	$//##C	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$3glBCCCCCr  c                     d}|                      dg |fg          }t          j                            d|j        z            }|D ]}|                     ||           d S )NrK  r   r  )r2  r   r   r   r+   rA  )r   rB  r   r-  lines        r   test_iterationzTestUrlopen.test_iteration  sv    ,##c2/@%A$BCC~%%&;gl&JKK 	6 	6DT#45555	6 	6r   c                    dddddz  dz   g}d                     |          }|                     dg |fg          }t          j                            d	|j        z            }t          |          D ]K\  }}|                     |||         d
|dt          ||                   dt          |                     L|                     |dz   t          |                     d S )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 rK   )	r/   r2  r   r   r   r+   	enumeraterA  r~   )r   linesrB  r   r-  indexr  s          r   test_line_iterationzTestUrlopen.test_line_iteration  s    (I|d/BU/JKHHUOO##c2/@%A$BCC~%%&;gl&JKK$T?? 	D 	DKE4T5<< $eeSu%6%6%6%6D			CD D D D 	CJJ/////r   c                    |                      dg dfdg dfg          }t          j                                        }t          j                            d|j        z            }|                     d |j                   |                    |d	                    d                     |                     d|j                   |                     d|
                    d                     |                    |d	                    d                     |                     d	|j                   |                     d
|
                    d                     d S )Nr   s   anyr  1zus-ascii   1zContent-length
1234567890s
   123456789010)r2  r   r   r   rw  r+   rA  r-  r   rP   
get_header)r   r   r   r   s       r   test_issue16464zTestUrlopen.test_issue16464  s>    ##"f"f%
   ,,...(()>)MNNw|,,,GSZZ
33444w|,,,g001ABBCCCG\00<<===555w112BCCDDDDDr   r4   )r   r   r   r   r   r   r   r2  r;  rC  rG  rI  rO  rQ  r[  rc  rf  rs  rz  r  r  r  r  r  r  r  r   r   s   @r   r"  r"    s        % % % % %        	 	 	 	E E E2 2 28 8 89 9 9N N N1 1 17 7 7"- - -0 0 0 K K KK K KF F F	B 	B 	BD D D6 6 6
0 
0 
0E E E E E E Er   r"  c                  d    t          j                    } t          j        t           j        g| R   d S r4   )r   threading_setupunittestaddModuleCleanupthreading_cleanup)thread_infos    r   setUpModuler    s3    "244K.@O;OOOOOOr   __main__)-r   r   r  urllib.parser   urllib.requesthttp.serverr   r#   r  rM   testr   test.supportr   r   r   rX  ImportErrorrequires_working_socketr   dirname__file__herer/   rZ  ra  r   r   r	   r$   r!   r9   r   r   r   TestCaser   requires_hashdigestr   r   r"  r  r   mainr   r   r   <module>r     s2    				                          ' ' ' ' ' ' ) ) ) ) ) ) ( ( ( ( ( (JJJJ   
CCC   t , , , ,	wx  dM22GLL~66 
) ) ) ) )/ ) ) )4( ( ( ( (y/ ( ( (6v v v v v v v vr& & & & &t{9 & & &X; ; ; ; ;t{9 ; ; ;B%[ %[ %[ %[ %[X& %[ %[ %[P $#E4888J J J J JX& J J 98JZ(" (" ("VxE xE xE xE xE(# xE xE xEtP P P
 zHMOOOOO s   A AA