o
    IXîhà; ã                   @   s8  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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/j0ƒZ1G d%d&„ d&ej/j2ƒZ3G d'd(„ d(ej/j0ƒZ4G d)d*„ d*ƒZ5G d+d,„ d,e jƒZ6d-d.„ Z7G d/d0„ d0e jƒZ8G d1d2„ d2e jƒZ9G d3d4„ d4e jƒZ:e;d5kre  <¡  dS dS )6é    N)Úsupport)Ú	os_helper)Úsocket_helper)Úwarnings_helper)Útest_urllib)ÚRequestÚOpenerDirectorÚHTTPBasicAuthHandlerÚHTTPPasswordMgrWithPriorAuthÚ_parse_proxyÚ_proxy_bypass_winreg_overrideÚ_proxy_bypass_macosx_sysconfÚAbstractDigestAuthHandler)Úurlparsec                   @   ó,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTrivialTestsc              
   C   sœ   dD ]I}i }t d| |ƒ |d= |dkr2tjdkr2| d¡| d¡}}|  |jd¡ |  |jd¡ | ¡ D ]\}}|  |jd	| d
|||jf ¡ q6q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)   ú;/opt/python-3.10.19/usr/lib/python3.10/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r'd| }nd| }tj |¡}| ¡  W d   ƒ d S 1 sAw   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_trivial3   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 |¡|¡ qd 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)r<   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_listF   s   

ÿÿûÿz!TrivialTests.test_parse_http_listc                 C   s"   t j d¡}|  |jt|ƒ¡ d S )NÚreason)r/   r   ÚURLErrorÚassertInrE   Ústr)r"   Úerrr)   r)   r*   Útest_URLError_reasonstrQ   s   z$TrivialTests.test_URLError_reasonstrN)Ú__name__r    Ú__qualname__r+   r;   rD   rJ   r)   r)   r)   r*   r   "   s
    r   c                   @   r   )
Ú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   rR   )r"   Úurlr)   r)   r*   Útest_request_headers_dictX   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
        rN   rO   rP   rQ   )rO   rP   zFoo-BarÚbaz)zFoo-barrU   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"   rS   Úreqr)   r)   r*   Útest_request_headers_methodsm   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)rb   rc   rN   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)rk   rd   )rl   rm   zhttp://example.com/foo/zhttp://example.com/foo/bazzhttp://example.com/foobar©NNzhttp://example.com/baz/rU   Únininizhttp://example.com/baz)rU   ro   zhttp://example.com/baz/barr=   ÚfirstrP   ÚsecondÚspam)rq   rr   r<   Ú1)rs   r<   zhttp://a.example.com/zc.example.comzc.example.com:3128)re   r>   )rf   rg   )rh   ri   ©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.
        r:   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:100rn   zg.example.com:80)rz   r{   zg.example.comzhttp://g.example.com:100zhttp://g.example.comzh.example.com)r|   r'   zh.example.com:80zhttp://h.example.com:80zi.example.com)r}   r~   zhttp://i.example.com:80)r€   r   zj.example.com:80zhttp://j.example.comzhttp://j.example.com:80Nrt   rw   r)   r)   r*   Ú"test_password_manager_default_portç   sZ   
ÿÿÿÿÿÿÿÿÿÿÿz3RequestHdrsTests.test_password_manager_default_portN)rK   r    rL   rT   r`   ry   r‚   r)   r)   r)   r*   rM   V   s
    $VrM   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     ó   zMockOpener.error)rK   r    rL   Ú
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   ó   d S r„   r)   ©r"   Úcountr)   r)   r*   r9     ó   zMockFile.readc                 C   r   r„   r)   r   r)   r)   r*   Úreadline  r’   zMockFile.readlinec                 C   r   r„   r)   ©r"   r)   r)   r*   Úclose"  r’   zMockFile.closer„   )rK   r    rL   r9   r“   r•   r)   r)   r)   r*   rŽ     s    

rŽ   c                   @   ó   e Zd Zdd„ ZdS )ÚMockHeadersc                 C   s   t |  ¡ ƒS r„   )rC   Úvalues)r"   r   r)   r)   r*   Ú
getheaders'  s   zMockHeaders.getheadersN)rK   r    rL   r™   r)   r)   r)   r*   r—   &  ó    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ÚmsgrR   rS   )r"   rŸ   r    rR   r…   rS   r)   r)   r*   rž   ,  s    zMockResponse.__init__c                 C   ó   | j S r„   rQ   r”   r)   r)   r*   Úinfo0  ó   zMockResponse.infoc                 C   r¡   r„   ©rS   r”   r)   r)   r*   Úgeturl3  r£   zMockResponse.geturlr„   )rK   r    rL   rž   r¢   r¥   r)   r)   r)   r*   r›   +  s    
r›   c                   @   ó   e Zd Zdd„ Zdd„ ZdS )ÚMockCookieJarc                 C   ó
   || _ d S r„   )Úach_req)r"   r   r)   r)   r*   Úadd_cookie_header8  ó   
zMockCookieJar.add_cookie_headerc                 C   s   ||| _ | _d S r„   )Úec_reqÚec_r)r"   r   r   r)   r)   r*   Úextract_cookies;  rŠ   zMockCookieJar.extract_cookiesN)rK   r    rL   rª   r®   r)   r)   r)   r*   r§   7  s    r§   c                   @   r¦   )Ú
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__E  s   zFakeMethod.__call__N)rK   r    rL   rž   r³   r)   r)   r)   r*   r¯   ?  s    r¯   c                   @   r   )
ÚMockHTTPResponsec                 C   s"   || _ || _|| _|| _d| _d S )NéÈ   )Úfpr    ÚstatusrE   rŸ   )r"   r¶   r    r·   rE   r)   r)   r*   rž   J  s
   
zMockHTTPResponse.__init__c                 C   s   dS )NÚ r)   r”   r)   r)   r*   r9   Q  r’   zMockHTTPResponse.readc                 C   s   i S r„   r)   r”   r)   r)   r*   r¢   T  r’   zMockHTTPResponse.infoc                 C   r¡   r„   r¤   r”   r)   r)   r*   r¥   W  r£   zMockHTTPResponse.geturlN)rK   r    rL   rž   r9   r¢   r¥   r)   r)   r)   r*   r´   I  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ž   \  s   
zMockHTTPClass.__init__c                 C   s   || _ || _| S r„   )Úhostr†   )r"   r¿   r†   r)   r)   r*   r³   d  s   zMockHTTPClass.__call__c                 C   r¨   r„   )rº   )r"   rº   r)   r)   r*   Úset_debugleveli  r«   zMockHTTPClass.set_debuglevelNc                 C   s(   || _ || _|r|| _d S | j ¡  d S r„   )Ú_tunnel_hostZ_tunnel_portr¾   Úclear)r"   r¿   ÚportrR   r)   r)   r*   Ú
set_tunnell  s
   
zMockHTTPClass.set_tunnelF)Úencode_chunkedc                C   sP   || _ || _|d ur|  j| ¡ 7  _| j ¡  |r|| _|| _| jr&tƒ ‚d S r„   )	ÚmethodÚselectorr»   r!   Úsortr…   rÅ   r¼   ÚOSError)r"   rÆ   rS   ÚbodyrR   rÅ   r)   r)   r*   r   t  s   
ÿzMockHTTPClass.requestc                 C   s   t tƒ i ddƒS )Nrµ   ÚOK)r´   rŽ   r”   r)   r)   r*   Úgetresponse  ó   zMockHTTPClass.getresponsec                 C   r   r„   r)   r”   r)   r)   r*   r•   „  r’   zMockHTTPClass.closern   )rK   r    rL   rž   rŒ   r   r³   rÀ   rÄ   r   rÌ   r•   r)   r)   r)   r*   r¹   [  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ž     ó   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r$tddi dƒ}|S |dkr,tdƒS | d¡r`|| d	¡d
 d … }zt|ƒ}W n	 tyK   Y nw tddi dƒ}| j  	d|d ||di ¡S |dkrjt
j	 d¡‚J ‚)Núreturn selfúreturn responserµ   rË   r¸   úreturn requestzhttp://blah/r   ú é   Úhttpr   ÚraiserP   )ÚparentÚcallsÚappendr›   r   Ú
startswithÚrfindÚintr2   r   r/   rF   )r"   Zfn_namer²   r‰   ÚkwdsÚresrŸ   r)   r)   r*   r±   ™  s,   
ÿzMockHandler.handlec                 C   r   r„   r)   r”   r)   r)   r*   r•   °  r’   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)
rK   r    rL   ré   rž   rÐ   r±   r•   rè   rì   r)   r)   r)   r*   rÎ   ˆ  s    	rÎ   c                 C   sb   g }d}|D ](}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                   @   ó   e Zd ZdS )z6add_ordered_mock_handlers.<locals>.MockHandlerSubclassN©rK   r    rL   r)   r)   r)   r*   ÚMockHandlerSubclassÔ  ó    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                   @   ó$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚMockHTTPHandlerc                 C   s   || _ || _|  ¡  d S r„   )rŸ   rR   Úreset)r"   rŸ   rR   r)   r)   r*   rž   ë  ó   zMockHTTPHandler.__init__c                 C   s   d| _ g | _d S )Nr   )Ú_countÚrequestsr”   r)   r)   r*   rú   ð  ó   
zMockHTTPHandler.resetc                 C   s   dd l }dd l}| j | |¡¡ | jdkr6| jd | _tjj| j	 }| 
| j¡}| j d|tƒ | j	||¡S || _| 
d¡}tdd|d| ¡ ƒS )Nr   rÝ   rÞ   ú

rµ   rË   r¸   )ÚemailÚcopyrý   râ   Údeepcopyrü   rÞ   ÚclientÚ	responsesrŸ   Zmessage_from_stringrR   rà   r   rŽ   r_   r›   Úget_full_url)r"   r_   r   r  r   r    r)   r)   r*   Ú	http_openô  s   
ÿ
zMockHTTPHandler.http_openN©rK   r    rL   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  rÒ   zMockHTTPSHandler.https_openN)r   )rK   r    rL   rž   r  r)   r)   r)   r*   r    s    
r  c                   @   rø   )ÚMockHTTPHandlerCheckAuthc                 C   s   || _ d| _d S ©NF)rŸ   Úhas_auth_header)r"   rŸ   r)   r)   r*   rž     rþ   z!MockHTTPHandlerCheckAuth.__init__c                 C   s
   d| _ d S r  )r  r”   r)   r)   r*   rú     r«   zMockHTTPHandlerCheckAuth.resetc                 C   s6   |  d¡rd| _tjj| j }t| j|tƒ d| ¡ ƒS )NÚAuthorizationTr¸   )	rX   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                   @   r¦   )ÚMockPasswordManagerc                 C   s   || _ || _|| _|| _d S r„   )ÚrealmrS   Úuserrc   )r"   r  Zurir  rc   r)   r)   r*   ru   #  s   
z MockPasswordManager.add_passwordc                 C   s   || _ || _| j| jfS r„   )Útarget_realmÚ
target_urlr  rc   )r"   r  Zauthurir)   r)   r*   rv   )  rû   z&MockPasswordManager.find_user_passwordN)rK   r    rL   ru   rv   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                   @   rí   )z<OpenerDirectorTests.test_add_non_handler.<locals>.NonHandlerNrî   r)   r)   r)   r*   Ú
NonHandler2  rð   r  )Úobjectr1   Ú	TypeErrorr   rñ   )r"   r  r)   r)   r*   Útest_add_non_handler1  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   )rF   )r  rÙ   )Z
proxy_openrÙ   )Zredirect_requestrÙ   )ZdoÚproxyÚredirectz://example.com/)
Úurllib.errorrF   r   rö   rñ   r/   r   ZUnknownHandlerr1   r‡   )r"   rF   Úoró   Úschemer)   r)   r*   Útest_badly_named_methods7  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 ]\}}|\}	}
}}|  |	|
f|¡ |  ||f¡ q6d S )N)r  Úftp_openÚhttp_error_302r$  ©r  rÙ   ra   rÓ   r   r  )r   rö   r   r‡   r   Úziprá   )r"   r!  ró   rô   r_   Úrrá   ÚexpectedÚgotÚhandlerr   r‰   ræ   r)   r)   r*   Útest_handledL  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                   @   rí   )zCOpenerDirectorTests.test_handler_order.<locals>.MockHandlerSubclassNrî   r)   r)   r)   r*   rï   k  rð   rï   ra   rÝ   )r   rÎ   ré   râ   rñ   r‡   r   rá   )r"   r!  rô   rõ   ré   rï   r@   r)   r)   r*   Útest_handler_orderf  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&  ra   r   r  )
r   rö   r   r1   r/   r   rF   r‡   r   rá   )r"   r!  ró   rô   r_   r)   r)   r*   Ú
test_raisex  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s&J ‚|d d|ff|d d|tjd	d
i ffg}t||jƒD ]\}}|\}}	}
|  	||	f|d d… ¡ |  	|
|d ¡ qAd S )N)r  z	error 302)Zhttp_error_400rß   r  ))r%  rÚ   Zhttp_error_303Z
http_errorr%  ra   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 ]O\}\}}}	}
|dk r[|  ||f|| ¡ |  t|	ƒd¡ |  |	d t¡ q4|  ||f|| ¡ |  t|	ƒd¡ |  |	d t¡ |	d d urƒ|  |	d t	¡ q4d S )	N)Úhttp_requestrÛ   )Úhttp_responserÚ   ra   r   r1  rÝ   r2  rÓ   )
r   rö   r   r‡   Ú	enumeraterá   r   rÔ   ÚassertIsInstancer›   )r"   r!  ró   rô   r_   rá   r   r+  r   r‰   ræ   r)   r)   r*   Útest_processorsœ  s4   ÿÿý

þ€òz#OpenerDirectorTests.test_processorsN)
rK   r    rL   r  r#  r,  r-  r.  r0  r5  r)   r)   r)   r*   r  /  s    r  c                 C   sX   z|   d¡ W n ty   t d¡‚w tj | ¡}tjdkr*| 	d¡r*|dd … }|S )Nzutf-8zpath is not encodable to utf8r   z///rÓ   )
ÚencodeÚUnicodeEncodeErrorÚunittestZSkipTestr/   r   r   r   r   rã   )r4   Ú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 ]f\	}}}}}	}
}}}t|ƒ}d |_| 	|¡}|  
|j|¡ |  
|j|	¡ |  
|jt |¡¡ |  
|j|¡ |  
|j|¡ |  
|jj|¡ |  
|jj|
¡ | ¡ }|  
| d¡|¡ |  
t|d ƒt|ƒ¡ qnd S )Nc                   @   rø   )z-HandlerTests.test_ftp.<locals>.MockFTPWrapperc                 S   r¨   r„   ©r…   ©r"   r…   r)   r)   r*   rž   Ð  r«   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   r   r„   r)   r”   r)   r)   r*   r•   ×  r’   z3HandlerTests.test_ftp.<locals>.MockFTPWrapper.closeN)rK   r    rL   rž   r@  r•   r)   r)   r)   r*   ÚMockFTPWrapperÏ  s    rA  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   r¨   r„   r<  r=  r)   r)   r*   rž   Û  r«   z6HandlerTests.test_ftp.<locals>.NullFTPHandler.__init__c                    s4   ||| _ | _||| _| _|| _ˆ | jƒ| _| jS r„   )r  Úpasswdr¿   rÃ   Údirsr…   Ú
ftpwrapper)r"   r  rB  r¿   rÃ   rC  r†   ©rA  r)   r*   Úconnect_ftpÞ  s
   z9HandlerTests.test_ftp.<locals>.NullFTPHandler.connect_ftpN)rK   r    rL   rž   rŒ   r   rF  r)   rE  r)   r*   ÚNullFTPHandlerÚ  s    ÿrG  r   zrheum rhaponicumz ftp://localhost/foo/bar/baz.htmlÚ	localhostr¸   ÚIrk   rl   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  rB  r¿   rŒ   ÚgethostbynamerÃ   rC  rD  r>  r?  r¢   Úgetrå   rÔ   )r"   rG  rO  r…   r@   rS   r¿   rÃ   r  rB  Ztype_rC  r>  Zmimetyper_   r(  rR   r)   rE  r*   Útest_ftpÎ  sZ   
þ
þ
þ
þ

þþð
ß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yA   d}Y nw |rM| d||f ¡ |D ]w}	t|dƒ}
zEz|
 |¡ W |
 ¡  n|
 ¡  w | t|	ƒ¡}z| ¡ }| ¡ }| ¡ }W | ¡  n| ¡  w t	 |¡}|jj|jd	d
}W t	 |¡ nt	 |¡ w |  ||¡ |  |d d¡ |  |d d¡ |  |d |¡ |  ||	¡ qOd| dddt d¡t	 ¡ |f dt	 ¡ |f fD ]1}	z)t|dƒ}
z|
 |¡ W |
 ¡  n|
 ¡  w |   tj!j"|jt|	ƒ¡ W t	 |¡ qàt	 |¡ w tj ¡ }tƒ  }|_dD ]9\}	}t|	ƒ}z| |¡ W n tj!j"y?   |  #|¡ Y nw |  $|j%|¡ |  |j&d¡ |  |j&dk|¡ qd S )Nr   s   hello, world
zfile://localhost%sr-   zfile://%s%srH  r¸   ÚwbT)ZusegmtrM  z
text/plainrN  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   r4   r5   rŒ   rP  ÚgethostnameÚgaierrorrâ   r‡   Úwriter•   Z	file_openr   r9   r¢   r¥   ÚstatZutilsZ
formatdateÚst_mtimeÚremover   Úgetcwdr1   r   rF   r[   ÚassertIsr_   Útype)r"   r   r@   r!  rV  r9  ZtowriteÚurlsZ	localaddrrS   r:   r(  r…   rR   ZrespurlZstatsZmodifiedrT  r_   r)   r)   r*   Ú	test_file  sŠ   
ýÿ



ÿ
ÿú	


ÿ
ÿñzHandlerTests.test_filec                 C   s`  t j ¡ }tƒ  }|_d}dD ]q\}}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¡ q¢d S )Nra   ))ÚGETN)ÚPOSTs   blahÚFoorl   ÚSpamÚeggsrµ   rË   rj   r   r,   ))Ú
Connectionr•   )rd  rl   ©re  rf  TZbadpostrh  )ó    Nr¸   rN  rM  Ú0z!application/x-www-form-urlencodedÚHostrk   rU   )#r/   r   r  rƒ   rà   r   r†   r^   r¹   r  r9   r“   r¢   r¥   rŸ   r    rQ  Ú__contains__r   r¿   rº   rÆ   rÇ   r»   r…   r¼   r1   r   rF   r  Údo_request_r‹   r›   ÚassertNotInÚunredirected_hdrs)r"   r@   r!  rS   rÆ   r…   r_   rÞ   r(  ÚhdrsÚnewreqr)   r)   r*   Ú	test_httpj  sf   
ÿ


ÿ
èzHandlerTests.test_httpc           	      C   s  t j ¡ }tƒ  }|_tjddd}|j}| ¡  |  	t
j|¡ t|dƒ&}td|i ƒ}| |¡}| d¡}|  |d¡ |  | d¡¡ W d   ƒ n1 sNw   Y  t|dƒ)}td|d	d
iƒ}| |¡}|  t| d¡ƒd
¡ |  | d¡¡ W d   ƒ d S 1 s„w   Y  d S )Nzw+bF)ÚmodeÚdeleteÚrbra   úTransfer-encodingÚchunkedrN  úContent-Lengthé   )r/   r   r  rƒ   rà   ÚtempfileÚNamedTemporaryFiler   r•   r.   r   Úunlinkr‡   r   rm  r]   r   r[   rX   rå   )	r"   r@   r!  Úfile_objZ	file_pathr:   r_   rq  Ú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 )Nra   rv  rw  rN  rx  ry  )r/   r   r  rƒ   rà   rœ   ÚBytesIOr   rm  r   r]   r[   rX   rå   r•   )r"   r@   r!  r}  r_   rq  rR   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 ]F}tj|tj	d4}t
d|j|ƒ}| |¡}|sC|  | d¡d ¡ |  | d¡d	¡ n|  t| d¡ƒd¡ W d   ƒ n1 sXw   Y  qd S )
Nz-cÚpassrx  ry  )Ústdoutra   rN  rv  rw  )r/   r   r  rƒ   rà   ÚsysÚ
executableÚ
subprocessÚPopenÚPIPEr   rƒ  rm  r   r]   rå   )r"   r@   r!  ÚcmdrR   Úprocr_   rq  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|ƒ |ƒ}| |¡}|s8|  | 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_bodyrx  é   ra   rN  rv  rw  )
r/   r   r  rƒ   rà   r   rm  r   r]   rå   )r"   r@   r!  rŒ  rR   r_   rq  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 )Nra   r)   rv  rw  rN  )r/   r   r  rƒ   rà   rm  r   r   r]   r[   rX   )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 ]}td||ƒ}| |¡}|  t	| 
d¡ƒd¡ qd S )NrI  )rÝ   rÓ   é   é   rx  é   ra   rN  )r/   r   r  rƒ   rà   Úarrayr   rm  r   rå   r]   )r"   r@   r!  Ziterable_arrayrR   r_   rq  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 ])}t||ƒ}| |¡}|  |jd d¡ | 	dd ¡ | |¡}|  |jd d¡ qd S )Nri  )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.htmlrk  rj   zsomeproxy:3128)
r/   r   r  rƒ   rà   r   rm  r   ro  Ú	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 ]'}||_t|ƒ}|  | ¡ |¡ |  |jp!d|j¡ |  t| ¡ ƒj|j¡ q
d S )N)zhttp://example.com?foo=bar#bazz)http://example.com?foo=bar&spam=eggs#bashrN   rN   r¸   )r   Úfull_urlr   r   r  ÚfragmentÚquery)r"   r`  r(  rS   Ú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˜  r\   r™  r   rÇ   )r"   r(  r)   r)   r*   Útest_full_url_deleterT  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   rm  r   r¿   rÇ   )r"   r@   Z	weird_urlr_   rq  Zurl_without_pathr)   r)   r*   Útest_fixpath_in_weirdurls[  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 )Nra   rµ   rË   r¸   rˆ   éÊ   ZAcceptedéÎ   zPartial contentiö  zBad gatewayrÞ   )r/   r   ZHTTPErrorProcessorrƒ   rà   r   r›   r2  r^  r[   rê   r\   r   rˆ   r‰   )r"   r@   r!  rS   r_   r(  Únewrr)   r)   r*   Útest_errorsn  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 )Nra   rµ   rË   r¸   rj   )r§   r/   r   ÚHTTPCookieProcessorrƒ   rà   r   r›   r1  r^  r©   r   Úorigin_req_hostr[   Zunverifiabler2  r¬   r­   )r"   Úcjr@   r_   r(  rq  r¤  r)   r)   r*   Útest_cookies‡  s   
zHandlerTests.test_cookiesc              
   C   sT  d}d}t j ¡ }tƒ  }|_dD ]«}dD ]¦}t|d| ƒ}t||ƒ}tj|_	| 
dd¡ |d ur;| 
dtt|ƒƒ¡ | d	d
¡ z||tƒ |dtd|iƒƒ W n t jjyf   |  |d¡ |  |¡ Y nw |  |j ¡ |¡ z|  |j ¡ d¡ W n ty‹   |  |jj¡ Y nw 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Ù t jjy÷   |  |t jjj¡ Y nw t|dd}d}tj|_	z	 |
||d| ƒ |d }q t jjy)   |  |t jjj¡ Y d S w )Núhttp://example.com/a.htmlzhttp://example.com/b.html)i-  r/  i/  é3  )Nz
blah
blah
zhttp_error_%sZNonsensezviking=withholdrx  re  rr   ÚBlahÚlocationr«  rb  c                 S   s   g | ]}|  ¡ ‘qS r)   )Úlower)Ú.0Úxr)   r)   r*   Ú
<listcomp>·  s    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_   rS   r)   r)   r*   r  Ä  s   
ÿz,HandlerTests.test_redirect.<locals>.redirectrj   )r§  r   rÝ   ra   zhttp://example.com/%d)r/   r   ÚHTTPRedirectHandlerrƒ   rà   Úgetattrr   rŒ   r   r†   rY   rH   rÔ   r^   rŽ   r—   r   Ú	HTTPErrorr   ÚassertIsNotNoner_   r  Ú
get_methodÚAttributeErrorr[   r…   rR   rn  ro  Zmax_repeatsZmax_redirections)r"   Úfrom_urlZto_urlr@   r!  rŸ   r…   rÆ   r_   rR   r  r‘   r)   r)   r*   Útest_redirect˜  s~   


ÿýÿÿâ!þþþ
ÿÿzHandlerTests.test_redirectc                 C   sÂ   d}g d¢}g d¢}d}t j ¡ }tƒ  }|_t|ƒ}tj|_|D ]}|d | }	|  	t j
j|j|tƒ ddtd|	iƒ¡ q!|D ]}|d | }
| |tƒ dd	td|
iƒ¡ |  |j ¡ |
¡ q?d S )
Nrª  )rÞ   ÚhttpsrT  )ÚfileÚimapZldapzexample.com/b.htmlz://r/  zSecurity Loopholer­  úThat's fine)r/   r   r²  rƒ   rà   r   rŒ   r   r†   r1   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‡   r[   r_   rX   )	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Æ   rS   ÚposÚkw©Z
real_classr"   r`  r)   r*   r   (  s   z3HandlerTests.test_redirect_no_path.<locals>.requestzhttp://python.org/pathzhttp://python.org/path?query)r.   r/   r   r0   rÞ   r  rÌ  r   ÚfakehttprÕ   Úiterr3   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|ƒ¡+ t d| d ¡|_| 	d¡}d| d }|j
}	|  |	 |¡t|	ƒ¡ W d   ƒ n1 sPw   Y  qd S )	Nc                   @   r–   )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  5  s   
ÿz>HandlerTests.test_redirect_encoding.<locals>.Handler.http_openN)rK   r    rL   r  r)   r)   r)   r*   ÚHandler4  rš   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   

ra   s   GET ó    )r/   r   ÚHTTPHandlerÚbuild_openerÚsubTestÚreprr   rÒ  rÕ  r‡   r×  rW   rã   )
r"   rÙ  r+  rò   rA   r­  rØ  r   r)  r   r)   r)   r*   Útest_redirect_encoding1  s(   ÿÿÿ
÷€ÿz#HandlerTests.test_redirect_encodingc                 C   s    d}t |dt |dfD ]A}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   ó   g | ]}|d d… ‘qS ©r   rÓ   r)   ©r¯  Útupr)   r)   r*   r±  d  ó    z+HandlerTests.test_proxy.<locals>.<listcomp>)Údictr   r/   r   ÚProxyHandlerrñ   rö   r   r   r¿   r‡   rá   )r"   r%   rg   r!  Úphró   rô   r_   r)   r)   r*   Ú
test_proxyT  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_proxyf  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_allu  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   rã  rä  r)   rå  r)   r)   r*   r±  Ž  rç  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   rY   r   r¿   r\   rÁ   r‡   rn  r  r»   rG   rµ  r]   )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)rj   zwww.example.orgúexample.netz192.168.0.2ú!expected bypass of %s to be Falsezexample.com; <local>rj   rÿ  )ÚtestrH  z.expect <local> to bypass intranet address '%s')r   rW   r[   )r"   Zproxy_overrideZproxy_bypassr¿   r)   r)   r*   Útest_winreg_proxy_bypass§  s0   ÿÿÿÿÿÿÿ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| ¡ qd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)rW   r   r[   )r"   Zbypassr¿   r)   r)   r*   Útest_osx_proxy_bypass¿  s0   þÿÿ
þÿÿz"HandlerTests.test_osx_proxy_bypassc                 C   s   | j ||d7 tƒ }tƒ }tj |¡}d |¡d }td|ƒ}| |¡ | |¡ |  	||d|||dd¡ W d   ƒ d S 1 sAw   Y  d S )N)r  rR   z
rÿ   é‘  r  ú!http://acme.example.com/protected)
rÞ  r   r  r/   r   r	   Újoinrù   rñ   Ú_test_basic_auth)r"   rR   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}|   ||¡ qGt dtf¡ d|› g}|   ||¡ W d   ƒ n1 stw   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_strrR   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                   @   r¦   )zQHandlerTests.test_basic_and_digest_auth_handlers.<locals>.RecordingOpenerDirectorc                 S   s   t  | ¡ g | _d S r„   )r   rž   Úrecordedr”   r)   r)   r*   rž   7  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*   Úrecord;  rÍ   zXHandlerTests.test_basic_and_digest_auth_handlers.<locals>.RecordingOpenerDirector.recordN)rK   r    rL   rž   r  r)   r)   r)   r*   ÚRecordingOpenerDirector6  s    r  c                   @   r–   )zOHandlerTests.test_basic_and_digest_auth_handlers.<locals>.TestDigestAuthHandlerc                 _   ó,   | 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  ?  ó   ÿ
ÿz^HandlerTests.test_basic_and_digest_auth_handlers.<locals>.TestDigestAuthHandler.http_error_401N©rK   r    rL   r  r)   r)   r)   r*   ÚTestDigestAuthHandler>  rš   r"  c                   @   r–   )zNHandlerTests.test_basic_and_digest_auth_handlers.<locals>.TestBasicAuthHandlerc                 _   r  )Nr  )rà   r  r/   r   r	   r  r  r)   r)   r*   r  E  r   z]HandlerTests.test_basic_and_digest_auth_handlers.<locals>.TestBasicAuthHandler.http_error_401Nr!  r)   r)   r)   r*   ÚTestBasicAuthHandlerD  rš   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   óD   t ƒ }tj d ¡}tddƒ}| |¡ | |¡ |  t|jd¡ d S )Nr  zWWW-Authenticate: Kerberos

r  )	r   r/   r   r  rù   rñ   r1   r2   r‡   )r"   rò   Zdigest_auth_handlerr  r)   r)   r*   Ú$test_unsupported_auth_digest_handler_  s   ÿ

z1HandlerTests.test_unsupported_auth_digest_handlerc                 C   r&  )Nr  zWWW-Authenticate: NTLM

r  )	r   r/   r   r	   rù   rñ   r1   r2   r‡   )r"   rò   Zbasic_auth_handlerr  r)   r)   r*   Ú#test_unsupported_auth_basic_handleri  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Ý   )Úbase64ru   r   r  rS   r  rc   r‡   r  r  rÔ   rý   r[   rX   ÚbytesZencodebytesrÊ  Údecoder]   ro  rú   )r"   rò   r  Zauth_headerr  r  r  Úrequest_urlZprotected_urlr+  r  rc   ZuserpassZauth_hdr_valuer)   r)   r*   r  s  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	   ru   rW   r/  r[   r   rñ   r‡   r  )r"   r  rc   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	   ru   r/  r[   r   rñ   rù   r‡   rW   r  r  )
r"   r  rc   r.  r  r0  r1  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 ]C\}}d  |¡}t | ¡ | ¡}tj ¡ }tdƒ}d|_| 	||¡}| 
¡  W d  ƒ n1 s5w   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: 4r4  zHTTP/1.1 200 OK
{}

úhttp://dummy/NzConnection not closed with {!r})Úformatr   rÒ  r6  r/   r   r  r   r†   r  r9   rW   Ú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 s)w   Y  |  |jjd¡ dS )z;Test the connection is cleaned up after an invalid responseri  r5  NzConnection not closed)r   rÒ  r/   r   r  r   r†   r1   rÞ   r  ZBadStatusLiner  rW   r7  r8  )r"   rÎ  r+  r_   r)   r)   r*   Útest_invalid_closedì  s   

ÿz HandlerTests.test_invalid_closedN)2rK   r    rL   rR  ra  rr  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þ  r8  Z
skipUnlessr   r   r  r„  Úplatformr  r  r  r  r%  r'  r(  r  r2  r3  r:  r;  r)   r)   r)   r*   r;  Ì  sX    @\BJ	#

!-2

%(r;  c                   @   s<   e Zd Zd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>)rW   Ú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                   @   rí   )z2MiscTests.test_build_opener.<locals>.MyHTTPHandlerNrî   r)   r)   r)   r*   ÚMyHTTPHandlerþ  rð   rC  c                   @   r–   )z/MiscTests.test_build_opener.<locals>.FooHandlerc                 S   r   r„   r)   r”   r)   r)   r*   Úfoo_open  r’   z8MiscTests.test_build_opener.<locals>.FooHandler.foo_openN)rK   r    rL   rD  r)   r)   r)   r*   Ú
FooHandler  rš   rE  c                   @   r–   )z/MiscTests.test_build_opener.<locals>.BarHandlerc                 S   r   r„   r)   r”   r)   r)   r*   Úbar_open  r’   z8MiscTests.test_build_opener.<locals>.BarHandler.bar_openN)rK   r    rL   rF  r)   r)   r)   r*   Ú
BarHandler  rš   rG  c                   @   rí   )z7MiscTests.test_build_opener.<locals>.MyOtherHTTPHandlerNrî   r)   r)   r)   r*   ÚMyOtherHTTPHandler"  rð   rH  )r/   r   rÜ  ÚBaseHandlerrÝ  rB  )r"   rC  rE  rG  rÝ  r!  rH  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: 42rE   rR   zHTTP Error %s: %sz<HTTPError %s: %r>)r/   r   r´  rW   rê   r   rE   rR   rŸ   r    rH   rß  )r"   r    rS   rŸ   r¶   rp  rI   Zexpected_errmsgr)   r)   r*   Útest_HTTPError_interface)  s   z"MiscTests.test_HTTPError_interfacec                 C   s>   t j dddd d ¡}|  t|ddƒd¡ |  |j ¡ t¡ d S )NrS   i•  zMETHOD NOT ALLOWEDZ	__notes__r)   )	r/   r   r´  r   r³  r4  r¶   r9   r,  )r"   r°  r)   r)   r*   Útest_gh_98778;  s   zMiscTests.test_gh_98778c                 C   s:   g d¢}|D ]\}}|   t|ƒ|¡ q|  ttd¡f d S )N)©rí  )NNNrí  ©rá  )NNNrá  rM  rN  )zjoe:password@proxy.example.com)Nrb   rc   rí  )z#joe:password@proxy.example.com:3128)Nrb   rc   rá  )zhttp://proxy.example.com/)rÞ   NNrí  )zhttp://proxy.example.com:3128/)rÞ   NNrá  )z&http://joe:password@proxy.example.com/©rÞ   rb   rc   rí  )z*http://joe:password@proxy.example.com:3128)rÞ   rb   rc   rá  )z1ftp://joe:password@proxy.example.com/rubbish:3128)rT  rb   rc   rí  )z%http://joe:password@proxy.example.comrO  )z&http://user/name:password@localhost:22)rÞ   ú	user/namerc   úlocalhost:22)z&http://username:pass/word@localhost:22)rÞ   Úusernameú	pass/wordrQ  )z'http://user/name:pass/word@localhost:22)rÞ   rP  rS  rQ  zfile:/ftp.example.com)r   r   r1   r2   )r"   Zparse_proxy_test_casesZtcr)  r)   r)   r*   Útest_parse_proxy@  s   'zMiscTests.test_parse_proxyc                 C   sP   t ƒ }|  t¡}| d¡ W d   ƒ n1 sw   Y  |  t|jƒd¡ d S )NÚinvalidz5Unsupported digest authentication algorithm 'invalid')r   r1   r2   Zget_algorithm_implsr   rH   Ú	exception)r"   r+  Úexcr)   r)   r*   Útest_unsupported_algorithmm  s   ÿþz$MiscTests.test_unsupported_algorithmN)	rK   r    rL   rB  rJ  rK  rL  rT  rX  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)rK   r    rL   rÆ   r)   r)   r)   r*   Ú
PutRequestx  s    r[  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  rQ   ÚHEAD)rÆ   rc  )r   rQ  ÚpostÚheadr[  ÚputÚ
force_postr”   r)   r)   r*   ÚsetUp{  s   
þÿzRequestTests.setUpc                 C   s^   |   d| j ¡ ¡ |   d| j ¡ ¡ |   d| j ¡ ¡ |   d| j ¡ ¡ |   d| j ¡ ¡ d S )Nrc  rb  r]  rZ  )r   r^  r¶  rQ  r_  r`  ra  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 )Nrb  rr   rc  )r[   rQ  r…   r   r¶  rW   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 )NrN  é*   rr   )rn  rQ  ro  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 )NrN  rk   r  )rn  rQ  ro  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 )Nr\  )r   rQ  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   rQ  rÇ   r   r  r)   r)   r*   Útest_selectorª  s   zRequestTests.test_selectorc                 C   ó   |   d| jj¡ d S )NrÞ   )r   rQ  r_  r”   r)   r)   r*   Útest_get_type¯  ó   zRequestTests.test_get_typec                 C   rj  )NrŸ  )r   rQ  r¿   r”   r)   r)   r*   Útest_get_host²  rl  zRequestTests.test_get_hostc                 C   ó   t dƒ}|  d|j¡ d S )Nzhttp://www.%70ython.org/rŸ  ©r   r   r¿   r  r)   r)   r*   Útest_get_host_unquoteµ  ó   z"RequestTests.test_get_host_unquotec                 C   sR   |   | j ¡ ¡ | j dd¡ |  | j ¡ ¡ |  d| jj¡ |  d| jj¡ d S )Nrî  rÞ   rŸ  )r[   rQ  Z	has_proxyr–  rW   r   r§  r¿   r”   r)   r)   r*   rë  ¹  s
   zRequestTests.test_proxyc                 C   rn  )Nz<URL:http://www.python.org>rŸ  ro  r  r)   r)   r*   Útest_wrapped_urlÀ  rq  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_   rS   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.orgrt  rs  )r   r   r  r˜  )r"   r`  rS   r_   r)   r)   r*   Útest_url_fullurl_get_full_urlÏ  s
   þz*RequestTests.test_url_fullurl_get_full_urlN)rK   r    rL   r   r[  rb  rc  rd  rf  rg  rh  ri  rk  rm  rp  rë  rr  ru  rv  r)   r)   r)   r*   rY  w  s     

rY  Ú__main__)=r8  r  r   Ztest.supportr   r   r   r   r   rœ   rŒ   r“  r„  rz  r†  Zurllib.requestr/   r   r   r	   r
   r   r   r   r   Úurllib.parser   r   Zhttp.clientrÞ   ZTestCaser   rM   rƒ   rŽ   rè  r—   r   r›   r§   r¯   ÚIOBaser´   r¹   rÎ   rö   r÷   r   rI  rù   r  r  r  r  r  r:  r;  r=  rY  rK   Úmainr)   r)   r)   r*   Ú<module>   sl    (4 <

-6"         3 
aÿ