o
    IXîhüe  ã                   @   s€  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 zd dlZW n eyG   dZY nw ej e¡Zej ed¡Zej ed¡ZG dd„ dejjƒZG d	d
„ d
ejƒZG dd„ dƒZG dd„ dejjƒZG dd„ dejjƒZ G dd„ de	j!ƒZ"ej#dddG dd„ de	j!ƒƒZ$dd„ Z%G dd„ de	j!ƒZ&dd„ Z'e(dkr¾e	 )¡  dS dS )é    N)Úhashlib_helper)Úthreading_helper)Úwarnings_helperzkeycert.pemzkeycert2.pemc                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚLoopbackHttpServerz^HTTP server w/ a few modifications that make it useful for
    loopback testing purposes.
    c                 C   s"   t jj | ||¡ | j d¡ d S )Ngš™™™™™¹?)ÚhttpÚserverÚ
HTTPServerÚ__init__ÚsocketÚ
settimeout)ÚselfZserver_addressZRequestHandlerClass© r   úD/opt/python-3.10.19/usr/lib/python3.10/test/test_urllib2_localnet.pyr	   "   s
   
þzLoopbackHttpServer.__init__c                 C   s    | j  ¡ \}}| d¡ ||fS )zHTTPServer method, overridden.g      $@)r
   Úacceptr   )r   ÚrequestZclient_addressr   r   r   Úget_request+   s   
zLoopbackHttpServer.get_requestN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   r   r   r   r   r   r      s    	r   c                   @   ó(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚLoopbackHttpServerThreadz2Stoppable thread that runs a loopback http server.c                 C   s<   t j | ¡ d| _t  ¡ | _d|_td|ƒ| _| jj	| _
d S )NFzHTTP/1.0)z	127.0.0.1r   )Ú	threadingÚThreadr	   Ú_stop_serverÚEventÚreadyZprotocol_versionr   ÚhttpdZserver_portÚport©r   Úrequest_handlerr   r   r   r	   :   s   
ÿz!LoopbackHttpServerThread.__init__c                 C   s   d| _ |  ¡  | j ¡  dS )z.Stops the webserver if it's currently running.TN)r   Újoinr   Zserver_close©r   r   r   r   ÚstopC   s   zLoopbackHttpServerThread.stopc                 C   s(   | j  ¡  | js| j ¡  | jrd S d S ©N)r   Úsetr   r   Úhandle_requestr"   r   r   r   ÚrunK   s   

ÿzLoopbackHttpServerThread.runN)r   r   r   r   r	   r#   r'   r   r   r   r   r   7   s
    	r   c                   @   sX   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚDigestAuthHandlerz-Handler for performing digest authentication.c                 C   s"   d| _ g | _i | _d| _d| _d S )Nr   z
Test RealmÚauth)Ú_request_numÚ_noncesÚ_usersÚ_realm_nameÚ_qopr"   r   r   r   r	   U   s
   
zDigestAuthHandler.__init__c                 C   ó
   || _ d S r$   )r.   )r   Zqopr   r   r   Úset_qop\   ó   
zDigestAuthHandler.set_qopc                 C   s   t |tƒsJ ‚|| _d S r$   )Ú
isinstanceÚdictr,   )r   Zusersr   r   r   Ú	set_users_   s   
zDigestAuthHandler.set_usersc                 C   r/   r$   )r-   )r   Zrealmr   r   r   Ú	set_realmc   r1   zDigestAuthHandler.set_realmc                 C   s8   |  j d7  _ t t| j ƒ d¡¡ ¡ }| j |¡ |S )Né   Úascii)r*   ÚhashlibÚmd5ÚstrÚencodeÚ	hexdigestr+   Úappend)r   Únoncer   r   r   Ú_generate_noncef   s   z!DigestAuthHandler._generate_noncec                 C   s‚   |  d¡}||d d … }| d¡}i }|D ](}| d¡\}}| ¡ }|d dkr6|d dkr6|dd… }n| ¡ }|||< q|S )Nú r6   ú,ú=r   ú"éÿÿÿÿ)ÚfindÚsplitÚstrip)r   Zauth_strZfirst_space_indexÚpartsÚ	auth_dictÚpartÚnameÚvaluer   r   r   Ú_create_auth_dictl   s   


z#DigestAuthHandler._create_auth_dictc                 C   s–   i }|  |¡ ||d< ||d< ||d< d| }t | d¡¡ ¡ }d| }t | d¡¡ ¡ }	||d< |	|d< d	| }
t |
 d¡¡ ¡ }||d
 kS )NÚpasswordÚmethodÚuriz#%(username)s:%(realm)s:%(password)sr7   z%(method)s:%(uri)sÚHA1ÚHA2z3%(HA1)s:%(nonce)s:%(nc)s:%(cnonce)s:%(qop)s:%(HA2)sÚresponse)Úupdater8   r9   r;   r<   )r   rI   rN   rO   rP   Z
final_dictZHA1_strrQ   ZHA2_strrR   Zresponse_strrS   r   r   r   Ú_validate_auth}   s    
ÿz DigestAuthHandler._validate_authc                 C   sN   |  dd¡ | dd¡ | dd| j| j|  ¡ f ¡ | ¡  |j d¡ dS )	Ni—  zProxy Authentication RequiredúContent-Typeú	text/htmlzProxy-Authenticatez(Digest realm="%s", qop="%s",nonce="%s", s   Proxy Authentication Required.F)Úsend_responseÚsend_headerr-   r.   r?   Úend_headersÚwfileÚwriter   r   r   r   Ú_return_auth_challenge   s   ýÿz(DigestAuthHandler._return_auth_challengec                 C   sÆ   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|¡rYd}qL|sa|  |¡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Úusernamer>   F)Úlenr,   Úheadersr]   rM   Úgetr+   ÚremoveÚpathÚ
short_pathrU   Zcommand)r   r    rI   rN   Zauth_validatedrc   r   r   r   r&   ž   s2   	

ÿ

ý€
z DigestAuthHandler.handle_requestN)r   r   r   r   r	   r0   r4   r5   r?   rM   rU   r]   r&   r   r   r   r   r(   R   s    r(   c                   @   sf   e Zd ZdZdZdZdZdeef Ze 	e 
d¡¡ d¡Zdd„ Zd	d
„ Zdd„ Zdd„ Zdd„ ZdS )ÚBasicAuthHandlerz,Handler for performing basic authentication.ÚtestUserÚtestPassÚTestz%s:%sr7   c                 O   s    t jjj| g|¢R i |¤Ž d S r$   )r   r   ÚBaseHTTPRequestHandlerr	   )r   ÚargsÚkwargsr   r   r   r	   Ô   s    zBasicAuthHandler.__init__c                 G   ó   d S r$   r   ©r   Úformatrj   r   r   r   Úlog_message×   s   zBasicAuthHandler.log_messagec                 C   s"   |   d¡ |  dd¡ |  ¡  d S )NéÈ   úContent-typerW   )rX   rY   rZ   r"   r   r   r   Údo_HEADÛ   s   
zBasicAuthHandler.do_HEADc                 C   s4   |   d¡ |  dd| j ¡ |  dd¡ |  ¡  d S )Ni‘  zWWW-AuthenticatezBasic realm="%s"rq   rW   )rX   rY   ÚREALMrZ   r"   r   r   r   Údo_AUTHHEADà   s   
zBasicAuthHandler.do_AUTHHEADc                 C   sl   | j  dd¡s|  ¡  | j d¡ d S | j  dd¡d| j kr0|  d¡ |  ¡  | j d¡ d S |  ¡  d S )NZAuthorizationÚ s   No Auth header receivedzBasic rp   s   It works)r`   ra   rt   r[   r\   ÚENCODED_AUTHrX   rZ   r"   r   r   r   Údo_GETæ   s   ÿÿ
zBasicAuthHandler.do_GETN)r   r   r   r   ÚUSERÚPASSWDrs   ZUSER_PASSWDÚbase64Z	b64encoder;   Údecoderv   r	   ro   rr   rt   rw   r   r   r   r   re   Ë   s    re   c                   @   r   )	ÚFakeProxyHandlerzÏThis 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                 O   s&   || _ tjjj| g|¢R i |¤Ž d S r$   )Údigest_auth_handlerr   r   ri   r	   )r   r}   rj   rk   r   r   r   r	   þ   s    zFakeProxyHandler.__init__c                 G   rl   r$   r   rm   r   r   r   ro     s   zFakeProxyHandler.log_messagec                 C   sz   t j | jd¡\}}}}}}|| _| j | ¡r;|  dd¡ |  dd¡ |  	¡  | j
 td| j dƒ¡ | j
 d¡ d S d S )	Nr   rp   ZOKrV   rW   zYou've reached %s!<BR>r7   sF   Our apologies, but our server is down due to a sudden zombie invasion.)ÚurllibÚparseÚurlparserc   rd   r}   r&   rX   rY   rZ   r[   r\   Úbytes)r   ZscmÚnetlocrc   ÚparamsÚqueryÚfragmentr   r   r   rw   	  s   ÿÿúzFakeProxyHandler.do_GETN)r   r   r   r   r	   ro   rw   r   r   r   r   r|   ÷   s
    r|   c                       sP   e Zd ZdZdZdZdZ‡ fdd„Zdd„ Z‡ fd	d
„Z	dd„ Z
dd„ Z‡  ZS )ÚBasicAuthTestsrf   rg   Z	Incorrectrh   c                    sT   t t| ƒ ¡  dd„ }t|ƒ| _|  | j¡ d| jj | _| j 	¡  | jj
 ¡  d S )Nc                  _   s   t | i |¤ŽS r$   )re   ©rj   rk   r   r   r   Ú#http_server_with_basic_auth_handler!  s   zABasicAuthTests.setUp.<locals>.http_server_with_basic_auth_handlerzhttp://127.0.0.1:%s)Úsuperr†   ÚsetUpr   r   Ú
addCleanupÚstop_serverr   Ú
server_urlÚstartr   Úwait)r   rˆ   ©Ú	__class__r   r   rŠ     s   

zBasicAuthTests.setUpc                 C   ó   | j  ¡  d | _ d S r$   ©r   r#   r"   r   r   r   rŒ   )  ó   

zBasicAuthTests.stop_serverc                    s   t t| ƒ ¡  d S r$   )r‰   r†   ÚtearDownr"   r   r   r   r•   -  s   zBasicAuthTests.tearDownc                 C   sz   t j ¡ }| | j| j| j| j¡ t j t j 	|¡¡ z|  
t j | j¡¡ W d S  t jjy<   |  d| j ¡ Y d S w )Nz!Basic auth failed for the url: %s)r~   r   ÚHTTPBasicAuthHandlerÚadd_passwordrs   r   rx   ry   Úinstall_openerÚbuild_openerÚ
assertTrueÚurlopenÚerrorÚ	HTTPErrorÚfail©r   Zahr   r   r   Útest_basic_auth_success0  s   
ÿz&BasicAuthTests.test_basic_auth_successc                 C   sR   t j ¡ }| | j| j| j| j¡ t j t j 	|¡¡ |  
t jjt jj| j¡ d S r$   )r~   r   r–   r—   rs   r   rx   ÚINCORRECT_PASSWDr˜   r™   ÚassertRaisesrœ   r   r›   rŸ   r   r   r   Útest_basic_auth_httperror9  s   
z(BasicAuthTests.test_basic_auth_httperror)r   r   r   rx   ry   r¡   rs   rŠ   rŒ   r•   r    r£   Ú__classcell__r   r   r   r   r†     s    	r†   r9   T)Zopensslc                       sT   e Zd ZdZdZdZdZ‡ fdd„Zdd„ Zd	d
„ Z	dd„ Z
dd„ Zdd„ Z‡  ZS )ÚProxyAuthTestszhttp://localhostZtesterZtest123Z	TestRealmc                    sÜ   t tˆ ƒ ¡  dd„ }ˆ  |tj ¡ ¡ dtjd< dtjd< tƒ ˆ _ˆ j 	ˆ j
ˆ ji¡ ˆ j ˆ j¡ ‡ fdd„}t|ƒˆ _ˆ  ˆ j¡ ˆ j ¡  ˆ jj ¡  dˆ jj }tj d	|i¡}tj ¡ ˆ _tj |ˆ j¡ˆ _d S )
Nc                 S   ó   t j ¡  t j | ¡ d S r$   ©ÚosÚenvironÚclearrT   ©Zold_environr   r   r   Úrestore_environK  ó   
z-ProxyAuthTests.setUp.<locals>.restore_environru   ÚNO_PROXYÚno_proxyc                     s   t ˆ jg| ¢R i |¤ŽS r$   )r|   r}   r‡   r"   r   r   Úcreate_fake_proxy_handlerV  s   z7ProxyAuthTests.setUp.<locals>.create_fake_proxy_handlerzhttp://127.0.0.1:%dr   )r‰   r¥   rŠ   r‹   r¨   r©   Úcopyr(   r}   r4   rx   ry   r5   rs   r   r   rŒ   rŽ   r   r   r   r~   r   ZProxyHandlerZProxyDigestAuthHandlerÚproxy_digest_handlerr™   Úopener)r   r¬   r°   Z	proxy_urlÚhandlerr   r"   r   rŠ   H  s&   




ÿzProxyAuthTests.setUpc                 C   r’   r$   r“   r"   r   r   r   rŒ   c  r”   zProxyAuthTests.stop_serverc                 C   sF   | j  | j| j| j| jd ¡ | j d¡ |  t	j
j| jj| j¡ d S )NZbadr)   )r²   r—   rs   ÚURLrx   ry   r}   r0   r¢   r~   rœ   r   r³   Úopenr"   r   r   r   Ú-test_proxy_with_bad_password_raises_httperrorg  s   ÿ
þz<ProxyAuthTests.test_proxy_with_bad_password_raises_httperrorc                 C   s(   | j  d¡ |  tjj| jj| j¡ d S ©Nr)   )	r}   r0   r¢   r~   rœ   r   r³   r¶   rµ   r"   r   r   r   Ú,test_proxy_with_no_password_raises_httperroro  s
   
þz;ProxyAuthTests.test_proxy_with_no_password_raises_httperrorc                 C   s|   | j  | j| j| j| j¡ | j d¡ | j 	| j¡}| 
¡ r,	 | 
¡ sW d   ƒ d S W d   ƒ d S 1 s7w   Y  d S r¸   )r²   r—   rs   rµ   rx   ry   r}   r0   r³   r¶   Úread©r   Úresultr   r   r   Útest_proxy_qop_auth_worksu  s   ÿ
ÿÿ"ÿz(ProxyAuthTests.test_proxy_qop_auth_worksc                 C   sž   | j  | j| j| j| j¡ | j d¡ z	| j 	| j¡}W n t
jjy(   Y d S w | | ¡ r=	 | ¡ s0W d   ƒ d S W d   ƒ d S 1 sHw   Y  d S )Nzauth-int)r²   r—   rs   rµ   rx   ry   r}   r0   r³   r¶   r~   rœ   ÚURLErrorrº   r»   r   r   r   Ú0test_proxy_qop_auth_int_works_or_throws_urlerror}  s    ÿü
ÿÿ"ÿz?ProxyAuthTests.test_proxy_qop_auth_int_works_or_throws_urlerror)r   r   r   rµ   rx   ry   rs   rŠ   rŒ   r·   r¹   r½   r¿   r¤   r   r   r   r   r¥   @  s    r¥   c                    s   G ‡ ‡fdd„dt jjƒ‰ ˆ S )Nc                       sB   e Zd ZdZg Zg ZdZdd„ Zdd„ Z‡ ‡fdd„Z	d	d
„ Z
dS )z1GetRequestHandler.<locals>.FakeHTTPRequestHandlerz	TestHTTP/éP   c                 S   s0   |   ¡ }|r| j |¡}||d … }|sd S d S r$   )Ú	send_headr[   r\   )r   ÚbodyÚdoner   r   r   rw   —  s
   þz8GetRequestHandler.<locals>.FakeHTTPRequestHandler.do_GETc                 S   s2   | j d }| j t|ƒ¡}|  ¡  | j |¡ d S )NzContent-Length)r`   Zrfilerº   Úintrw   Úrequestsr=   )r   Zcontent_lengthZ	post_datar   r   r   Údo_POST  s   
z9GetRequestHandler.<locals>.FakeHTTPRequestHandler.do_POSTc                    s|   | j ˆ _| j | j¡ ˆ d¡\}}}|  |¡ |D ]\}}|  ||d| ji ¡ q|r8|  dd¡ |  	¡  |S |  	¡  d S )Nr   r   rq   z
text/plain)
r`   Úheaders_receivedrÅ   r=   rc   ÚpoprX   rY   r   rZ   )r   Zresponse_coder`   rÂ   ÚheaderrL   ©ÚFakeHTTPRequestHandlerÚ	responsesr   r   rÁ   £  s   
z;GetRequestHandler.<locals>.FakeHTTPRequestHandler.send_headc                 W   rl   r$   r   )r   rj   r   r   r   ro   ²  s   z=GetRequestHandler.<locals>.FakeHTTPRequestHandler.log_messageN)r   r   r   Zserver_versionrÅ   rÇ   r   rw   rÆ   rÁ   ro   r   rÊ   r   r   rË     s    rË   )r   r   ri   )rÌ   r   rÊ   r   ÚGetRequestHandlerŽ  s   &rÍ   c                       sÎ   e Zd ZdZ‡ fdd„Zd/dd„Zdd„ Zd/d	d
„Zd/dd„Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Z‡  ZS )0Ú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                    sN   t t| ƒ ¡  |  tjj¡ dd„ }|  |tj 	¡ ¡ dtjd< dtjd< d S )Nc                 S   r¦   r$   r§   r«   r   r   r   r¬   É  r­   z*TestUrlopen.setUp.<locals>.restore_environÚ*r®   r¯   )
r‰   rÎ   rŠ   r‹   r~   r   Ú
urlcleanupr¨   r©   r±   )r   r¬   r   r   r   rŠ   Â  s   
zTestUrlopen.setUpNc                 K   sx   g }t jj||fi |¤Ž}z$| | d¡¡ | | ¡ ¡ | | d¡¡ | | ¡ ¡ W | ¡  n| ¡  w d 	|¡S )Nrp   i   ó    )
r~   r   r›   ÚextendÚ	readlinesr=   Úreadlinerº   Úcloser!   )r   ÚurlÚdatark   ÚlÚfr   r   r   r›   Ð  s   
zTestUrlopen.urlopenc                 C   r’   r$   r“   r"   r   r   r   rŒ   Ý  r”   zTestUrlopen.stop_serverc                 C   sZ   |d u r
dg dfg}t |ƒ}t|ƒ| _|  | j¡ | j ¡  | jj ¡  | jj}||_|S )Nrp   s   we don't care)	rÍ   r   r   r‹   rŒ   rŽ   r   r   r   )r   rÌ   r´   r   r   r   r   Ústart_serverá  s   

zTestUrlopen.start_serverc                 K   s^   t tjdƒs|  d¡ ddlm} |d u rdg dfg}t|ƒ}|| fd|i|¤Ž}|j|_|S )NZHTTPSHandlerzssl support requiredr   )Úmake_https_serverrp   ó   we care a bitZhandler_class)Úhasattrr~   r   ÚskipTestZtest.ssl_serversrÛ   rÍ   r   )r   rÌ   rk   rÛ   r´   r   r   r   r   Ústart_https_serverî  s   
zTestUrlopen.start_https_serverc                 C   sV   d}ddgdfdg |fg}|   |¡}|  d|j ¡}|  ||¡ |  |jddg¡ d S )	Ns   We got here...i.  )ZLocationz(http://localhost:%(port)s/somewhere_elseru   rp   úhttp://localhost:%s/ú/z/somewhere_else©rÚ   r›   r   ÚassertEqualrÅ   )r   Úexpected_responserÌ   r´   r×   r   r   r   Útest_redirectionù  s   ÿý
zTestUrlopen.test_redirectionc                 C   s@   d}d}ddg|fg}|   |¡}|  d|j ¡}|  ||¡ d S )Ns   hello worlds   a
hello worl
1
d
0
rp   )zTransfer-EncodingZchunkedrà   )rÚ   r›   r   rã   )r   rä   Zchunked_startrS   r´   r×   r   r   r   Útest_chunked  s   ÿ
zTestUrlopen.test_chunkedc              
   C   sŽ   d}|   dg |fg¡}z
|  d|j ¡ W n tjjy1 } z| ¡ }| ¡  W Y d }~n
d }~ww |  d¡ |  	||¡ |  	|j
dg¡ d S )Ns   Bad bad bad...i”  zhttp://localhost:%s/weeblez404 should raise URLErrorz/weeble)rÚ   r›   r   r~   rœ   r¾   rº   rÕ   rž   rã   rÅ   )r   rä   r´   rÙ   r×   r   r   r   Útest_404  s   €þ
zTestUrlopen.test_404c                 C   sF   d}|   dg |fg¡}|  d|j ¡}|  ||¡ |  |jdg¡ d S )Nó   pycon 2008...rp   úhttp://localhost:%s/bizarreú/bizarrerâ   ©r   rä   r´   r×   r   r   r   Útest_200#  s
   zTestUrlopen.test_200c                 C   sJ   d}|   dg |fg¡}|  d|j d¡}|  ||¡ |  |jddg¡ d S )Nrè   rp   ré   s   get=with_feelingrê   râ   rë   r   r   r   Útest_200_with_parameters*  s   ÿz$TestUrlopen.test_200_with_parametersc                 C   s8   |   ¡ }tjtd}| jd|j |d}|  |d¡ d S )N©Zcafileúhttps://localhost:%s/bizarre©ÚcontextrÜ   )rß   ÚsslÚcreate_default_contextÚCERT_localhostr›   r   rã   )r   r´   rñ   r×   r   r   r   Ú
test_https2  s   zTestUrlopen.test_httpsc              	   C   s   | j td}t dtf¡i | jd|j td}|  |d¡ |  t	j
j¡}| jd|j td W d   ƒ n1 s:w   Y  | j td}|  t	j
j¡}| jd|j td W d   ƒ n1 saw   Y  W d   ƒ d S W d   ƒ d S 1 syw   Y  d S )N©Úcertfileru   rï   rî   rÜ   )rß   rô   r   Úcheck_warningsÚDeprecationWarningr›   r   rã   r¢   r~   rœ   r¾   ÚCERT_fakehostname)r   r´   r×   Úcmr   r   r   Útest_https_with_cafile8  s(   ÿÿÿÿÿõ"õz"TestUrlopen.test_https_with_cafilec              	   C   s’   | j td}t dtf¡2 |  tjj¡}| j	d|j
 dd W d   ƒ n1 s*w   Y  W d   ƒ d S W d   ƒ d S 1 sBw   Y  d S )Nrö   ru   rï   T)Z	cadefault)rß   rô   r   rø   rù   r¢   r~   rœ   r¾   r›   r   )r   r´   rû   r   r   r   Útest_https_with_cadefaultI  s   ÿÿÿ"ÿz%TestUrlopen.test_https_with_cadefaultc                    s†   t d u r	|  d¡ t js|  d¡ d ‰ ‡ fdd„}t  t j¡}| |¡ | j|td}t jtd}| j	d|j
 |d |  ˆ d	¡ d S )
Nzssl module requiredzSNI support required in OpenSSLc                    s   |‰ d S r$   r   )Zssl_sockZserver_nameZinitial_context©Zsni_namer   r   Úcb_sniW  s   z*TestUrlopen.test_https_sni.<locals>.cb_sni)rñ   r÷   rî   zhttps://localhost:%srð   Ú	localhost)rò   rÞ   ZHAS_SNIZ
SSLContextZPROTOCOL_TLS_SERVERZset_servername_callbackrß   rô   ró   r›   r   rã   )r   rÿ   rñ   r´   r   rþ   r   Útest_https_sniQ  s   


zTestUrlopen.test_https_snic                 C   sd   |   ¡ }tjjd|j ddid}tj |¡ W d   ƒ n1 s"w   Y  |  |jd d¡ d S )Nrà   ZRangezbytes=20-39©r`   )rÚ   r~   r   ÚRequestr   r›   rã   rÇ   ©r   r´   Zreqr   r   r   Útest_sending_headersa  s   ÿÿz TestUrlopen.test_sending_headersc                 C   sv   |   ¡ }tjjd|j ddid}tj |¡ W d   ƒ n1 s"w   Y  |  d|j ¡ ¡ |  	d|j ¡ ¡ d S )Nrà   zX-SoMe-hEaderZfoobarr  zX-Some-Header)
rÚ   r~   r   r  r   r›   ZassertInrÇ   ÚkeysZassertNotInr  r   r   r   Útest_sending_headers_cameli  s   ÿÿz&TestUrlopen.test_sending_headers_camelc                 C   sp   |   ¡ }tj d|j ¡!}dD ]}|  t||ƒd| ¡ q|  | ¡ d¡ W d   ƒ d S 1 s1w   Y  d S )Núhttp://localhost:%s)rº   rÕ   ÚinfoÚgeturlz3object returned from urlopen lacks the %s attributezcalling 'read' failed)rÚ   r~   r   r›   r   rš   rÝ   rº   )r   r´   Úopen_urlÚattrr   r   r   Ú
test_basicr  s   ÿ"üzTestUrlopen.test_basicc                 C   sl   |   ¡ }tj d|j ¡}| | ¡ }W d   ƒ n1 sw   Y  |  |tjj	d¡ |  
| ¡ d¡ d S )Nr  zEobject returned by 'info' is not an instance of email.message.MessageZplain)rÚ   r~   r   r›   r   r	  ZassertIsInstanceÚemailÚmessageZMessagerã   Zget_content_subtype)r   r´   r  Zinfo_objr   r   r   Ú	test_infoz  s   ÿ
ÿÿzTestUrlopen.test_infoc                 C   s\   |   ¡ }tj d|j ¡}| | ¡ }W d   ƒ n1 sw   Y  |  |d|j ¡ d S )Nr  )rÚ   r~   r   r›   r   r
  rã   )r   r´   r  rÖ   r   r   r   Útest_geturl…  s   
ÿzTestUrlopen.test_geturlc                 C   sB   d}|   dg |fg¡}tj d|j ¡}|D ]}|  ||¡ qd S )Nrè   rp   r  )rÚ   r~   r   r›   r   rã   )r   rä   r´   r×   Úliner   r   r   Útest_iteration  s   ÿzTestUrlopen.test_iterationc              
   C   s”   ddddd d g}d  |¡}|  dg |fg¡}tj d	|j ¡}t|ƒD ]\}}|  ||| d
|t|| ƒt|ƒf ¡ q%|  |d t|ƒ¡ d S )Ns   We
s   got
s   here
s	   verylong i    ó   
rÑ   rp   r  zQFetched line number %s doesn't match expected:
    Expected length was %s, got %sr6   )	r!   rÚ   r~   r   r›   r   Ú	enumeraterã   r_   )r   Úlinesrä   r´   r×   Úindexr  r   r   r   Útest_line_iteration”  s   
þÿzTestUrlopen.test_line_iterationc                 C   s¬   |   dg dfdg dfg¡}tj ¡ }tj d|j ¡}|  d |j¡ | |d 	d¡¡ |  d|j¡ |  d| 
d¡¡ | |d 	d¡¡ |  d	|j¡ |  d
| 
d¡¡ d S )Nrp   s   anyr  Ú1zus-asciió   1zContent-lengthZ
1234567890s
   1234567890Z10)rÚ   r~   r   r™   r  r   rã   r×   r¶   r;   Z
get_header)r   r´   r³   r   r   r   r   Útest_issue16464   s   þ
zTestUrlopen.test_issue16464r$   )r   r   r   r   rŠ   r›   rŒ   rÚ   rß   rå   ræ   rç   rì   rí   rõ   rü   rý   r  r  r  r  r  r  r  r  r  r¤   r   r   r   r   rÎ   ¹  s0    


	rÎ   c                  C   s    t  ¡ } tjt jg| ¢R Ž  d S r$   )r   Zthreading_setupÚunittestZaddModuleCleanupZthreading_cleanup)Úthread_infor   r   r   ÚsetUpModule³  s   r  Ú__main__)*rz   r¨   r  Úurllib.parser~   Zurllib.requestZhttp.serverr   r   r  r8   Ztest.supportr   r   r   rò   ÚImportErrorrc   ÚdirnameÚ__file__Úherer!   rô   rú   r   r   r   r   r   r(   ri   re   r|   ZTestCaser†   Zrequires_hashdigestr¥   rÍ   rÎ   r  r   Úmainr   r   r   r   Ú<module>   sF    ÿy,!(M+ {ÿ