a
     Rîh¯: ã                   @   s  d dl Z d dlmZ d dlmZ d dlm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mZmZmZmZmZmZmZ d dlmZ d dlZd dlZG dd„ de jƒZG d	d
„ d
e jƒZG dd„ dƒZG dd„ dƒZ G dd„ de!ƒZ"G dd„ dej#ƒZ$G dd„ dƒZ%G dd„ dƒZ&G dd„ dej'ƒZ(G dd„ dƒZ)G dd„ dƒZ*dd„ Z+dd „ Z,G d!d"„ d"ej-j.ƒZ/G d#d$„ d$ej-j0ƒZ1G d%d&„ d&ej-j.ƒZ2G d'd(„ d(ƒZ3G d)d*„ d*e jƒZ4d+d,„ Z5G d-d.„ d.e jƒZ6G d/d0„ d0e jƒZ7G d1d2„ d2e jƒZ8e9d3kre  :¡  dS )4é    N)Úsupport)Úsocket_helper)Útest_urllib)ÚRequestÚOpenerDirectorÚHTTPBasicAuthHandlerÚHTTPPasswordMgrWithPriorAuthÚ_parse_proxyÚ_proxy_bypass_winreg_overrideÚ_proxy_bypass_macosx_sysconfÚAbstractDigestAuthHandler)Úurlparsec                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTrivialTestsc              
   C   sœ   dD ]’}i }t d| |ƒ |d= |dkrdtjdkrd| d¡| d¡ }}|  |jd¡ |  |jd¡ | ¡ D ](\}}|  |jd	| d
|||jf ¡ qlqd S )N)ÚrequestÚresponseÚparseÚerrorÚrobotparserzfrom urllib.%s import *Ú__builtins__r   ÚntÚurl2pathnameÚpathname2urlZ
nturl2pathz	urllib.%sz.%r is exposed in 'urllib.%s' but defined in %r)ÚexecÚosÚnameÚpopÚassertEqualÚ
__module__Úitems)ÚselfÚmoduleÚcontextÚuÚpÚkÚv© r&   ú9/opt/python-3.9.24/usr/lib/python3.9/test/test_urllib2.pyÚtest___all__"   s    
ÿÿzTrivialTests.test___all__c                 C   sŽ   |   tjj¡ |  ttjjd¡ tj 	tjj
¡ tjd¡}tjdkrNd| }nd| }tj |¡}| ¡  W d   ƒ n1 s€0    Y  d S )Nz	bogus urlú/r   z
file:///%sú	file://%s)Ú
addCleanupÚurllibr   Ú
urlcleanupÚassertRaisesÚ
ValueErrorÚurlopenr   ÚpathÚabspathÚ__file__ÚreplaceÚsepr   Úread)r   ZfnameZfile_urlÚfr&   r&   r'   Útest_trivial1   s    

zTrivialTests.test_trivialc                 C   sR   dg d¢fdddgfdg d¢fdg d	¢fg}|D ]\}}|   tj |¡|¡ q0d S )
Nza,b,c)ÚaÚbÚczpath"o,l"og"i"cal, examplezpath"o,l"og"i"calZexampleza, b, "c", "d", "e,f", g, h)r9   r:   z"c"z"d"z"e,f"ÚgÚhza="b\"c", d="e\,f", g="h\\i")za="b"c"zd="e,f"zg="h\i")r   r,   r   Zparse_http_list)r   ÚtestsÚstringÚlistr&   r&   r'   Útest_parse_http_listD   s    

ÿÿûz!TrivialTests.test_parse_http_listc                 C   s"   t j d¡}|  |jt|ƒ¡ d S )NÚreason)r,   r   ÚURLErrorÚassertInrB   Ústr)r   Úerrr&   r&   r'   Útest_URLError_reasonstrO   s    z$TrivialTests.test_URLError_reasonstrN)Ú__name__r   Ú__qualname__r(   r8   rA   rG   r&   r&   r&   r'   r       s   r   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚRequestHdrsTestsc                 C   sD   d}|   t|ddidjd d¡ |   t|ddidjd d¡ dS )a(  
        The Request.headers dictionary is not a documented interface.  It
        should stay that way, because the complete set of headers are only
        accessible through the .get_header(), .has_header(), .header_items()
        interface.  However, .headers pre-dates those methods, and so real code
        will be using the dictionary.

        The introduction in 2.4 of those methods was a mistake for the same
        reason: code that previously saw all (urllib2 user)-provided headers in
        .headers now sees only a subset.

        úhttp://example.comú	Spam-eggsÚblah©Úheadersz	spam-EggSN)r   r   rO   )r   Úurlr&   r&   r'   Útest_request_headers_dictV   s    ÿþþÿþþz*RequestHdrsTests.test_request_headers_dictc                 C   sâ   d}t |ddid}|  | d¡¡ |  | ¡ dg¡ | dd¡ |  t| ¡ ƒddg¡ |  | d	¡¡ |  | 	d	¡¡ |  | 	d	d
¡d
¡ | 
d¡ |  | d¡¡ | dd¡ |  | d¡¡ | 
d¡ |  | d¡¡ dS )a;  
        Note the case normalization of header names here, to
        .capitalize()-case.  This should be preserved for
        backwards-compatibility.  (In the HTTP case, normalization to
        .title()-case is done by urllib2 before sending headers to
        http.client).

        Note that e.g. r.has_header("spam-EggS") is currently False, and
        r.get_header("spam-EggS") returns None, but that could be changed in
        future.

        Method r.remove_header should remove items both from r.headers and
        r.unredirected_hdrs dictionaries
        rK   rL   rM   rN   )rL   rM   zFoo-BarÚbaz)zFoo-barrR   z	Not-thereÚdefaultzUnredirected-spamZEggsN)r   Ú
assertTrueÚ
has_headerr   Zheader_itemsÚ
add_headerÚsortedÚassertFalseÚassertIsNoneÚ
get_headerZremove_headerÚadd_unredirected_header)r   rP   Úreqr&   r&   r'   Útest_request_headers_methodsk   s"    ÿ

z-RequestHdrsTests.test_request_headers_methodsc                 C   s`  t j ¡ }|j}|j}|ddddƒ |ddddƒ |dddd	ƒ |dd
ddƒ |ddddƒ |  |ddƒd¡ |  |ddƒd¡ |  |ddƒd¡ |  |ddƒd¡ |  |ddƒd¡ |  |ddƒd¡ |d	dddƒ |d	dddƒ |d	dddƒ |  |d	dƒd¡ |  |d	dƒd¡ |  |d	dƒd¡ |  |d	dƒd¡ |  |d	d ƒd¡ |  |d	d!ƒd"¡ |d	d#d$d%ƒ |  |d	d&ƒd"¡ |  |d	d#ƒd'¡ |  |d	d(ƒd'¡ |d)dd*d+ƒ |d)dd,d-ƒ |  |d)dƒd.¡ |d/dd0d/ƒ |  |d/dƒd1¡ |  |d/d2ƒd"¡ |  |dd3ƒd"¡ |  |dd4ƒd5¡ |  |ddƒd5¡ |  |dd
ƒd6¡ |  |ddƒd7¡ d S )8Nz
Some Realmúhttp://example.com/ÚjoeÚpasswordzhttp://example.com/niÚnizhttp://c.example.com:3128Ú3r;   zd.example.comÚ4Údze.example.com:3128Ú5Úeúexample.com)r_   r`   rK   zhttp://example.com/spamzhttp://example.com/spam/spamzhttp://example.com/fooÚfoozhttp://example.com/barÚbarÚninizhttp://example.com/foo/barZfoobarZnibar)rh   ra   )ri   rj   zhttp://example.com/foo/zhttp://example.com/foo/bazzhttp://example.com/foobar©NNzhttp://example.com/baz/rR   Únininizhttp://example.com/baz)rR   rl   zhttp://example.com/baz/barr:   ÚfirstrM   ÚsecondÚspam)rn   ro   r9   Ú1)rp   r9   zhttp://a.example.com/zc.example.comzc.example.com:3128)rb   r;   )rc   rd   )re   rf   ©r,   r   ZHTTPPasswordMgrÚadd_passwordÚfind_user_passwordr   ©r   ZmgrÚaddZfind_user_passr&   r&   r'   Útest_password_manager   s²    
ÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿz&RequestHdrsTests.test_password_managerc                 C   sr  t j ¡ }|j}|j}|ddddƒ |ddddƒ |d	d
ddƒ |ddddƒ |  |ddƒd¡ |  |ddƒd¡ |  |ddƒd¡ |  |ddƒd¡ |  |ddƒd¡ |  |ddƒd¡ |  |ddƒd¡ |  |ddƒd¡ |  |ddƒd¡ |  |d	dƒd¡ |  |d	d
ƒd¡ |  |d	dƒd¡ |  |ddƒd¡ |  |dd ƒd¡ |  |dd!ƒd¡ |  |dd"ƒd¡ d#S )$z±
        The point to note here is that we can't guess the default port if
        there's no scheme.  This applies to both add_password and
        find_user_password.
        r7   zhttp://g.example.com:80Ú10Újr<   zhttp://h.example.comÚ11r$   r=   zi.example.com:80Ú12ÚlÚizj.example.comÚ13Úmzg.example.com:100rk   zg.example.com:80)rw   rx   zg.example.comzhttp://g.example.com:100zhttp://g.example.comzh.example.com)ry   r$   zh.example.com:80zhttp://h.example.com:80zi.example.com)rz   r{   zhttp://i.example.com:80)r}   r~   zj.example.com:80zhttp://j.example.comzhttp://j.example.com:80Nrq   rt   r&   r&   r'   Ú"test_password_manager_default_portå   sZ    
ÿÿÿÿÿÿÿÿÿÿÿz3RequestHdrsTests.test_password_manager_default_portN)rH   r   rI   rQ   r]   rv   r   r&   r&   r&   r'   rJ   T   s   $VrJ   c                   @   s(   e Zd Zg Zdejfdd„Zdd„ ZdS )Ú
MockOpenerNc                 C   s   |||  | _ | _| _d S ©N)r\   ÚdataÚtimeout)r   r\   r‚   rƒ   r&   r&   r'   Úopen  s    zMockOpener.openc                 G   s   || | _ | _d S r   )ÚprotoÚargs)r   r…   r†   r&   r&   r'   r     s    zMockOpener.error)rH   r   rI   Ú
addheadersÚsocketÚ_GLOBAL_DEFAULT_TIMEOUTr„   r   r&   r&   r&   r'   r€     s   r€   c                   @   s(   e Zd Zddd„Zd	dd„Zdd„ ZdS )
ÚMockFileNc                 C   s   d S r   r&   ©r   Úcountr&   r&   r'   r6     s    zMockFile.readc                 C   s   d S r   r&   r‹   r&   r&   r'   Úreadline  s    zMockFile.readlinec                 C   s   d S r   r&   ©r   r&   r&   r'   Úclose   s    zMockFile.close)N)N)rH   r   rI   r6   r   r   r&   r&   r&   r'   rŠ     s   

rŠ   c                   @   s   e Zd Zdd„ ZdS )ÚMockHeadersc                 C   s   t |  ¡ ƒS r   )r@   Úvalues)r   r   r&   r&   r'   Ú
getheaders%  s    zMockHeaders.getheadersN)rH   r   rI   r’   r&   r&   r&   r'   r   $  s   r   c                   @   s&   e Zd Zddd„Zdd„ Zdd„ ZdS )	ÚMockResponseNc                 C   s.   t j | |¡ ||||f\| _| _| _| _d S r   )ÚioÚStringIOÚ__init__ÚcodeÚmsgrO   rP   )r   r—   r˜   rO   r‚   rP   r&   r&   r'   r–   *  s    zMockResponse.__init__c                 C   s   | j S r   rN   rŽ   r&   r&   r'   Úinfo.  s    zMockResponse.infoc                 C   s   | j S r   ©rP   rŽ   r&   r&   r'   Úgeturl1  s    zMockResponse.geturl)N)rH   r   rI   r–   r™   r›   r&   r&   r&   r'   r“   )  s   
r“   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚMockCookieJarc                 C   s
   || _ d S r   )Úach_req)r   r   r&   r&   r'   Úadd_cookie_header6  s    zMockCookieJar.add_cookie_headerc                 C   s   || | _ | _d S r   )Úec_reqÚec_r)r   r   r   r&   r&   r'   Úextract_cookies9  s    zMockCookieJar.extract_cookiesN)rH   r   rI   rž   r¡   r&   r&   r&   r'   rœ   5  s   rœ   c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú
FakeMethodc                 C   s   || _ || _|| _d S r   )Ú	meth_nameÚhandleÚaction)r   r£   r¥   r¤   r&   r&   r'   r–   >  s    zFakeMethod.__init__c                 G   s   | j | j| jg|¢R Ž S r   )r¤   r£   r¥   )r   r†   r&   r&   r'   Ú__call__C  s    zFakeMethod.__call__N)rH   r   rI   r–   r¦   r&   r&   r&   r'   r¢   =  s   r¢   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚMockHTTPResponsec                 C   s"   || _ || _|| _|| _d| _d S )NéÈ   )Úfpr˜   ÚstatusrB   r—   )r   r©   r˜   rª   rB   r&   r&   r'   r–   H  s
    zMockHTTPResponse.__init__c                 C   s   dS )NÚ r&   rŽ   r&   r&   r'   r6   O  s    zMockHTTPResponse.readc                 C   s   i S r   r&   rŽ   r&   r&   r'   r™   R  s    zMockHTTPResponse.infoc                 C   s   | j S r   rš   rŽ   r&   r&   r'   r›   U  s    zMockHTTPResponse.geturlN)rH   r   rI   r–   r6   r™   r›   r&   r&   r&   r'   r§   G  s   r§   c                   @   sT   e Zd Zdd„ Zejfdd„Zdd„ Zddd	„Zdd
dœdd„Z	dd„ Z
dd„ ZdS )ÚMockHTTPClassc                 C   s(   d| _ g | _d | _d| _d | _i | _d S )Nr   F)ÚlevelÚreq_headersr‚   Úraise_on_endheadersÚsockÚ_tunnel_headersrŽ   r&   r&   r'   r–   Z  s    zMockHTTPClass.__init__c                 C   s   || _ || _| S r   )Úhostrƒ   )r   r²   rƒ   r&   r&   r'   r¦   b  s    zMockHTTPClass.__call__c                 C   s
   || _ d S r   )r­   )r   r­   r&   r&   r'   Úset_debuglevelg  s    zMockHTTPClass.set_debuglevelNc                 C   s&   || _ || _|r|| _n
| j ¡  d S r   )Ú_tunnel_hostZ_tunnel_portr±   Úclear)r   r²   ÚportrO   r&   r&   r'   Ú
set_tunnelj  s
    zMockHTTPClass.set_tunnelF)Úencode_chunkedc                C   sP   || _ || _|d ur&|  j| ¡ 7  _| j ¡  |r:|| _|| _| jrLtƒ ‚d S r   )	ÚmethodÚselectorr®   r   Úsortr‚   r¸   r¯   ÚOSError)r   r¹   rP   ÚbodyrO   r¸   r&   r&   r'   r   r  s    
zMockHTTPClass.requestc                 C   s   t tƒ i ddƒS )Nr¨   ÚOK)r§   rŠ   rŽ   r&   r&   r'   Úgetresponse  s    zMockHTTPClass.getresponsec                 C   s   d S r   r&   rŽ   r&   r&   r'   r   ‚  s    zMockHTTPClass.close)NN)NN)rH   r   rI   r–   rˆ   r‰   r¦   r³   r·   r   r¿   r   r&   r&   r&   r'   r¬   Y  s   
ÿr¬   c                   @   s@   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S )ÚMockHandleréô  c                 C   s   |   |¡ d S r   )Ú_define_methods)r   Úmethodsr&   r&   r'   r–   ‹  s    zMockHandler.__init__c                 C   sJ   |D ]@}t |ƒdkr|\}}n
|d  }}t||| jƒ}t| j||ƒ qd S )Né   )Úlenr¢   r¤   ÚsetattrÚ	__class__)r   rÃ   Úspecr   r¥   Úmethr&   r&   r'   rÂ   Ž  s    

zMockHandler._define_methodsc                 O   sà   | j j | |||f¡ |d u r"d S |dkr.| S |dkrHtddi dƒ}|S |dkrXtdƒS | d¡rÀ|| d	¡d
 d … }zt|ƒ}W n ty–   Y n0 tddi dƒ}| j  	d|d ||di ¡S |dkrÔt
j	 d¡‚dsÜJ ‚d S )Núreturn selfúreturn responser¨   r¾   r«   úreturn requestzhttp://blah/r   ú é   Úhttpr   ÚraiserM   F)ÚparentÚcallsÚappendr“   r   Ú
startswithÚrfindÚintr/   r   r,   rC   )r   Zfn_namer¥   r†   ÚkwdsÚresr—   r&   r&   r'   r¤   —  s*    
zMockHandler.handlec                 C   s   d S r   r&   rŽ   r&   r&   r'   r   ®  s    zMockHandler.closec                 C   s   || _ g | j _d S r   )rÑ   rÒ   )r   rÑ   r&   r&   r'   Ú
add_parent±  s    zMockHandler.add_parentc                 C   s   t |dƒsdS | j|jk S )NÚhandler_orderT)ÚhasattrrÚ   )r   Úotherr&   r&   r'   Ú__lt__µ  s    
zMockHandler.__lt__N)
rH   r   rI   rÚ   r–   rÂ   r¤   r   rÙ   rÝ   r&   r&   r&   r'   rÀ   †  s   	rÀ   c                 C   sb   g }d}|D ]P}G dd„ dt ƒ}||ƒ}| j|7  _| | ¡ |d }| |¡ |  |¡ q|S )a¯  Create MockHandlers and add them to an OpenerDirector.

    meth_spec: list of lists of tuples and strings defining methods to define
    on handlers.  eg:

    [["http_error", "ftp_open"], ["http_open"]]

    defines methods .http_error() and .ftp_open() on one handler, and
    .http_open() on another.  These methods just record their arguments and
    return None.  Using a tuple instead of a string causes the method to
    perform some action (see MockHandler.handle()), eg:

    [["http_error"], [("http_open", "return request")]]

    defines .http_error() on one handler (which simply returns None), and
    .http_open() on another handler, which returns a Request object.

    r   c                   @   s   e Zd ZdS )z6add_ordered_mock_handlers.<locals>.MockHandlerSubclassN©rH   r   rI   r&   r&   r&   r'   ÚMockHandlerSubclassÒ  s   rß   rÎ   )rÀ   rÚ   rÙ   rÓ   Úadd_handler)ÚopenerÚ	meth_specÚhandlersrŒ   Úmethsrß   r=   r&   r&   r'   Úadd_ordered_mock_handlers¼  s    

rå   c                  G   s   t ƒ }| D ]}| |¡ q
|S r   )r   rà   )Zhandler_instancesrá   r=   r&   r&   r'   Úbuild_test_openerÞ  s    ræ   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚMockHTTPHandlerc                 C   s   || _ || _|  ¡  d S r   )r—   rO   Úreset)r   r—   rO   r&   r&   r'   r–   é  s    zMockHTTPHandler.__init__c                 C   s   d| _ g | _d S )Nr   )Ú_countÚrequestsrŽ   r&   r&   r'   rè   î  s    zMockHTTPHandler.resetc                 C   s”   dd l }dd l}| j | |¡¡ | jdkrl| jd | _tjj| j	 }| 
| j¡}| j d|tƒ | j	||¡S || _| 
d¡}tdd|d| ¡ ƒS d S )Nr   rÎ   rÏ   ú

r¨   r¾   r«   )ÚemailÚcopyrê   rÓ   Údeepcopyré   rÏ   ÚclientÚ	responsesr—   Zmessage_from_stringrO   rÑ   r   rŠ   r\   r“   Úget_full_url)r   r\   rì   rí   r   r˜   r&   r&   r'   Ú	http_openò  s    
ÿ
zMockHTTPHandler.http_openN©rH   r   rI   r–   rè   rò   r&   r&   r&   r'   rç   å  s   rç   c                   @   s   e Zd Zddd„Zdd„ ZdS )ÚMockHTTPSHandlerr   c                 C   s   t jjj| |d tƒ | _d S )N©Ú
debuglevel)r,   r   ÚAbstractHTTPHandlerr–   r¬   Úhttpconn)r   rö   r&   r&   r'   r–     s    zMockHTTPSHandler.__init__c                 C   s   |   | j|¡S r   )Údo_openrø   ©r   r\   r&   r&   r'   Ú
https_open	  s    zMockHTTPSHandler.https_openN)r   )rH   r   rI   r–   rû   r&   r&   r&   r'   rô     s   
rô   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚMockHTTPHandlerCheckAuthc                 C   s   || _ d| _d S ©NF)r—   Úhas_auth_header)r   r—   r&   r&   r'   r–     s    z!MockHTTPHandlerCheckAuth.__init__c                 C   s
   d| _ d S rý   )rþ   rŽ   r&   r&   r'   rè     s    zMockHTTPHandlerCheckAuth.resetc                 C   s6   |  d¡rd| _tjj| j }t| j|tƒ d| ¡ ƒS )NÚAuthorizationTr«   )	rU   rþ   rÏ   rï   rð   r—   r“   rŠ   rñ   )r   r\   r   r&   r&   r'   rò     s    
z"MockHTTPHandlerCheckAuth.http_openNró   r&   r&   r&   r'   rü     s   rü   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚMockPasswordManagerc                 C   s   || _ || _|| _|| _d S r   )ÚrealmrP   Úuserr`   )r   r  Zurir  r`   r&   r&   r'   rr   !  s    z MockPasswordManager.add_passwordc                 C   s   || _ || _| j| jfS r   )Útarget_realmÚ
target_urlr  r`   )r   r  Zauthurir&   r&   r'   rs   '  s    z&MockPasswordManager.find_user_passwordN)rH   r   rI   rr   rs   r&   r&   r&   r'   r      s   r   c                   @   sD   e 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S )ÚOpenerDirectorTestsc                 C   s(   G dd„ dt ƒ}|  ttƒ j|ƒ ¡ d S )Nc                   @   s   e Zd ZdS )z<OpenerDirectorTests.test_add_non_handler.<locals>.NonHandlerNrÞ   r&   r&   r&   r'   Ú
NonHandler0  s   r  )Úobjectr.   Ú	TypeErrorr   rà   )r   r  r&   r&   r'   Útest_add_non_handler/  s    
ÿz(OpenerDirectorTests.test_add_non_handlerc                 C   s\   ddl m} tƒ }ddgdgg}t||ƒ | tj ¡ ¡ dD ]}|  ||j	|d ¡ q>d S )Nr   )rC   )rù   rÊ   )Z
proxy_openrÊ   )Zredirect_requestrÊ   )ZdoÚproxyÚredirectz://example.com/)
Úurllib.errorrC   r   rå   rà   r,   r   ZUnknownHandlerr.   r„   )r   rC   Úorâ   Úschemer&   r&   r'   Útest_badly_named_methods5  s    	þ
z,OpenerDirectorTests.test_badly_named_methodsc                 C   s¤   t ƒ }g d¢dgdgdgg}t||ƒ}tdƒ}| |¡}|  ||d ¡ |d df|d dfg}t||jƒD ]2\}}|\}	}
}}|  |	|
f|¡ |  ||f¡ qld S )N)rò   Úftp_openÚhttp_error_302r  ©rò   rÊ   r^   rÄ   r   rò   )r   rå   r   r„   r   ÚziprÒ   )r   r  râ   rã   r\   ÚrrÒ   ÚexpectedÚgotÚhandlerr   r†   r×   r&   r&   r'   Útest_handledJ  s    ü

z OpenerDirectorTests.test_handledc                 C   sœ   t ƒ }g }dgdfdgdffD ]:\}}G dd„ dtƒ}||ƒ}||_| |¡ | |¡ q| d¡ |  |jd d |d ¡ |  |jd d |d ¡ d S )	Nr  rÁ   rò   r   c                   @   s   e Zd ZdS )zCOpenerDirectorTests.test_handler_order.<locals>.MockHandlerSubclassNrÞ   r&   r&   r&   r'   rß   i  s   rß   r^   rÎ   )r   rÀ   rÚ   rÓ   rà   r„   r   rÒ   )r   r  rã   rä   rÚ   rß   r=   r&   r&   r'   Útest_handler_orderd  s    ÿ

z&OpenerDirectorTests.test_handler_orderc                 C   sZ   t ƒ }dgdgg}t||ƒ}tdƒ}|  tjj|j|¡ |  |j	|d d|fi fg¡ d S )N)rò   rÐ   r  r^   r   rò   )
r   rå   r   r.   r,   r   rC   r„   r   rÒ   )r   r  râ   rã   r\   r&   r&   r'   Ú
test_raisev  s    þ
zOpenerDirectorTests.test_raisec                 C   sÂ   t ƒ }dgddgg d¢dgg}t||ƒ}tdƒ}| |¡ t|jƒdksLJ ‚|d d|ff|d d|tjd	d
i ffg}t||jƒD ]:\}}|\}}	}
|  	||	f|d d… ¡ |  	|
|d ¡ q‚d S )N)rò   z	error 302)Zhttp_error_400rÐ   rò   ))r  rË   Zhttp_error_303Z
http_errorr  r^   rÄ   r   é.  r«   )
r   rå   r   r„   rÅ   rÒ   r   Z	ALWAYS_EQr  r   )r   r  râ   rã   r\   rÒ   r  r  r  Zmethod_namer†   r&   r&   r'   Útest_http_errorƒ  s&    û

ÿÿ
z#OpenerDirectorTests.test_http_errorc                 C   s  t ƒ }ddgddgg}t||ƒ}tdƒ}| |¡ |d df|d df|d df|d dfg}t|jƒD ]ž\}\}}}	}
|dk r¶|  ||f|| ¡ |  t|	ƒd¡ |  |	d t¡ qh|  ||f|| ¡ |  t|	ƒd¡ |  |	d t¡ |	d d urh|  |	d t	¡ qhd S )	N)Úhttp_requestrÌ   )Úhttp_responserË   r^   r   r  rÎ   r  rÄ   )
r   rå   r   r„   Ú	enumeraterÒ   r   rÅ   ZassertIsInstancer“   )r   r  râ   rã   r\   rÒ   r|   r  r   r†   r×   r&   r&   r'   Útest_processorsš  s0    ÿÿý

þz#OpenerDirectorTests.test_processorsN)
rH   r   rI   r	  r  r  r  r  r  r   r&   r&   r&   r'   r  -  s   r  c                 C   s\   z|   d¡ W n ty*   t d¡‚Y n0 tj | ¡}tjdkrX| 	d¡rX|dd … }|S )Nzutf-8zpath is not encodable to utf8r   z///rÄ   )
ÚencodeÚUnicodeEncodeErrorÚunittestZSkipTestr,   r   r   r   r   rÔ   )r1   Úurlpathr&   r&   r'   Úsanepathname2url¾  s    r%  c                   @   sx  e 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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/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Ze  e!j"d9kd:¡d;d<„ ƒZ#e  e$j%d=kd>¡d?d@„ ƒZ&dAdB„ Z'dCdD„ Z(dEdF„ Z)dGdH„ Z*dIdJ„ Z+dKdL„ Z,dMdN„ Z-dOdP„ Z.dQdR„ Z/dSdT„ Z0dUdV„ Z1dWS )XÚHandlerTestsc                    s®  G dd„ dƒ‰ G ‡ fdd„dt jjƒ}dd l}d}||ƒ}tƒ |_dd|jd	d	d
ddgddf	dd|jdd	d
ddgddf	dd|jdd	d
ddgddf	dd|jdd	d
ddgddf	dddd	d	dddgd	d f	dd|jd	d	dg dd f	fD ]Ì\	}}}}}	}
}}}t|ƒ}d |_| 	|¡}|  
|j|¡ |  
|j|	¡ |  
|jt |¡¡ |  
|j|¡ |  
|j|¡ |  
|jj|¡ |  
|jj|
¡ | ¡ }|  
| d¡|¡ |  
t|d ƒt|ƒ¡ qÜd S )Nc                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )z-HandlerTests.test_ftp.<locals>.MockFTPWrapperc                 S   s
   || _ d S r   ©r‚   ©r   r‚   r&   r&   r'   r–   Î  s    z6HandlerTests.test_ftp.<locals>.MockFTPWrapper.__init__c                 S   s$   || | _ | _t | j¡t| jƒfS r   )ÚfilenameÚfiletyper”   r•   r‚   rÅ   )r   r)  r*  r&   r&   r'   ÚretrfileÑ  s    z6HandlerTests.test_ftp.<locals>.MockFTPWrapper.retrfilec                 S   s   d S r   r&   rŽ   r&   r&   r'   r   Õ  s    z3HandlerTests.test_ftp.<locals>.MockFTPWrapper.closeN)rH   r   rI   r–   r+  r   r&   r&   r&   r'   ÚMockFTPWrapperÍ  s   r,  c                       s&   e Zd Zdd„ Zejf‡ fdd„	ZdS )z-HandlerTests.test_ftp.<locals>.NullFTPHandlerc                 S   s
   || _ d S r   r'  r(  r&   r&   r'   r–   Ù  s    z6HandlerTests.test_ftp.<locals>.NullFTPHandler.__init__c                    s4   || | _ | _|| | _| _|| _ˆ | jƒ| _| jS r   )r  Úpasswdr²   r¶   Údirsr‚   Ú
ftpwrapper)r   r  r-  r²   r¶   r.  rƒ   ©r,  r&   r'   Úconnect_ftpÜ  s
    z9HandlerTests.test_ftp.<locals>.NullFTPHandler.connect_ftpN)rH   r   rI   r–   rˆ   r‰   r1  r&   r0  r&   r'   ÚNullFTPHandlerØ  s   ÿr2  r   zrheum rhaponicumz ftp://localhost/foo/bar/baz.htmlÚ	localhostr«   ÚIrh   ri   zbaz.htmlz	text/htmlz'ftp://parrot@localhost/foo/bar/baz.htmlZparrotz*ftp://%25parrot@localhost/foo/bar/baz.htmlz%parrotz,ftp://%2542parrot@localhost/foo/bar/baz.htmlz	%42parrotzftp://localhost:80/foo/bar/éP   ÚDzftp://localhost/baz.gif;type=aÚAzbaz.gifúContent-typeúContent-length)r,   r   Z
FTPHandlerÚftplibr€   rÑ   ZFTP_PORTr   rƒ   r  r   r  r-  r²   rˆ   Úgethostbynamer¶   r.  r/  r)  r*  r™   ÚgetrÖ   rÅ   )r   r2  r:  r‚   r=   rP   r²   r¶   r  r-  Útype_r.  r)  Zmimetyper\   r  rO   r&   r0  r'   Útest_ftpÌ  sX    
þ
þ
þ
þ

þþð
zHandlerTests.test_ftpc              
   C   sº  dd l }tj ¡ }tƒ  }|_tj}tt	j
 |¡ƒ}d}d| d| dt d¡|f g}zt t ¡ ¡}W n tjy‚   d}Y n0 |rš| d||f ¡ |D ]î}	t|dƒ}
zŠz|
 |¡ W |
 ¡  n
|
 ¡  0 | t|	ƒ¡}z$| ¡ }| ¡ }| ¡ }W | ¡  n
| ¡  0 t	 |¡}|jj|jd	d
}W t	 |¡ nt	 |¡ 0 |  ||¡ |  |d d¡ |  |d d¡ |  |d |¡ |  ||	¡ qžd| dddt d¡t	 ¡ |f dt	 ¡ |f fD ]f}	zRt|dƒ}
z|
 |¡ W |
 ¡  n
|
 ¡  0 |   tj!j"|jt|	ƒ¡ W t	 |¡ nt	 |¡ 0 qÀtj ¡ }tƒ  }|_dD ]r\}	}t|	ƒ}z| |¡ W n" tj!j"y‚   |  #|¡ Y n0 |  $|j%|¡ |  |j&d¡ |  |j&dk|¡ qBd S )Nr   s   hello, world
zfile://localhost%sr*   zfile://%s%sr3  r«   ÚwbT)Zusegmtr8  z
text/plainr9  r}   zLast-modifiedzfile://localhost:80%szfile:///file_does_not_exist.txtz)file://not-a-local-host.com//dir/file.txtzfile://%s:80%s/%sz,file://somerandomhost.ontheinternet.com%s/%s))zfile://ftp.example.com//foo.txtF)z file://ftp.example.com///foo.txtF)zfile://ftp.example.com/foo.txtF)z"file://somehost//foo/something.txtF)z#file://localhost//foo/something.txtFÚftp)'Zemail.utilsr,   r   ÚFileHandlerr€   rÑ   r   ÚTESTFNr%  r   r1   r2   rˆ   r;  ÚgethostnameÚgaierrorrÓ   r„   Úwriter   Z	file_openr   r6   r™   r›   ÚstatZutilsZ
formatdateÚst_mtimeÚremover   Úgetcwdr.   r   rC   rX   ÚassertIsr\   Útype)r   rì   r=   r  rB  r$  ZtowriteÚurlsZ	localaddrrP   r7   r  r‚   rO   ZrespurlZstatsZmodifiedr@  r\   r&   r&   r'   Ú	test_file  s„    
ý




ÿ
ÿú	


ÿ
zHandlerTests.test_filec                 C   sf  t j ¡ }tƒ  }|_d}dD ]â\}}t||ddiƒ}d |_| dd¡ tƒ }| 	||¡}|j
 |j |j |j |j|jdkdf | ¡ }	|	j |	j |  | ¡ |¡ |  |jd	¡ |  |jd
¡ |  |j|¡ |  |jd¡ |  |jg d¢¡ |  |j|¡ qd|_|  t jj|j	||¡ tddƒ}|  t|j|¡ dg|_dD ]}td|ƒ}t ddi dƒ}| |¡}
|d u r”|  !d|j"¡ |  !d|j"¡ n$|  |j"d d¡ |  |j"d d¡ |  |j"d d	¡ |  |j"d d¡ | dd¡ | dd¡ | dd¡ | dd¡ | |¡}
|  |j"d d¡ |  |j"d d¡ |  |j"d d¡ |  |j"d d¡ qDd S )Nr^   ))ÚGETN)ÚPOSTs   blahÚFoori   ÚSpamÚeggsr¨   r¾   rg   r   r)   ))Ú
Connectionr   )rP  ri   ©rQ  rR  TZbadpostrT  )ó    Nr«   r9  r8  Ú0z!application/x-www-form-urlencodedÚHostrh   rR   )#r,   r   r÷   r€   rÑ   r   rƒ   r[   r¬   rù   r6   r   r™   r›   r—   r˜   r<  Ú__contains__r   r²   r­   r¹   rº   r®   r‚   r¯   r.   r   rC   r  Údo_request_r‡   r“   ÚassertNotInÚunredirected_hdrs)r   r=   r  rP   r¹   r‚   r\   rÏ   r  ÚhdrsÚnewreqr&   r&   r'   Ú	test_httph  sd    
ÿ




ÿ
zHandlerTests.test_httpc           	      C   s  t j ¡ }tƒ  }|_tjddd}|j}| ¡  |  	t
j|¡ t|dƒL}td|i ƒ}| |¡}| d¡}|  |d¡ |  | d¡¡ W d   ƒ n1 sœ0    Y  t|dƒP}td|d	d
iƒ}| |¡}|  t| d¡ƒd
¡ |  | d¡¡ W d   ƒ n1 s0    Y  d S )Nzw+bF)ÚmodeÚdeleteÚrbr^   úTransfer-encodingÚchunkedr9  úContent-Lengthé   )r,   r   r÷   r€   rÑ   ÚtempfileÚNamedTemporaryFiler   r   r+   r   Úunlinkr„   r   rY  rZ   r   rX   rU   rÖ   )	r   r=   r  Úfile_objZ	file_pathr7   r\   r]  Úter&   r&   r'   Útest_http_body_fileª  s"    


.
z HandlerTests.test_http_body_filec                 C   s¦   t j ¡ }tƒ  }|_t ¡ }td|i ƒ}| |¡}|  	| 
d¡d¡ |  | d¡¡ ddi}td||ƒ}| |¡}|  	t| 
d¡ƒd¡ |  | d¡¡ | ¡  d S )Nr^   rb  rc  r9  rd  re  )r,   r   r÷   r€   rÑ   r”   ÚBytesIOr   rY  r   rZ   rX   rU   rÖ   r   )r   r=   r  ri  r\   r]  rO   r&   r&   r'   Útest_http_body_fileobjÃ  s    


z#HandlerTests.test_http_body_fileobjc              	   C   sÀ   t j ¡ }tƒ  }|_tjddg}i ddifD ]Œ}tj|tj	dh}t
d|j|ƒ}| |¡}|s†|  | d¡d ¡ |  | d¡d	¡ n|  t| d¡ƒd¡ W d   ƒ q.1 s°0    Y  q.d S )
Nz-cÚpassrd  re  )Ústdoutr^   r9  rb  rc  )r,   r   r÷   r€   rÑ   ÚsysÚ
executableÚ
subprocessÚPopenÚPIPEr   ro  rY  r   rZ   rÖ   )r   r=   r  ÚcmdrO   Úprocr\   r]  r&   r&   r'   Útest_http_body_pipeÚ  s    

ÿÿz HandlerTests.test_http_body_pipec                 C   sŒ   t j ¡ }tƒ  }|_dd„ }i ddifD ]\}td|ƒ |ƒ}| |¡}|sp|  | d¡d ¡ |  | d¡d¡ q*|  t	| d¡ƒd¡ q*d S )	Nc                   s   s
   dV  d S )Ns   oner&   r&   r&   r&   r'   Úiterable_body÷  s    z;HandlerTests.test_http_body_iterable.<locals>.iterable_bodyrd  é   r^   r9  rb  rc  )
r,   r   r÷   r€   rÑ   r   rY  r   rZ   rÖ   )r   r=   r  rx  rO   r\   r]  r&   r&   r'   Útest_http_body_iterableð  s    

ÿz$HandlerTests.test_http_body_iterablec                 C   sH   t j ¡ }tƒ |_| tddƒ¡}|  | d¡d¡ |  	| 
d¡¡ d S )Nr^   r&   rb  rc  r9  )r,   r   r÷   r€   rÑ   rY  r   r   rZ   rX   rU   )r   r=   r\   r&   r&   r'   Útest_http_body_empty_seq  s
    
z%HandlerTests.test_http_body_empty_seqc                 C   sh   t j ¡ }tƒ  }|_t dg d¢¡}i ddifD ]0}td||ƒ}| |¡}|  t	| 
d¡ƒd¡ q2d S )Nr4  )rÎ   rÄ   é   é   rd  é   r^   r9  )r,   r   r÷   r€   rÑ   Úarrayr   rY  r   rÖ   rZ   )r   r=   r  Ziterable_arrayrO   r\   r]  r&   r&   r'   Útest_http_body_array  s    

z!HandlerTests.test_http_body_arrayc                 C   s6   t ƒ }tdd}| |¡ | d¡ |  |jd¡ d S )NrÎ   rõ   zhttps://www.example.com)r   rô   rà   r„   r   Z_debuglevel)r   r  r=   r&   r&   r'   Útest_http_handler_debuglevel  s
    


z)HandlerTests.test_http_handler_debuglevelc                 C   sz   t j ¡ }tƒ |_d}g d¢}|D ]R}t||ƒ}| |¡}|  |jd d¡ | 	dd ¡ | |¡}|  |jd d¡ q"d S )NrU  )z#http://example.com/foo/bar/baz.htmlz$http://example.com//foo/bar/baz.htmlz$http://example.com/foo//bar/baz.htmlz$http://example.com/foo/bar//baz.htmlrW  rg   zsomeproxy:3128)
r,   r   r÷   r€   rÑ   r   rY  r   r[  Ú	set_proxy)r   r=   r‚   Zds_urlsZds_urlZds_reqZ	np_ds_reqZp_ds_reqr&   r&   r'   Útest_http_doubleslash   s    



z"HandlerTests.test_http_doubleslashc                 C   sh   g d¢}t dƒ}|D ]N}||_t|ƒ}|  | ¡ |¡ |  |jpBd|j¡ |  t| ¡ ƒj|j¡ qd S )N)zhttp://example.com?foo=bar#bazz)http://example.com?foo=bar&spam=eggs#bashrK   rK   r«   )r   Úfull_urlr   r   rñ   ÚfragmentÚquery)r   rL  r  rP   Úparsedr&   r&   r'   Útest_full_url_setter;  s    z!HandlerTests.test_full_url_setterc                 C   s6   t dƒ}|`|  |j¡ |  |j¡ |  |jd¡ d S )Núhttp://www.example.comr«   )r   r„  rY   r…  r   rº   )r   r  r&   r&   r'   Útest_full_url_deleterR  s
    z"HandlerTests.test_full_url_deleterc                 C   sz   t j ¡ }tƒ |_d}t|ƒ}| |¡}|  |jd¡ |  |j	d¡ d}t|ƒ}| |¡}|  |jd¡ |  |j	d¡ d S )Nzhttp://www.python.org?getspamúwww.python.orgz	/?getspamúhttp://www.python.orgr«   )
r,   r   r÷   r€   rÑ   r   rY  r   r²   rº   )r   r=   Z	weird_urlr\   r]  Zurl_without_pathr&   r&   r'   Útest_fixpath_in_weirdurlsY  s    


z&HandlerTests.test_fixpath_in_weirdurlsc                 C   s  t j ¡ }tƒ  }|_d}t|ƒ}tddi d|ƒ}| ||¡}|  ||¡ |  	t
|dƒ¡ tddi d|ƒ}| ||¡}|  ||¡ |  	t
|dƒ¡ tdd	i d|ƒ}| ||¡}|  ||¡ |  	t
|dƒ¡ td
di d|ƒ}|  | ||¡¡ |  |jd¡ |  |j||d
di f¡ d S )Nr^   r¨   r¾   r«   r…   éÊ   ZAcceptedéÎ   zPartial contentiö  zBad gatewayrÏ   )r,   r   ZHTTPErrorProcessorr€   rÑ   r   r“   r  rJ  rX   rÛ   rY   r   r…   r†   )r   r=   r  rP   r\   r  Únewrr&   r&   r'   Útest_errorsl  s(    
zHandlerTests.test_errorsc                 C   s¨   t ƒ }tj |¡}tƒ |_tdƒ}tddi dƒ}| |¡}|  	|j
|¡ |  	|j
|¡ |  |jd¡ |  |j¡ | ||¡}|  	|j|¡ |  	|j|¡ |  	||¡ d S )Nr^   r¨   r¾   r«   rg   )rœ   r,   r   ÚHTTPCookieProcessorr€   rÑ   r   r“   r  rJ  r   r   Úorigin_req_hostrX   Zunverifiabler  rŸ   r    )r   Úcjr=   r\   r  r]  r  r&   r&   r'   Útest_cookies…  s    
zHandlerTests.test_cookiesc              
   C   sd  d}d}t j ¡ }tƒ  }|_dD ]Z}dD ]N}t|d| ƒ}t||ƒ}tj|_	| 
dd¡ |d urz| 
dtt|ƒƒ¡ | d	d
¡ z||tƒ |dtd|iƒƒ W n, t jjyÐ   |  |d¡ |  |¡ Y n0 |  |j ¡ |¡ z|  |j ¡ d¡ W n" ty   |  |jj¡ Y n0 dd„ |jjD ƒ}	|  d|	¡ |  d|	¡ |  |jjd d¡ |  d	|jj¡ |  d	|jj¡ q,q"t|ƒ}tj|_	|fdd„}
t|dd}d}tj|_	z|
||dƒ |d }q¶W n* t jjyú   |  |t jjj¡ Y n0 t|dd}d}tj|_	z |
||d| ƒ |d }qW n* t jjy^   |  |t jjj¡ Y n0 d S )Núhttp://example.com/a.htmlzhttp://example.com/b.html)i-  r  i/  é3  )Nz
blah
blah
zhttp_error_%sZNonsensezviking=withholdrd  rQ  ro   ÚBlahÚlocationr—  rN  c                 S   s   g | ]}|  ¡ ‘qS r&   )Úlower)Ú.0Úxr&   r&   r'   Ú
<listcomp>µ  rU  z.HandlerTests.test_redirect.<locals>.<listcomp>zcontent-lengthzcontent-typec              	   S   s    |   |tƒ ddtd|iƒ¡ d S )Nr  r˜  r™  )r  rŠ   r   )r=   r\   rP   r&   r&   r'   r  Â  s    
ÿz,HandlerTests.test_redirect.<locals>.redirectrg   )r“  r   r^   rÎ   zhttp://example.com/%d)r,   r   ÚHTTPRedirectHandlerr€   rÑ   Úgetattrr   rˆ   r‰   rƒ   rV   rE   rÅ   r[   rŠ   r   r   Ú	HTTPErrorr   ÚassertIsNotNoner\   rñ   Ú
get_methodÚAttributeErrorrX   r‚   rO   rZ  r[  Zmax_repeatsZmax_redirections)r   Úfrom_urlZto_urlr=   r  r—   r‚   r¹   r\   rO   r  rŒ   r&   r&   r'   Útest_redirect–  sl    




ÿÿÿzHandlerTests.test_redirectc                 C   sÂ   d}g d¢}g d¢}d}t j ¡ }tƒ  }|_t|ƒ}tj|_|D ]6}|d | }	|  	t j
j|j|tƒ ddtd|	iƒ¡ qB|D ]>}|d | }
| |tƒ dd	td|
iƒ¡ |  |j ¡ |
¡ q~d S )
Nr–  )rÏ   Úhttpsr@  )ÚfileÚimapZldapzexample.com/b.htmlz://r  zSecurity Loopholer™  úThat's fine)r,   r   rž  r€   rÑ   r   rˆ   r‰   rƒ   r.   r   r   r  rŠ   r   r   r\   rñ   )r   r¤  Zvalid_schemesZinvalid_schemesZschemeless_urlr=   r  r\   r  Zinvalid_urlÚ	valid_urlr&   r&   r'   Útest_invalid_redirectà  s(    


þ
ÿz"HandlerTests.test_invalid_redirectc              	   C   sn   d}d}t j ¡ }tƒ  }|_t|ƒ}tj|_t j	 
||¡}| |tƒ ddtd|iƒ¡ |  |j ¡ |¡ d S )Nr–  z/b.htmlr  r©  r™  )r,   r   rž  r€   rÑ   r   rˆ   r‰   rƒ   r   Úurljoinr  rŠ   r   r   r\   rñ   )r   r¤  Zrelative_urlr=   r  r\   rª  r&   r&   r'   Útest_relative_redirectö  s    

ÿz#HandlerTests.test_relative_redirectc           	      C   s‚   ddl m} ddlm} |ƒ }||ddƒ tddƒ}tj ¡ }tj ¡ }tj 	|¡}t
||||ƒ}| d¡ |  |j d¡¡ d S )	Nr   )Ú	CookieJar)Úinteract_netscapezhttp://www.example.com/z	spam=eggsr  z%Location: http://www.cracker.com/

ÚCookie)Zhttp.cookiejarr®  Ztest.test_http_cookiejarr¯  rç   r,   r   ÚHTTPDefaultErrorHandlerrž  r’  ræ   r„   rX   r\   rU   )	r   r®  r¯  r”  ÚhhÚhdehÚhrhZcpr  r&   r&   r'   Útest_cookie_redirect  s    



z!HandlerTests.test_cookie_redirectc                 C   sT   d}t dd| ƒ}tj ¡ }tj ¡ }t|||ƒ}| d¡}|  | ¡ | 	¡ ¡ d S )Nz(http://www.example.com/index.html#OK

r  z
Location: r‰  )
rç   r,   r   r±  rž  ræ   r„   r   r›   Ústrip)r   Zredirected_urlr²  r³  r´  r  r©   r&   r&   r'   Útest_redirect_fragment  s    


z#HandlerTests.test_redirect_fragmentc                    s|   ˆ  tjj¡ tjj‰ d}t |¡tj_ˆ  t	tjdˆ ¡ t
dƒ‰‡ ‡‡fdd„}|tjj_tj d¡}ˆ | ¡ d¡ d S )Ns(   HTTP/1.1 302 Found
Location: ?query

ÚHTTPConnection)z/pathz/path?queryc                    s8   ˆ  |tˆƒ¡ ˆ j| ||g|¢R i |¤Ž d| j_d S )Ns   HTTP/1.1 200 OK

Hello!)r   Únextr   rÇ   Zfakedata)Úconnr¹   rP   ÚposÚkw©Z
real_classr   rL  r&   r'   r   &  s    z3HandlerTests.test_redirect_no_path.<locals>.requestzhttp://python.org/pathzhttp://python.org/path?query)r+   r,   r   r-   rÏ   rï   r¸  r   ÚfakehttprÆ   Úiterr0   r   r›   )r   Z	response1r   r©   r&   r½  r'   Útest_redirect_no_path  s    
z"HandlerTests.test_redirect_no_pathc           
   	   C   s°   G dd„ dt jjƒ}|ƒ }t j |¡}d}|D ]|\}}|  t|ƒ¡V t d| d ¡|_| 	d¡}d| d }|j
}	|  |	 |¡t|	ƒ¡ W d   ƒ q.1 s 0    Y  q.d S )	Nc                   @   s   e Zd Zdd„ ZdS )z4HandlerTests.test_redirect_encoding.<locals>.Handlerc                 S   s(   |   | j|¡}| jj| _t d¡| _|S )Ns)   HTTP/1.1 200 OK
Content-Length: 3

123)rù   Ú
connectionÚbufÚlast_bufr   r¾  )r   r\   Úresultr&   r&   r'   rò   3  s    
ÿz>HandlerTests.test_redirect_encoding.<locals>.Handler.http_openN)rH   r   rI   rò   r&   r&   r&   r'   ÚHandler2  s   rÅ  ))s   /pÃ¥-dansk/s   /p%C3%A5-dansk/)ó   /spaced%20path/rÆ  )s   /spaced path/rÆ  )s   /?pÃ¥-dansks   /?p%C3%A5-dansks!   HTTP/1.1 302 Redirect
Location: s   

r^   s   GET ó    )r,   r   ÚHTTPHandlerÚbuild_openerÚsubTestÚreprr   r¾  rÁ  r„   rÃ  rT   rÔ   )
r   rÅ  r  rá   r>   r™  rÄ  r   r  r   r&   r&   r'   Útest_redirect_encoding/  s"    ÿÿÿ
z#HandlerTests.test_redirect_encodingc                 C   s    d}t |dt |dfD ]‚}tƒ }tj |¡}| |¡ dgg}t||ƒ}tdƒ}|  |j	d¡ | 
|¡ |  |j	|¡ |  |d dfgd	d
„ |jD ƒ¡ qd S )Núproxy.example.com:3128©rÏ   )ZHTTP)rò   rË   zhttp://acme.example.com/zacme.example.comr   rò   c                 S   s   g | ]}|d d… ‘qS ©r   rÄ   r&   ©r›  Útupr&   r&   r'   r  b  rU  z+HandlerTests.test_proxy.<locals>.<listcomp>)Údictr   r,   r   ÚProxyHandlerrà   rå   r   r   r²   r„   rÒ   )r   r"   rd   r  Úphrâ   rã   r\   r&   r&   r'   Ú
test_proxyR  s    
ÿ

ÿzHandlerTests.test_proxyc                 C   s”   dt jd< tƒ }tj tdd¡}| |¡ tdƒ}|  	|j
d¡ | |¡ |  	|j
d¡ tdƒ}|  	|j
d¡ | |¡ |  	|j
d¡ t jd= d S )	Nz
python.orgÚno_proxyúproxy.example.comrÎ  zhttp://www.perl.org/úwww.perl.orgrŒ  r‹  ©r   Úenvironr   r,   r   rÓ  rÒ  rà   r   r   r²   r„   ©r   r  rÔ  r\   r&   r&   r'   Útest_proxy_no_proxyd  s    



z HandlerTests.test_proxy_no_proxyc                 C   sf   dt jd< tƒ }tj tdd¡}| |¡ tdƒ}|  	|j
d¡ | |¡ |  	|j
d¡ t jd= d S )NÚ*rÖ  r×  rÎ  rŒ  r‹  rÙ  rÛ  r&   r&   r'   Útest_proxy_no_proxy_alls  s    


z$HandlerTests.test_proxy_no_proxy_allc                 C   sˆ   t ƒ }tj tdd¡}| |¡ dgg}t||ƒ}tdƒ}|  |j	d¡ | 
|¡ |  |j	d¡ |  |d dfgdd	„ |jD ƒ¡ d S )
NrÍ  ©r¦  )rû   rË   úhttps://www.example.com/úwww.example.comr   rû   c                 S   s   g | ]}|d d… ‘qS rÏ  r&   rÐ  r&   r&   r'   r  Œ  rU  z1HandlerTests.test_proxy_https.<locals>.<listcomp>)r   r,   r   rÓ  rÒ  rà   rå   r   r   r²   r„   rÒ   )r   r  rÔ  râ   rã   r\   r&   r&   r'   Útest_proxy_https~  s    
ÿ

ÿzHandlerTests.test_proxy_httpsc                 C   sÆ   t ƒ }tj tdd¡}| |¡ tƒ }| |¡ tdƒ}| dd¡ | dd¡ |  	|j
d¡ |  |j¡ | |¡ |  d	|jj¡ |  d
|jj¡ |  |j¡ |  	|j
d¡ |  	| d¡d¡ d S )NrÍ  rß  rà  úProxy-AuthorizationÚFooBarú
User-AgentÚGrailrá  )rã  rä  )rå  ræ  úProxy-authorization)r   r,   r   rÓ  rÒ  rà   rô   r   rV   r   r²   rY   r´   r„   rZ  rø   r®   rD   r¡  rZ   )r   r  rÔ  Zhttps_handlerr\   r&   r&   r'   Ú$test_proxy_https_proxy_authorizationŽ  s(    


ÿÿz1HandlerTests.test_proxy_https_proxy_authorizationr   zonly relevant for Windowsc                 C   sœ   d}t }dD ]}|  |||ƒd| ¡ qdD ]}|  |||ƒd| ¡ q,d}|  |d|ƒd| ¡ |  |d|ƒd| ¡ d	D ]}|  |||ƒd
| ¡ q|d S )Nz*www.example.com;*.example.net; 192.168.0.1)rá  zwww.example.netz192.168.0.1z expected bypass of %s to be true)rg   zwww.example.orgúexample.netz192.168.0.2ú!expected bypass of %s to be Falsezexample.com; <local>rg   ré  )Útestr3  z.expect <local> to bypass intranet address '%s')r
   rT   rX   )r   Zproxy_overrideZproxy_bypassr²   r&   r&   r'   Útest_winreg_proxy_bypass¥  s.    ÿÿÿÿÿÿz%HandlerTests.test_winreg_proxy_bypassÚdarwinzonly relevant for OSXc                 C   s®   dg d¢dœ}dD ]}|   t||ƒd| ¡ qdD ]}|  t||ƒd| ¡ q2dg dœ}|   td	|ƒ¡ dd
dgdœ}d}|   t||ƒd| ¡ d}|  t||ƒd| ¡ d S )NF)úfoo.barz	*.bar.comú	127.0.0.1z10.10z10.0/16)Zexclude_simpleÚ
exceptions)rî  zwww.bar.comrï  z	10.10.0.1z10.0.0.1z expected bypass of %s to be True)zabc.foo.barzbar.comz	127.0.0.2z	10.11.0.1Znotinbypassrê  Trë  z10.0.0.0/40z172.19.10.0/24z172.19.10.5z10.0.1.5)rT   r   rX   )r   Zbypassr²   r&   r&   r'   Útest_osx_proxy_bypass½  s0    þÿÿ
þÿÿz"HandlerTests.test_osx_proxy_bypassc                 C   sŽ   | j ||dl tƒ }tƒ }tj |¡}d |¡d }td|ƒ}| |¡ | |¡ |  	||d|||dd¡ W d   ƒ n1 s€0    Y  d S )N)r  rO   z
rë   é‘  rÿ   ú!http://acme.example.com/protected)
rÊ  r   r   r,   r   r   Újoinrç   rà   Ú_test_basic_auth)r   rO   r  rá   Úpassword_managerÚauth_handlerr½   Úhttp_handlerr&   r&   r'   Úcheck_basic_authß  s    



ýzHandlerTests.check_basic_authc           
   
   C   s.  d}d}d|› d}d|› d}d}d|› d}d|› dd|› dd|› d	|› d
|› |› d
|› |› d
|› |› d
|› |› d
|› fD ]}d|› g}|   ||¡ qŽt dtf¡( d|› g}|   ||¡ W d   ƒ n1 sè0    Y  ||g||g||gfD ] }	dd„ |	D ƒ}|   ||¡ qd S )Nzrealm2@example.comzBasic realm="ú"zOtherscheme xxxzDigest realm="zn", qop="auth, auth-int", nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", opaque="5ccc069c403ebaf9f0171e9517f40e41"zBasic realm='ú'z", charset="UTF-8"z, úWWW-Authenticate: zBasic Auth Realm was unquotedzWWW-Authenticate: Basic realm=c                 S   s   g | ]}d |› ‘qS )rü  r&   )r›  Z	challenger&   r&   r'   r    s   ÿz0HandlerTests.test_basic_auth.<locals>.<listcomp>)rù  r   Zcheck_warningsÚUserWarning)
r   r  Zrealm2ÚbasicZbasic2Zother_no_realmÚdigestZ	realm_strrO   Z
challengesr&   r&   r'   Útest_basic_authí  s<    


óÿ*ýÿzHandlerTests.test_basic_authc              
   C   sv   t ƒ }tj tdd¡}| |¡ tƒ }tj |¡}d}tdd| ƒ}| |¡ | |¡ |  	||d|||dd¡ d S )NrÍ  rÎ  úACME Networksi—  z(Proxy-Authenticate: Basic realm="%s"

rç  z&http://acme.example.com:3128/protected)
r   r,   r   rÓ  rÒ  rà   r   ZProxyBasicAuthHandlerrç   rõ  )r   rá   rÔ  rö  r÷  r  rø  r&   r&   r'   Útest_proxy_basic_auth  s     
ÿ


ýz"HandlerTests.test_proxy_basic_authc           
   
   C   s¶   G dd„ dt ƒ}G dd„ dtjjƒ}G dd„ dtjjƒ}|ƒ }tƒ }||ƒ}||ƒ}d}tdd	| ƒ}	| |¡ | |¡ | |	¡ |  ||d
||	|dd¡ |  	|j
ddgd ¡ d S )Nc                   @   s   e Zd Zdd„ Zdd„ ZdS )zQHandlerTests.test_basic_and_digest_auth_handlers.<locals>.RecordingOpenerDirectorc                 S   s   t  | ¡ g | _d S r   )r   r–   ÚrecordedrŽ   r&   r&   r'   r–   5  s    
zZHandlerTests.test_basic_and_digest_auth_handlers.<locals>.RecordingOpenerDirector.__init__c                 S   s   | j  |¡ d S r   )r  rÓ   )r   r™   r&   r&   r'   Úrecord9  s    zXHandlerTests.test_basic_and_digest_auth_handlers.<locals>.RecordingOpenerDirector.recordN)rH   r   rI   r–   r  r&   r&   r&   r'   ÚRecordingOpenerDirector4  s   r  c                   @   s   e Zd Zdd„ ZdS )zOHandlerTests.test_basic_and_digest_auth_handlers.<locals>.TestDigestAuthHandlerc                 _   s,   | j  d¡ tjjj| g|¢R i |¤Ž d S )Nrÿ  )rÑ   r  r,   r   ÚHTTPDigestAuthHandlerÚhttp_error_401©r   r†   r×   r&   r&   r'   r  =  s    ÿÿz^HandlerTests.test_basic_and_digest_auth_handlers.<locals>.TestDigestAuthHandler.http_error_401N©rH   r   rI   r  r&   r&   r&   r'   ÚTestDigestAuthHandler<  s   r
  c                   @   s   e Zd Zdd„ ZdS )zNHandlerTests.test_basic_and_digest_auth_handlers.<locals>.TestBasicAuthHandlerc                 _   s,   | j  d¡ tjjj| g|¢R i |¤Ž d S )Nrþ  )rÑ   r  r,   r   r   r  r  r&   r&   r'   r  C  s    ÿÿz]HandlerTests.test_basic_and_digest_auth_handlers.<locals>.TestBasicAuthHandler.http_error_401Nr	  r&   r&   r&   r'   ÚTestBasicAuthHandlerB  s   r  r  rò  ú&WWW-Authenticate: Basic realm="%s"

rÿ   ró  rÿ  rþ  rÄ   )r   r,   r   r  r   r   rç   rà   rõ  r   r  )
r   r  r
  r  rá   rö  Zdigest_handlerZbasic_handlerr  rø  r&   r&   r'   Ú#test_basic_and_digest_auth_handlers+  s(    	ÿ



ýz0HandlerTests.test_basic_and_digest_auth_handlersc                 C   sD   t ƒ }tj d ¡}tddƒ}| |¡ | |¡ |  t|jd¡ d S )Nrò  zWWW-Authenticate: Kerberos

r‰  )	r   r,   r   r  rç   rà   r.   r/   r„   )r   rá   Zdigest_auth_handlerrø  r&   r&   r'   Ú$test_unsupported_auth_digest_handler]  s    ÿ

z1HandlerTests.test_unsupported_auth_digest_handlerc                 C   sD   t ƒ }tj d ¡}tddƒ}| |¡ | |¡ |  t|jd¡ d S )Nrò  zWWW-Authenticate: NTLM

r‰  )	r   r,   r   r   rç   rà   r.   r/   r„   )r   rá   Zbasic_auth_handlerrø  r&   r&   r'   Ú#test_unsupported_auth_basic_handlerg  s    ÿ

z0HandlerTests.test_unsupported_auth_basic_handlerc	                 C   sH  dd l }	d\}
}| |||
|¡ |  ||j¡ |  ||j¡ |  |
|j¡ |  ||j¡ | |¡ |  |j|¡ |  |j	|¡ |  t
|jƒd¡ |  |jd  |¡¡ td|
|f dƒ}d|	 |¡ ¡  ¡  }|  |jd  |¡|¡ |  |jd j| |¡ d  |_|_| ¡  | |¡ |  t
|jƒd¡ |  |jd  |¡¡ d S )Nr   ©ZwileZcoyoterÄ   z%s:%sÚasciizBasic rÎ   )Úbase64rr   r   r  rP   r  r`   r„   r  r  rÅ   rê   rX   rU   ÚbytesZencodebytesr¶  ÚdecoderZ   r[  rè   )r   rá   r÷  Zauth_headerr  rø  rö  Úrequest_urlZprotected_urlr  r  r`   ZuserpassZauth_hdr_valuer&   r&   r'   rõ  q  s6    
ÿÿÿ
zHandlerTests._test_basic_authc                 C   s¢   d\}}d}t dƒ}tƒ }t|ƒ}|jd |||dd |  | |¡¡ |  | |d ¡¡ |  | |d ¡¡ tƒ }| |¡ | |¡ | 	|¡ |  |j
¡ d S )Nr  ró  r¨   T)Úis_authenticatedz/nestedZplain)rü   r   r   rr   rT   r  rX   r   rà   r„   rþ   )r   r  r`   r  rø  Úpwd_managerÚauth_prior_handlerrá   r&   r&   r'   Útest_basic_prior_auth_auto_send–  s     
ÿ


z,HandlerTests.test_basic_prior_auth_auto_sendc           
      C   sÐ   d\}}d}d}t ƒ }t|ƒ}| ||||¡ | |¡}|  |¡ tƒ }| |¡ tddd  ƒ}	| |	¡ | |¡ | |¡}|  	|¡ t
dƒ}	|  |	j¡ tƒ }| |¡ | |	¡ | |¡ |  	|	j¡ d S )Nr  ró  ZACMErò  r  r¨   )r   r   rr   r  rX   r   rà   rç   r„   rT   rü   rþ   )
r   r  r`   r  r  r  r  Zis_authrá   rø  r&   r&   r'   Ú.test_basic_prior_auth_send_after_first_success±  s0    


ÿ






z;HandlerTests.test_basic_prior_auth_send_after_first_successc              	   C   s   dD ]†\}}d  |¡}t | ¡ | ¡}tj ¡ }tdƒ}d|_| 	||¡}| 
¡  W d  ƒ n1 sj0    Y  |  |jjd  |¡¡ qdS )z=Test the connection is cleaned up when the response is closed))zConnection: closeó   data)zTransfer-Encoding: chunkeds   4
data
0

)zContent-Length: 4r  zHTTP/1.1 200 OK
{}

úhttp://dummy/NzConnection not closed with {!r})Úformatr   r¾  r!  r,   r   r÷   r   rƒ   rù   r6   rT   ÚfakesockÚclosed)r   Ztransferr‚   Úheaderrº  r  r\   Zrespr&   r&   r'   Útest_http_closedÙ  s    

&
ÿzHandlerTests.test_http_closedc                 C   sp   t  d¡}tj ¡ }tdƒ}d|_|  tj	j
¡ | ||¡ W d  ƒ n1 sR0    Y  |  |jjd¡ dS )z;Test the connection is cleaned up after an invalid responserU  r  NzConnection not closed)r   r¾  r,   r   r÷   r   rƒ   r.   rÏ   rï   ZBadStatusLinerù   rT   r  r  )r   rº  r  r\   r&   r&   r'   Útest_invalid_closedê  s    

*z HandlerTests.test_invalid_closedN)2rH   r   rI   r>  rM  r^  rk  rm  rw  rz  r{  r€  r  rƒ  rˆ  rŠ  r  r‘  r•  r¥  r«  r­  rµ  r·  rÀ  rÌ  rÕ  rÜ  rÞ  râ  rè  r#  Z
skipUnlessr   r   rì  rp  Úplatformrñ  rù  r   r  r  r  r  rõ  r  r  r!  r"  r&   r&   r&   r'   r&  Ê  sV   @\BJ	#

!-2

%(r&  c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )Ú	MiscTestsc                    s"   |   t‡ fdd„|jD ƒƒ¡ d S )Nc                 3   s   | ]}|j ˆ kV  qd S r   )rÇ   )r›  r=   ©Úhandler_classr&   r'   Ú	<genexpr>ø  s   ÿz/MiscTests.opener_has_handler.<locals>.<genexpr>)rT   Úanyrã   )r   rá   r&  r&   r%  r'   Úopener_has_handler÷  s    ÿzMiscTests.opener_has_handlerc                 C   s(  G dd„ dt jjƒ}G dd„ dt jjƒ}G dd„ dt jjƒ}t jj}|||ƒ}|  ||¡ |  ||¡ |||ƒ ƒ}|  ||¡ |  ||¡ ||ƒ}|  ||¡ |ƒ }|  |t jj¡ |t jjƒ}|  |t jj¡ |t j ¡ ƒ}|  |t jj¡ G dd„ dt jjƒ}|||ƒ}|  ||¡ |  ||¡ d S )	Nc                   @   s   e Zd ZdS )z2MiscTests.test_build_opener.<locals>.MyHTTPHandlerNrÞ   r&   r&   r&   r'   ÚMyHTTPHandlerü  s   r*  c                   @   s   e Zd Zdd„ ZdS )z/MiscTests.test_build_opener.<locals>.FooHandlerc                 S   s   d S r   r&   rŽ   r&   r&   r'   Úfoo_open   s    z8MiscTests.test_build_opener.<locals>.FooHandler.foo_openN)rH   r   rI   r+  r&   r&   r&   r'   Ú
FooHandlerÿ  s   r,  c                   @   s   e Zd Zdd„ ZdS )z/MiscTests.test_build_opener.<locals>.BarHandlerc                 S   s   d S r   r&   rŽ   r&   r&   r'   Úbar_open  s    z8MiscTests.test_build_opener.<locals>.BarHandler.bar_openN)rH   r   rI   r-  r&   r&   r&   r'   Ú
BarHandler  s   r.  c                   @   s   e Zd ZdS )z7MiscTests.test_build_opener.<locals>.MyOtherHTTPHandlerNrÞ   r&   r&   r&   r'   ÚMyOtherHTTPHandler   s   r/  )r,   r   rÈ  ÚBaseHandlerrÉ  r)  )r   r*  r,  r.  rÉ  r  r/  r&   r&   r'   Útest_build_openerû  s,    

zMiscTests.test_build_openerc                 C   s¨   d}d } }}d}t j |||||¡}|  t|dƒ¡ |  |jd¡ |  t|dƒ¡ |  |jd¡ d|j|j	f }|  t
|ƒ|¡ d|j|j	f }|  t|ƒ|¡ dS )z•
        Issue 13211 reveals that HTTPError didn't implement the URLError
        interface even though HTTPError is a subclass of URLError.
        zsomething bad happenedNzContent-Length: 42rB   rO   zHTTP Error %s: %sz<HTTPError %s: %r>)r,   r   r   rT   rÛ   r   rB   rO   r—   r˜   rE   rË  )r   r˜   rP   r—   r©   r\  rF   Zexpected_errmsgr&   r&   r'   Útest_HTTPError_interface'  s    z"MiscTests.test_HTTPError_interfacec                 C   s:   g d¢}|D ]\}}|   t|ƒ|¡ q|  ttd¡f d S )N)©r×  )NNNr×  ©rÍ  )NNNrÍ  r3  r4  )zjoe:password@proxy.example.com)Nr_   r`   r×  )z#joe:password@proxy.example.com:3128)Nr_   r`   rÍ  )zhttp://proxy.example.com/)rÏ   NNr×  )zhttp://proxy.example.com:3128/)rÏ   NNrÍ  )z&http://joe:password@proxy.example.com/©rÏ   r_   r`   r×  )z*http://joe:password@proxy.example.com:3128)rÏ   r_   r`   rÍ  )z1ftp://joe:password@proxy.example.com/rubbish:3128)r@  r_   r`   r×  )z%http://joe:password@proxy.example.comr5  )z&http://user/name:password@localhost:22)rÏ   ú	user/namer`   úlocalhost:22)z&http://username:pass/word@localhost:22)rÏ   Úusernameú	pass/wordr7  )z'http://user/name:pass/word@localhost:22)rÏ   r6  r9  r7  zfile:/ftp.example.com)r   r	   r.   r/   )r   Zparse_proxy_test_casesZtcr  r&   r&   r'   Útest_parse_proxy9  s    'zMiscTests.test_parse_proxyc                 C   sP   t ƒ }|  t¡}| d¡ W d   ƒ n1 s00    Y  |  t|jƒd¡ d S )NÚinvalidz5Unsupported digest authentication algorithm 'invalid')r   r.   r/   Zget_algorithm_implsr   rE   Ú	exception)r   r  Úexcr&   r&   r'   Útest_unsupported_algorithmf  s    (þz$MiscTests.test_unsupported_algorithmN)rH   r   rI   r)  r1  r2  r:  r>  r&   r&   r&   r'   r$  õ  s
   ,-r$  c                   @   sŒ   e Zd ZG dd„ deƒ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S ) ÚRequestTestsc                   @   s   e Zd ZdZdS )zRequestTests.PutRequestÚPUTN)rH   r   rI   r¹   r&   r&   r&   r'   Ú
PutRequestq  s   rA  c                 C   sL   t dƒ| _t ddddid| _t ddd| _|  d¡| _| jddd| _d S )	Núhttp://www.python.org/~jeremy/r‚   zX-Testrë  rN   ÚHEAD)r¹   rO  )r   r<  ÚpostÚheadrA  ÚputÚ
force_postrŽ   r&   r&   r'   ÚsetUpt  s    
þÿzRequestTests.setUpc                 C   s^   |   d| j ¡ ¡ |   d| j ¡ ¡ |   d| j ¡ ¡ |   d| j ¡ ¡ |   d| j ¡ ¡ d S )NrO  rN  rC  r@  )r   rD  r¢  r<  rE  rF  rG  rŽ   r&   r&   r'   Útest_method~  s
    zRequestTests.test_methodc                 C   sL   |   | jj¡ |  d| j ¡ ¡ d| j_|  | jj¡ |  d| j ¡ ¡ d S )NrN  ro   rO  )rX   r<  r‚   r   r¢  rT   rŽ   r&   r&   r'   Ú	test_data…  s
    zRequestTests.test_datac                 C   sN   |   d| jj¡ | j dd¡ |  d| jjd ¡ d| j_|   d| jj¡ d S )Nr9  é*   ro   )rZ  r<  r[  r[   r   r‚   rŽ   r&   r&   r'   Ú.test_setting_data_should_remove_content_length  s
    z;RequestTests.test_setting_data_should_remove_content_lengthc                 C   sT   |   d| jj¡ d| j_| j dd¡ |  d| jjd ¡ | j`|   d| jj¡ d S )Nr9  rh   r|  )rZ  r<  r[  r‚   r[   r   rŽ   r&   r&   r'   Ú/test_deleting_data_should_remove_content_length—  s    z<RequestTests.test_deleting_data_should_remove_content_lengthc                 C   s   |   d| j ¡ ¡ d S )NrB  )r   r<  rñ   rŽ   r&   r&   r'   Útest_get_full_urlŸ  s    ÿzRequestTests.test_get_full_urlc                 C   s*   |   d| jj¡ tdƒ}|   d|j¡ d S )Nz	/~jeremy/zhttp://www.python.org/r)   )r   r<  rº   r   rú   r&   r&   r'   Útest_selector£  s    zRequestTests.test_selectorc                 C   s   |   d| jj¡ d S )NrÏ   )r   r<  rK  rŽ   r&   r&   r'   Útest_get_type¨  s    zRequestTests.test_get_typec                 C   s   |   d| jj¡ d S )Nr‹  )r   r<  r²   rŽ   r&   r&   r'   Útest_get_host«  s    zRequestTests.test_get_hostc                 C   s   t dƒ}|  d|j¡ d S )Nzhttp://www.%70ython.org/r‹  ©r   r   r²   rú   r&   r&   r'   Útest_get_host_unquote®  s    z"RequestTests.test_get_host_unquotec                 C   sR   |   | j ¡ ¡ | j dd¡ |  | j ¡ ¡ |  d| jj¡ |  d| jj¡ d S )NrØ  rÏ   r‹  )rX   r<  Z	has_proxyr‚  rT   r   r“  r²   rŽ   r&   r&   r'   rÕ  ²  s
    zRequestTests.test_proxyc                 C   s   t dƒ}|  d|j¡ d S )Nz<URL:http://www.python.org>r‹  rR  rú   r&   r&   r'   Útest_wrapped_url¹  s    zRequestTests.test_wrapped_urlc                 C   sL   t dƒ}|  d|j¡ t dƒ}|  d|j¡ d}t |ƒ}|  | ¡ |¡ d S )Nú-http://www.python.org/?qs=query#fragment=truez
/?qs=queryzhttp://www.python.org/#fun=truer)   ú.http://docs.python.org/library/urllib2.html#OK)r   r   rº   rñ   )r   r\   rP   r&   r&   r'   Útest_url_fragment½  s    zRequestTests.test_url_fragmentc                 C   s0   g d¢}|D ]}t |ƒ}|  | ¡ |j¡ qd S )N)zhttp://docs.python.orgrV  rU  )r   r   rñ   r„  )r   rL  rP   r\   r&   r&   r'   Útest_url_fullurl_get_full_urlÈ  s    z*RequestTests.test_url_fullurl_get_full_urlN)rH   r   rI   r   rA  rH  rI  rJ  rL  rM  rN  rO  rP  rQ  rS  rÕ  rT  rW  rX  r&   r&   r&   r'   r?  p  s   

r?  Ú__main__);r#  rë  r   Ztest.supportr   r   r   r”   rˆ   r  rp  rf  rr  Zurllib.requestr,   r   r   r   r   r	   r
   r   r   Úurllib.parser   r  Zhttp.clientrÏ   ZTestCaser   rJ   r€   rŠ   rÒ  r   r•   r“   rœ   r¢   ÚIOBaser§   r¬   rÀ   rå   ræ   r   r0  rç   r÷   rô   rü   r   r  r%  r&  r$  r?  rH   Úmainr&   r&   r&   r'   Ú<module>   sb   (4 <

-6"         3{a
