a
    äze„5 ã                   @   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 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,j/ƒZ0G d%d&„ d&ej,j-ƒZ1G d'd(„ d(ƒZ2G d)d*„ d*e jƒZ3d+d,„ Z4G d-d.„ d.e jƒZ5G d/d0„ d0e jƒZ6G d1d2„ d2e jƒZ7e8d3kre  9¡  dS )4é    N)Úsupport)Úsocket_helper)Útest_urllib)ÚRequestÚOpenerDirectorÚHTTPBasicAuthHandlerÚHTTPPasswordMgrWithPriorAuthÚ_parse_proxyÚ_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%   ú'/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_trivial0   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)r8   r9   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_listC   s    

ÿÿûz!TrivialTests.test_parse_http_listc                 C   s"   t j d¡}|  |jt|ƒ¡ d S )NÚreason)r+   r   ÚURLErrorÚassertInrA   Ústr)r   Úerrr%   r%   r&   Útest_URLError_reasonstrN   s    z$TrivialTests.test_URLError_reasonstrN)Ú__name__r   Ú__qualname__r'   r7   r@   rF   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   rN   )r   Úurlr%   r%   r&   Útest_request_headers_dictU   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
        rJ   rK   rL   rM   )rK   rL   zFoo-BarÚbaz)zFoo-barrQ   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   rO   Úreqr%   r%   r&   Útest_request_headers_methodsj   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_   rJ   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)rg   r`   )rh   ri   zhttp://example.com/foo/zhttp://example.com/foo/bazzhttp://example.com/foobar©NNzhttp://example.com/baz/rQ   Únininizhttp://example.com/baz)rQ   rk   zhttp://example.com/baz/barr9   ÚfirstrL   ÚsecondÚspam)rm   rn   r8   Ú1)ro   r8   zhttp://a.example.com/zc.example.comzc.example.com:3128)ra   r:   )rb   rc   )rd   re   ©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.
        r6   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:100rj   zg.example.com:80)rv   rw   zg.example.comzhttp://g.example.com:100zhttp://g.example.comzh.example.com)rx   r#   zh.example.com:80zhttp://h.example.com:80zi.example.com)ry   rz   zhttp://i.example.com:80)r|   r}   zj.example.com:80zhttp://j.example.comzhttp://j.example.com:80Nrp   rs   r%   r%   r&   Ú"test_password_manager_default_portä   sZ    
ÿÿÿÿÿÿÿÿÿÿÿz3RequestHdrsTests.test_password_manager_default_portN)rG   r   rH   rP   r\   ru   r~   r%   r%   r%   r&   rI   S   s   $VrI   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)rG   r   rH   Ú
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&   r5     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)rG   r   rH   r5   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)rG   r   rH   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ÚmsgrN   rO   )r   r–   r—   rN   r   rO   r%   r%   r&   r•   )  s    zMockResponse.__init__c                 C   s   | j S r€   rM   r   r%   r%   r&   Úinfo-  s    zMockResponse.infoc                 C   s   | j S r€   ©rO   r   r%   r%   r&   Úgeturl0  s    zMockResponse.geturl)N)rG   r   rH   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_header5  s    zMockCookieJar.add_cookie_headerc                 C   s   || | _ | _d S r€   )Úec_reqÚec_r)r   r   r   r%   r%   r&   Úextract_cookies8  s    zMockCookieJar.extract_cookiesN)rG   r   rH   r   r    r%   r%   r%   r&   r›   4  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__B  s    zFakeMethod.__call__N)rG   r   rH   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—   ÚstatusrA   r–   )r   r¨   r—   r©   rA   r%   r%   r&   r•   G  s
    zMockHTTPResponse.__init__c                 C   s   dS )NÚ r%   r   r%   r%   r&   r5   N  s    zMockHTTPResponse.readc                 C   s   i S r€   r%   r   r%   r%   r&   r˜   Q  s    zMockHTTPResponse.infoc                 C   s   | j S r€   r™   r   r%   r%   r&   rš   T  s    zMockHTTPResponse.geturlN)rG   r   rH   r•   r5   r˜   rš   r%   r%   r%   r&   r¦   F  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•   Y  s    zMockHTTPClass.__init__c                 C   s   || _ || _| S r€   )Úhostr‚   )r   r±   r‚   r%   r%   r&   r¥   a  s    zMockHTTPClass.__call__c                 C   s
   || _ d S r€   )r¬   )r   r¬   r%   r%   r&   Úset_debuglevelf  s    zMockHTTPClass.set_debuglevelNc                 C   s&   || _ || _|r|| _n
| j ¡  d S r€   )Ú_tunnel_hostZ_tunnel_portr°   Úclear)r   r±   ÚportrN   r%   r%   r&   Ú
set_tunneli  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¸   rO   ÚbodyrN   r·   r%   r%   r&   r   q  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)rG   r   rH   r•   r‡   rˆ   r¥   r²   r¶   r   r¾   rŽ   r%   r%   r%   r&   r«   X  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   ÚraiserL   F)ÚparentÚcallsÚappendr’   r   Ú
startswithÚrfindÚintr.   r   r+   rB   )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)
rG   r   rH   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©rG   r   rH   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–   rN   Úreset)r   r–   rN   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_stringrN   rÐ   r   r‰   r[   r’   Úget_full_url)r   r[   rë   rì   r   r—   r%   r%   r&   Ú	http_openñ  s    
ÿ
zMockHTTPHandler.http_openN©rG   r   rH   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   )rG   r   rH   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ª   )	rT   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€   )ÚrealmrO   Úuserr_   )r   r   Zurir  r_   r%   r%   r&   rq      s    z MockPasswordManager.add_passwordc                 C   s   || _ || _| j| jfS r€   )Útarget_realmÚ
target_urlr  r_   )r   r   Zauthurir%   r%   r&   rr   &  s    z&MockPasswordManager.find_user_passwordN)rG   r   rH   rq   rr   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&   Ú
NonHandler/  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   )rB   )rø   rÉ   )Z
proxy_openrÉ   )Zredirect_requestrÉ   )ZdoÚproxyÚredirectz://example.com/)
Úurllib.errorrB   r   rä   rß   r+   r   ZUnknownHandlerr-   rƒ   )r   rB   Úorá   Úschemer%   r%   r&   Útest_badly_named_methods4  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_handledI  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Þ   h  s   rÞ   r]   rÍ   )r   r¿   rÙ   rÒ   rß   rƒ   r   rÑ   )r   r  râ   rã   rÙ   rÞ   r<   r%   r%   r&   Útest_handler_orderc  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   rB   rƒ   r   rÑ   )r   r  rá   râ   r[   r%   r%   r&   Ú
test_raiseu  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)
rG   r   rH   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Ó   )r0   Úurlpathr%   r%   r&   Úsanepathname2url½  s    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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#d=d>„ Z$d?d@„ Z%dAdB„ Z&dCdD„ Z'dEdF„ Z(dGdH„ Z)dIdJ„ Z*dKdL„ Z+dMdN„ Z,dOdP„ Z-dQdR„ Z.dSS )TÚ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)rG   r   rH   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)rG   r   rH   r•   r‡   rˆ   r0  r%   r/  r%   r&   ÚNullFTPHandler×  s   ÿr1  r   zrheum rhaponicumz ftp://localhost/foo/bar/baz.htmlÚ	localhostrª   ÚIrg   rh   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   r1  r9  r   r<   rO   r±   rµ   r  r,  Útype_r-  r(  Zmimetyper[   r  rN   r%   r/  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%sr2  rª   ÚwbT)Zusegmtr7  z
text/plainr8  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   r0   r1   r‡   r:  ÚgethostnameÚgaierrorrÒ   rƒ   ÚwriterŽ   Z	file_openr   r5   r˜   rš   ÚstatZutilsZ
formatdateÚst_mtimeÚremover   Úgetcwdr-   r   rB   rW   ÚassertIsr[   Útype)r   rë   r<   r  rA  r#  ZtowriteÚurlsZ	localaddrrO   r6   r  r   rN   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ÚFoorh   ÚSpamÚeggsr§   r½   rf   r   r(   ))Ú
ConnectionrŽ   )rO  rh   ©rP  rQ  TZbadpostrS  )ó    Nrª   r8  r7  Ú0z!application/x-www-form-urlencodedÚHostrg   rQ   )#r+   r   rö   r   rÐ   r   r‚   rZ   r«   rø   r5   rŒ   r˜   rš   r–   r—   r;  Ú__contains__r   r±   r¬   r¸   r¹   r­   r   r®   r-   r   rB   r  Údo_request_r†   r’   ÚassertNotInÚunredirected_hdrs)r   r<   r  rO   r¸   r   r[   rÎ   r  ÚhdrsÚnewreqr%   r%   r&   Ú	test_httpg  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Úchunkedr8  úContent-Lengthé   )r+   r   rö   r   rÐ   ÚtempfileÚNamedTemporaryFiler   rŽ   r*   r   Úunlinkrƒ   r   rX  rY   r   rW   rT   rÕ   )	r   r<   r  Úfile_objZ	file_pathr6   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]   ra  rb  r8  rc  rd  )r+   r   rö   r   rÐ   r“   ÚBytesIOr   rX  r   rY   rW   rT   rÕ   rŽ   )r   r<   r  rh  r[   r\  rN   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Úpassrc  rd  )Ústdoutr]   r8  ra  rb  )r+   r   rö   r   rÐ   ÚsysÚ
executableÚ
subprocessÚPopenÚPIPEr   rn  rX  r   rY   rÕ   )r   r<   r  ÚcmdrN   Ú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_bodyrc  é   r]   r8  ra  rb  )
r+   r   rö   r   rÐ   r   rX  r   rY   rÕ   )r   r<   r  rw  rN   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%   ra  rb  r8  )r+   r   rö   r   rÐ   rX  r   r   rY   rW   rT   )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 )Nr3  )rÍ   rÃ   é   é   rc  é   r]   r8  )r+   r   rö   r   rÐ   Úarrayr   rX  r   rÕ   rY   )r   r<   r  Ziterable_arrayrN   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 )NrT  )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.htmlrV  rf   zsomeproxy:3128)
r+   r   rö   r   rÐ   r   rX  r   rZ  Ú	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#bashrJ   rJ   rª   )r   Úfull_urlr   r   rð   ÚfragmentÚquery)r   rK  r  rO   Ú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ƒ  rX   r„  r   r¹   )r   r  r%   r%   r&   Útest_full_url_deleterQ  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   rX  r   r±   r¹   )r   r<   Z	weird_urlr[   r\  Zurl_without_pathr%   r%   r&   Útest_fixpath_in_weirdurlsX  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  rI  rW   rÚ   rX   r   r„   r…   )r   r<   r  rO   r[   r  Únewrr%   r%   r&   Útest_errorsk  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ª   rf   )r›   r+   r   ÚHTTPCookieProcessorr   rÐ   r   r’   r  rI  rœ   r   Úorigin_req_hostrW   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=withholdrc  rP  rn   ÚBlahÚlocationr–  rM  c                 S   s   g | ]}|  ¡ ‘qS r%   )Úlower)Ú.0Úxr%   r%   r&   Ú
<listcomp>´  rT  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[   rO   r%   r%   r&   r
  Á  s    
ÿz,HandlerTests.test_redirect.<locals>.redirectrf   )r’  r   r]   rÍ   zhttp://example.com/%d)r+   r   ÚHTTPRedirectHandlerr   rÐ   Úgetattrr   r‡   rˆ   r‚   rU   rD   rÄ   rZ   r‰   r   r   Ú	HTTPErrorr   ÚassertIsNotNoner[   rð   Ú
get_methodÚAttributeErrorrW   r   rN   rY  rZ  Zmax_repeatsZmax_redirections)r   Úfrom_urlZto_urlr<   r  r–   r   r¸   r[   rN   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ƒ   rW   r[   rT   )	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¸   rO   ÚposÚkw©Z
real_classr   rK  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Å   Úiterr/   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ñ   2  s    
ÿz>HandlerTests.test_redirect_encoding.<locals>.Handler.http_openN)rG   r   rH   rñ   r%   r%   r%   r&   ÚHandler1  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Â  rS   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œ  a  rT  z+HandlerTests.test_proxy.<locals>.<listcomp>)Údictr   r+   r   ÚProxyHandlerrß   rä   r   r   r±   rƒ   rÑ   )r   r!   rc   r  Úphrá   râ   r[   r%   r%   r&   Ú
test_proxyQ  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_proxyc  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_allr  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œ  ‹  rT  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   rU   r   r±   rX   r³   rƒ   rY  r÷   r­   rC   r   rY   )r   r  rÓ  Zhttps_handlerr[   r%   r%   r&   Ú$test_proxy_https_proxy_authorization  s(    


ÿÿz1HandlerTests.test_proxy_https_proxy_authorizationÚ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notinbypassz!expected bypass of %s to be FalseTÚtestz10.0.0.0/40z172.19.10.0/24z172.19.10.5z10.0.1.5)rS   r
   rW   )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   rN   z
rê   é‘  rþ   ú!http://acme.example.com/protected)
rÉ  r   rÿ   r+   r   r   Újoinræ   rß   Ú_test_basic_auth)r   rN   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_strrN   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•     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   s    zXHandlerTests.test_basic_and_digest_auth_handlers.<locals>.RecordingOpenerDirector.recordN)rG   r   rH   r•   r   r%   r%   r%   r&   ÚRecordingOpenerDirector  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©rG   r   rH   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  *  s    ÿÿz]HandlerTests.test_basic_and_digest_auth_handlers.<locals>.TestBasicAuthHandler.http_error_401Nr  r%   r%   r%   r&   ÚTestBasicAuthHandler)  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_handlerD  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_handlerN  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Í   )Úbase64rq   r   r   rO   r  r_   rƒ   r  r  rÄ   ré   rW   rT   ÚbytesZencodebytesrµ  ÚdecoderY   rZ  rç   )r   rà   ró  Zauth_headerr   rô  rò  Úrequest_urlZprotected_urlr  r  r_   ZuserpassZauth_hdr_valuer%   r%   r&   rñ  X  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   rq   rS   r  rW   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   rq   r  rW   r   rß   ræ   rƒ   rS   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ø   r5   rS   Ú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 responserT  r  NzConnection not closed)r   r½  r+   r   rö   r   r‚   r-   rÎ   rî   ZBadStatusLinerø   rS   r  r  )r   r¹  r  r[   r%   r%   r&   Útest_invalid_closedÑ  s    

*z HandlerTests.test_invalid_closedN)/rG   r   rH   r=  rL  r]  rj  rl  rv  ry  rz  r  r€  r‚  r‡  r‰  rŒ  r  r”  r¤  rª  r¬  r´  r¶  r¿  rË  rÔ  rÛ  rÝ  rá  rç  r"  Z
skipUnlessro  Úplatformrí  rõ  rü  rþ  r	  r
  r  rñ  r  r  r  r  r%   r%   r%   r&   r%  É  sR   @\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>)rS   Ú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)rG   r   rH   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)rG   r   rH   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: 42rA   rN   zHTTP Error %s: %sz<HTTPError %s: %r>)r+   r   rŸ  rS   rÚ   r   rA   rN   r–   r—   rD   rÊ  )r   r—   rO   r–   r¨   r[  rE   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Ì  r/  r0  )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.comr1  )z&http://user/name:password@localhost:22)rÎ   ú	user/namer_   úlocalhost:22)z&http://username:pass/word@localhost:22)rÎ   Úusernameú	pass/wordr3  )z'http://user/name:pass/word@localhost:22)rÎ   r2  r5  r3  zfile:/ftp.example.com)r   r	   r-   r.   )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 s00    Y  |  t|jƒd¡ d S )NÚinvalidz5Unsupported digest authentication algorithm 'invalid')r   r-   r.   Zget_algorithm_implsr   rD   Ú	exception)r   r  Úexcr%   r%   r&   Útest_unsupported_algorithmM  s    (þz$MiscTests.test_unsupported_algorithmN)rG   r   rH   r%  r-  r.  r6  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)rG   r   rH   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ì  rM   ÚHEAD)r¸   rN  )r   r;  Ú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 )NrN  rM  r?  r<  )r   r@  r¡  r;  rA  rB  rC  r   r%   r%   r&   Útest_methode  s
    zRequestTests.test_methodc                 C   sL   |   | jj¡ |  d| j ¡ ¡ d| j_|  | jj¡ |  d| j ¡ ¡ d S )NrM  rn   rN  )rW   r;  r   r   r¡  rS   r   r%   r%   r&   Ú	test_datal  s
    zRequestTests.test_datac                 C   sN   |   d| jj¡ | j dd¡ |  d| jjd ¡ d| j_|   d| jj¡ d S )Nr8  é*   rn   )rY  r;  rZ  rZ   r   r   r   r%   r%   r&   Ú.test_setting_data_should_remove_content_lengthv  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 )Nr8  rg   r{  )rY  r;  rZ  r   rZ   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   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;  rJ  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Š  )rW   r;  Z	has_proxyr  rS   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Š  rN  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[   rO   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.orgrR  rQ  )r   r   rð   rƒ  )r   rK  rO   r[   r%   r%   r&   Útest_url_fullurl_get_full_url¯  s    z*RequestTests.test_url_fullurl_get_full_urlN)rG   r   rH   r   r=  rD  rE  rF  rH  rI  rJ  rK  rL  rM  rO  rÔ  rP  rS  rT  r%   r%   r%   r&   r;  W  s   

r;  Ú__main__):r"  rì  r   Ztest.supportr   r   r   r“   r‡   r~  ro  re  rq  Zurllib.requestr+   r   r   r   r   r	   r
   r   Úurllib.parser   r  Zhttp.clientrÎ   ZTestCaser   rI   r   r‰   rÑ  r   r”   r’   r›   r¡   ÚIOBaser¦   r«   r¿   rä   rå   r   r,  ræ   rö   ró   rû   rÿ   r  r$  r%  r   r;  rG   Úmainr%   r%   r%   r&   Ú<module>   sb   $4 <

-6"         {a
