B
    18™\Ý, ã               @   s  d dl 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-ƒZ.G d$d%„ d%ej*j+ƒZ/G d&d'„ d'ƒZ0G d(d)„ d)e jƒZ1d*d+„ Z2G d,d-„ d-e jƒZ3G d.d/„ d/e jƒZ4G d0d1„ d1e jƒZ5e6d2kre  7¡  dS )3é    N)Úsupport)Ú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¤   xždD ]–}i }t d| |ƒ |d= |dkrftjdkrf| d¡| d¡ }}|  |jd¡ |  |jd¡ x4| ¡ D ](\}}|  |jd	| d
|||jf ¡ qpW qW 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$   úU/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/test/test_urllib2.pyÚtest___all__    s    
zTrivialTests.test___all__c             C   sh   |   ttjjd¡ tj tjj¡ 	tj
d¡}tjdkr@d| }nd| }tj |¡}| ¡  | ¡  d S )Nz	bogus urlú/r   z
file:///%sz	file://%s)ÚassertRaisesÚ
ValueErrorÚurllibr   Úurlopenr   ÚpathÚabspathÚ__file__ÚreplaceÚsepr   ÚreadÚclose)r   ÚfnameZfile_urlÚfr$   r$   r%   Útest_trivial/   s    

zTrivialTests.test_trivialc          
   C   sd   ddddgfdddgfdddd	d
dddgfddddgfg}x$|D ]\}}|   tj |¡|¡ q@W d S )Nza,b,cÚaÚbÚczpath"o,l"og"i"cal, examplezpath"o,l"og"i"calÚexampleza, b, "c", "d", "e,f", g, hz"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   Úparse_http_list)r   ÚtestsÚstringÚlistr$   r$   r%   Útest_parse_http_listA   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_reasonstrL   s    z$TrivialTests.test_URLError_reasonstrN)Ú__name__r   Ú__qualname__r&   r5   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.

        zhttp://example.comz	Spam-eggsÚblah)Úheadersz	spam-EggSN)r   r   rK   )r   Úurlr$   r$   r%   Útest_request_headers_dictS   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
        zhttp://example.comz	Spam-eggsrJ   )rK   )z	Spam-eggsrJ   zFoo-BarÚbaz)zFoo-barrN   z	Not-thereÚdefaultzUnredirected-spamZEggsN)r   Ú
assertTrueÚ
has_headerr   Úheader_itemsÚ
add_headerÚsortedÚassertFalseÚassertIsNoneÚ
get_headerÚremove_headerÚadd_unredirected_header)r   rL   Úreqr$   r$   r%   Útest_request_headers_methodsh   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 S ),Nz
Some Realmzhttp://example.com/ÚjoeÚpasswordzhttp://example.com/niÚnizhttp://c.example.com:3128Ú3r8   zd.example.comÚ4Údze.example.com:3128Ú5Úezexample.com)r\   r]   zhttp://example.comzhttp://example.com/spamzhttp://example.com/spam/spamzhttp://example.com/fooÚfoozhttp://example.com/barÚbarÚnini)rd   r^   )re   rf   r7   ÚfirstrJ   ÚsecondÚspam)rh   ri   r6   Ú1)rj   r6   zhttp://a.example.com/)NNzc.example.comzc.example.com:3128)r_   r8   )r`   ra   )rb   rc   )r*   r   ÚHTTPPasswordMgrÚadd_passwordÚfind_user_passwordr   )r   ÚmgrÚaddÚ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.
        r4   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:100)NNzg.example.com:80)rr   rs   zg.example.comzhttp://g.example.com:100zhttp://g.example.comzh.example.com)rt   r"   zh.example.com:80zhttp://h.example.com:80zi.example.com)ru   rv   zhttp://i.example.com:80)rx   ry   zj.example.com:80zhttp://j.example.comzhttp://j.example.com:80N)r*   r   rk   rl   rm   r   )r   rn   ro   rp   r$   r$   r%   Ú"test_password_manager_default_portÒ   sD    
z3RequestHdrsTests.test_password_manager_default_portN)rG   r   rH   rM   r[   rq   rz   r$   r$   r$   r%   rI   Q   s   $FrI   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)rZ   ÚdataÚtimeout)r   rZ   r|   r}   r$   r$   r%   Úopenÿ   s    zMockOpener.openc             G   s   || | _ | _d S )N)Ú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 )Nr$   )r   Úcountr$   r$   r%   r1     s    zMockFile.readc             C   s   d S )Nr$   )r   r…   r$   r$   r%   Úreadline
  s    zMockFile.readlinec             C   s   d S )Nr$   )r   r$   r$   r%   r2     s    zMockFile.close)N)N)rG   r   rH   r1   r†   r2   r$   r$   r$   r%   r„     s   

r„   c               @   s   e Zd Zdd„ ZdS )ÚMockHeadersc             C   s   t |  ¡ ƒS )N)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 )N)ÚioÚStringIOÚ__init__ÚcodeÚmsgrK   rL   )r   rŽ   r   rK   r|   rL   r$   r$   r%   r     s    zMockResponse.__init__c             C   s   | j S )N)rK   )r   r$   r$   r%   Úinfo  s    zMockResponse.infoc             C   s   | j S )N)rL   )r   r$   r$   r%   Úgeturl  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 )N)Úach_req)r   r   r$   r$   r%   Úadd_cookie_header#  s    zMockCookieJar.add_cookie_headerc             C   s   || | _ | _d S )N)Úec_reqÚec_r)r   r   r   r$   r$   r%   Úextract_cookies&  s    zMockCookieJar.extract_cookiesN)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S )Ú
FakeMethodc             C   s   || _ || _|| _d S )N)Ú	meth_nameÚhandleÚaction)r   r™   r›   rš   r$   r$   r%   r   +  s    zFakeMethod.__init__c             G   s   | j | j| jf|žŽ S )N)rš   r™   r›   )r   r€   r$   r$   r%   Ú__call__0  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   5  s
    zMockHTTPResponse.__init__c             C   s   dS )NÚ r$   )r   r$   r$   r%   r1   <  s    zMockHTTPResponse.readc             C   s   i S )Nr$   )r   r$   r$   r%   r   ?  s    zMockHTTPResponse.infoc             C   s   | j S )N)rL   )r   r$   r$   r%   r‘   B  s    zMockHTTPResponse.geturlN)rG   r   rH   r   r1   r   r‘   r$   r$   r$   r%   r   4  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_headers)r   r$   r$   r%   r   G  s    zMockHTTPClass.__init__c             C   s   || _ || _| S )N)Úhostr}   )r   r¨   r}   r$   r$   r%   rœ   O  s    zMockHTTPClass.__call__c             C   s
   || _ d S )N)r£   )r   r£   r$   r$   r%   Úset_debuglevelT  s    zMockHTTPClass.set_debuglevelNc             C   s&   || _ || _|r|| _n
| j ¡  d S )N)Ú_tunnel_hostÚ_tunnel_portr§   Úclear)r   r¨   ÚportrK   r$   r$   r%   Ú
set_tunnelW  s
    zMockHTTPClass.set_tunnelF)Úencode_chunkedc            C   sP   || _ || _|d k	r&|  j| ¡ 7  _| j ¡  |r:|| _|| _| jrLtƒ ‚d S )N)	ÚmethodÚselectorr¤   r   Úsortr|   r¯   r¥   ÚOSError)r   r°   rL   ÚbodyrK   r¯   r$   r$   r%   r   _  s    
zMockHTTPClass.requestc             C   s   t tƒ i ddƒS )Nrž   ÚOK)r   r„   )r   r$   r$   r%   Úgetresponsel  s    zMockHTTPClass.getresponsec             C   s   d S )Nr$   )r   r$   r$   r%   r2   o  s    zMockHTTPClass.close)NN)NN)rG   r   rH   r   r‚   rƒ   rœ   r©   r®   r   r¶   r2   r$   r$   r$   r%   r¢   F  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 )ÚMockHandleriô  c             C   s   |   |¡ d S )N)Ú_define_methods)r   Úmethodsr$   r$   r%   r   x  s    zMockHandler.__init__c             C   sN   xH|D ]@}t |ƒdkr |\}}n
|d  }}t||| jƒ}t| j||ƒ qW 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 k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 … }yt|ƒ}W n tk
r˜   Y nX tddi dƒ}| j  	d|d ||di ¡S |dkrÖt
j	 d¡‚dsÞt‚d S )Nzreturn selfzreturn responserž   rµ   r¡   zreturn requestzhttp://blah/r   ú é   Úhttpr   ÚraiserJ   F)ÚparentÚcallsÚappendrŠ   r   Ú
startswithÚrfindÚintr)   r   r*   rB   ÚAssertionError)r   Úfn_namer›   r€   ÚkwdsÚresrŽ   r$   r$   r%   rš   „  s*    
zMockHandler.handlec             C   s   d S )Nr$   )r   r$   r$   r%   r2   ›  s    zMockHandler.closec             C   s   || _ g | j _d S )N)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š   r2   rÎ   rÒ   r$   r$   r$   r%   r·   s  s   	r·   c             C   sf   g }d}xX|D ]P}G dd„ dt ƒ}||ƒ}| j|7  _| | ¡ |d }| |¡ |  |¡ qW |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 ƒ }x| D ]}| |¡ qW |S )N)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 )N)rŽ   rK   Úreset)r   rŽ   rK   r$   r$   r%   r   Ö  s    zMockHTTPHandler.__init__c             C   s   d| _ g | _d S )Nr   )Ú_countÚrequests)r   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Â   z

rž   rµ   r¡   )ÚemailÚcopyrÞ   rÆ   ÚdeepcopyrÝ   rÂ   ÚclientÚ	responsesrŽ   Úmessage_from_stringrK   rÄ   r   r„   rZ   rŠ   Úget_full_url)r   rZ   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 )N)Údo_openrê   )r   rZ   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 )NF)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¡   )	rQ   rî   rÂ   râ   rã   rŽ   rŠ   r„   rå   )r   rZ   r   r$   r$   r%   ræ     s    
z"MockHTTPHandlerCheckAuth.http_openN)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 )ÚMockPasswordManagerc             C   s   || _ || _|| _|| _d S )N)ÚrealmrL   Úuserr]   )r   rñ   Úurirò   r]   r$   r$   r%   rl     s    z MockPasswordManager.add_passwordc             C   s   || _ || _| j| jfS )N)Útarget_realmÚ
target_urlrò   r]   )r   rñ   Úauthurir$   r$   r%   rm     s    z&MockPasswordManager.find_user_passwordN)rG   r   rH   rl   rm   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>.NonHandlerN)rG   r   rH   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 ¡ ¡ x dD ]}|  ||j	|d ¡ q@W d S )Nr   )rB   )rë   zreturn self)Ú
proxy_openzreturn self)Úredirect_requestzreturn self)ZdoÚproxyÚredirectz://example.com/)
Úurllib.errorrB   r   rÙ   rÔ   r*   r   ÚUnknownHandlerr(   r~   )r   rB   ÚorÖ   Úschemer$   r$   r%   Útest_badly_named_methods"  s    	

z,OpenerDirectorTests.test_badly_named_methodsc             C   sª   t ƒ }dddgdgdgdgg}t||ƒ}tdƒ}| |¡}|  ||d ¡ |d df|d dfg}xBt||jƒD ]2\}}|\}	}
}}|  |	|
f|¡ |  ||f¡ qpW d S )Nræ   Úftp_openÚhttp_error_302)ræ   zreturn selfzhttp://example.com/rº   r   )r   rÙ   r   r~   r   ÚziprÅ   )r   r  rÖ   r×   rZ   ÚrrÅ   ÚexpectedÚgotÚhandlerr   r€   rÌ   r$   r$   r%   Útest_handled7  s    

z OpenerDirectorTests.test_handledc             C   s    t ƒ }g }xRdgdfdgdfgD ]:\}}G dd„ dtƒ}||ƒ}||_| |¡ | |¡ q W | d¡ |  |jd d |d ¡ |  |jd d |d ¡ d S )	N)ræ   zreturn selfiô  ræ   r   c               @   s   e Zd ZdS )zCOpenerDirectorTests.test_handler_order.<locals>.MockHandlerSubclassN)rG   r   rH   r$   r$   r$   r%   rÓ   V  s   rÓ   zhttp://example.com/rÁ   )r   r·   rÏ   rÆ   rÔ   r~   r   rÅ   )r   r  r×   rØ   rÏ   rÓ   r;   r$   r$   r%   Útest_handler_orderQ  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æ   zreturn selfzhttp://example.com/r   ræ   )
r   rÙ   r   r(   r*   r   rB   r~   r   rÅ   )r   r  rÖ   r×   rZ   r$   r$   r%   Ú
test_raisec  s    
zOpenerDirectorTests.test_raisec             C   sÖ   t ƒ }dgddgdddgdgg}t||ƒ}G dd	„ d	ƒ}td
ƒ}| |¡ t|jƒdks\t‚|d d|ff|d d||ƒ ddi ffg}xJt||jƒD ]:\}}|\}	}
}|  |	|
f|d d… ¡ |  ||d ¡ q”W d S )N)ræ   z	error 302)Zhttp_error_400rÃ   ræ   )r  zreturn responseÚhttp_error_303Ú
http_errorr  c               @   s   e Zd Zdd„ ZdS )z4OpenerDirectorTests.test_http_error.<locals>.Unknownc             S   s   dS )NTr$   )r   rÑ   r$   r$   r%   Ú__eq__~  s    z;OpenerDirectorTests.test_http_error.<locals>.Unknown.__eq__N)rG   r   rH   r  r$   r$   r$   r%   ÚUnknown}  s   r  zhttp://example.com/rº   r   i.  r¡   )	r   rÙ   r   r~   r»   rÅ   rÊ   r  r   )r   r  rÖ   r×   r  rZ   rÅ   r	  r
  r  Úmethod_namer€   r$   r$   r%   Útest_http_errorp  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}x¬t|jƒD ]ž\}\}}}	}
|dk r¸|  ||f|| ¡ |  t|	ƒd¡ |  |	d t¡ qj|  ||f|| ¡ |  t|	ƒd¡ |  |	d t¡ |	d d k	rj|  |	d t	¡ qjW d S )	N)Úhttp_requestzreturn request)Úhttp_responsezreturn responsezhttp://example.com/r   r  rÁ   r  rº   )
r   rÙ   r   r~   Ú	enumeraterÅ   r   r»   ÚassertIsInstancerŠ   )r   r  rÖ   r×   rZ   rÅ   rw   r  r   r€   rÌ   r$   r$   r%   Útest_processorsŒ  s(    

z#OpenerDirectorTests.test_processorsN)
rG   r   rH   rû   r  r  r  r  r  r  r$   r$   r$   r%   r÷     s   r÷   c             C   s^   y|   d¡ W n tk
r,   t d¡‚Y nX tj | ¡}tjdkrZ| 	d¡rZ|dd … }|S )Nzutf-8zpath is not encodable to utf8r   z///rº   )
ÚencodeÚUnicodeEncodeErrorÚunittestÚSkipTestr*   r   r   r   r   rÇ   )r,   Úurlpathr$   r$   r%   Úsanepathname2url°  s    r  c               @   sh  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#dWd>d?„Z$d@dA„ Z%dBdC„ Z&dDdE„ Z'dFdG„ Z(dHdI„ Z)dJdK„ Z*dLdM„ Z+dNdO„ Z,dPdQ„ Z-dRdS„ Z.dTdU„ Z/dVS )XÚHandlerTestsc                s´  G dd„ dƒ‰ G ‡ fdd„dt jjƒ}dd l}d}||ƒ}tƒ |_xjd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	gD ]Ì\	}}}}}	}
}}}t|ƒ}d |_| 	|¡}|  
|j|¡ |  
|j|	¡ |  
|jt |¡¡ |  
|j|¡ |  
|j|¡ |  
|jj|¡ |  
|jj|
¡ | ¡ }|  
| d¡|¡ |  
t|d ƒt|ƒ¡ qàW 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 )N)r|   )r   r|   r$   r$   r%   r   À  s    z6HandlerTests.test_ftp.<locals>.MockFTPWrapper.__init__c             S   s$   || | _ | _t | j¡t| jƒfS )N)ÚfilenameÚfiletyper‹   rŒ   r|   r»   )r   r!  r"  r$   r$   r%   ÚretrfileÃ  s    z6HandlerTests.test_ftp.<locals>.MockFTPWrapper.retrfilec             S   s   d S )Nr$   )r   r$   r$   r%   r2   Ç  s    z3HandlerTests.test_ftp.<locals>.MockFTPWrapper.closeN)rG   r   rH   r   r#  r2   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 )N)r|   )r   r|   r$   r$   r%   r   Ë  s    z6HandlerTests.test_ftp.<locals>.NullFTPHandler.__init__c                s4   || | _ | _|| | _| _|| _ˆ | jƒ| _| jS )N)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ƒ   r(  r$   )r$  r$   r%   ÚNullFTPHandlerÊ  s   r)  r   zrheum rhaponicumz ftp://localhost/foo/bar/baz.htmlÚ	localhostr¡   ÚIrd   re   zbaz.htmlz	text/htmlz'ftp://parrot@localhost/foo/bar/baz.htmlÚ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.gifzContent-typezContent-length)r*   r   Ú
FTPHandlerÚftplibr{   rÄ   ÚFTP_PORTr   r}   r  r   rò   r%  r¨   r‚   Úgethostbynamer­   r&  r'  r!  r"  r   ÚgetrÉ   r»   )r   r)  r1  r|   r;   rL   r¨   r­   rò   r%  Útype_r&  r!  ÚmimetyperZ   r  rK   r$   )r$  r%   Útest_ftp¾  sL    
"
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}yt t ¡ ¡}W n tjk
r„   d}Y nX |rœ| d||f ¡ xÜ|D ]Ô}	t|dƒ}
zpz|
 |¡ W d |
 ¡  X | t|	ƒ¡}z| ¡ }| ¡ }| ¡ }W d | ¡  X t	 |¡}|jj|jd	d
}W d t	 |¡ X |  ||¡ |  |d d¡ |  |d d¡ |  |d |¡ |  ||	¡ q¢W xŠd| dddt d¡t	 ¡ |f dt	 ¡ |f gD ]T}	z@t|dƒ}
z|
 |¡ W d |
 ¡  X |   tj!j"|jt|	ƒ¡ W d t	 |¡ X q®W tj ¡ }tƒ  }|_x|dD ]t\}	}t|	ƒ}y| |¡ W n$ tj!j"k
rd   |  #|¡ Y nX |  $|j%|¡ |  |j&d¡ |  |j&dk|¡ q"W d S )Nr   s   hello, world
zfile://localhost%sz	file://%szfile://%s%sr*  r¡   ÚwbT)ÚusegmtzContent-typez
text/plainzContent-lengthrx   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)'Úemail.utilsr*   r   ÚFileHandlerr{   rÄ   r   ÚTESTFNr  r   r,   r-   r‚   r3  ÚgethostnameÚgaierrorrÆ   r~   Úwriter2   Ú	file_openr   r1   r   r‘   ÚstatÚutilsÚ
formatdateÚst_mtimeÚremover   Úgetcwdr(   r   rB   rU   ÚassertIsrZ   Útype)r   rß   r;   r  r=  r  ZtowriteÚurlsÚ	localaddrrL   r4   r  r|   rK   ZrespurlÚstatsÚmodifiedr:  rZ   r$   r$   r%   Ú	test_fileþ  s|    











zHandlerTests.test_filec             C   sr  t j ¡ }tƒ  }|_d}xì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dddg¡ |  |j|¡ q W d|_|  t jj|j	||¡ tddƒ}|  t|j|¡ dg|_x$dD ]}td|ƒ}t ddi dƒ}| |¡}
|d k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¡ qNW d S )Nzhttp://example.com/))ÚGETN)ÚPOSTs   blahÚFoore   ÚSpamÚeggsrž   rµ   zexample.comr   r'   )Ú
Connectionr2   )rQ  re   )rR  rS  TZbadpost)ó    Nr¡   zContent-lengthzContent-typeÚ0z!application/x-www-form-urlencodedÚHostrd   rN   )#r*   r   ré   r{   rÄ   r   r}   rY   r¢   rë   r1   r†   r   r‘   rŽ   r   r4  Ú__contains__r   r¨   r£   r°   r±   r¤   r|   r¥   r(   r   rB   rú   Údo_request_r   rŠ   ÚassertNotInÚunredirected_hdrs)r   r;   r  rL   r°   r|   rZ   rÂ   r  ÚhdrsÚnewreqr$   r$   r%   Ú	test_httpZ  sh    
   





zHandlerTests.test_httpc       	   	   C   sì   t j ¡ }tƒ  }|_tjddd}|j}| ¡  |  	t
j|¡ t|dƒB}td|i ƒ}| |¡}| d¡}|  |d¡ |  | d¡¡ W d Q R X t|dƒF}td|d	d
iƒ}| |¡}|  t| d¡ƒd
¡ |  | d¡¡ W d Q R X d S )Nzw+bF)ÚmodeÚdeleteÚrbzhttp://example.com/zTransfer-encodingÚchunkedzContent-lengthzContent-Lengthé   )r*   r   ré   r{   rÄ   ÚtempfileÚNamedTemporaryFiler   r2   Ú
addCleanupr   Úunlinkr~   r   rY  rW   r   rU   rQ   rÉ   )	r   r;   r  Úfile_objÚ	file_pathr4   rZ   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 )Nzhttp://example.com/zTransfer-encodingrb  zContent-lengthzContent-Lengthrc  )r*   r   ré   r{   rÄ   r‹   ÚBytesIOr   rY  r   rW   rU   rQ   rÉ   r2   )r   r;   r  rh  rZ   r]  rK   r$   r$   r%   Útest_http_body_fileobjµ  s    


z#HandlerTests.test_http_body_fileobjc          
   C   s°   t j ¡ }tƒ  }|_tjddg}xˆi ddifD ]x}tj|tj	d^}t
d|j|ƒ}| |¡}|sˆ|  | d¡d ¡ |  | d¡d	¡ n|  t| d¡ƒd¡ W d Q R X q0W d S )
Nz-cÚpasszContent-Lengthrc  )Ústdoutzhttp://example.com/zContent-lengthzTransfer-encodingrb  )r*   r   ré   r{   rÄ   ÚsysÚ
executableÚ
subprocessÚPopenÚPIPEr   ro  rY  r   rW   rÉ   )r   r;   r  ÚcmdrK   ÚprocrZ   r]  r$   r$   r%   Útest_http_body_pipeÌ  s    

z HandlerTests.test_http_body_pipec             C   s   t j ¡ }tƒ  }|_dd„ }xli ddifD ]\}td|ƒ |ƒ}| |¡}|sr|  | d¡d ¡ |  | d¡d¡ q,|  t	| d¡ƒd¡ q,W 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_bodyzContent-Lengthé   zhttp://example.com/zContent-lengthzTransfer-encodingrb  )
r*   r   ré   r{   rÄ   r   rY  r   rW   rÉ   )r   r;   r  rx  rK   rZ   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 )Nzhttp://example.com/r$   zTransfer-encodingrb  zContent-length)r*   r   ré   r{   rÄ   rY  r   r   rW   rU   rQ   )r   r;   rZ   r$   r$   r%   Útest_http_body_empty_seqö  s
    
z%HandlerTests.test_http_body_empty_seqc             C   sp   t j ¡ }tƒ  }|_t dddddg¡}x@i ddifD ]0}td||ƒ}| |¡}|  t	| 
d	¡ƒd¡ q8W d S )
Nr+  rÁ   rº   é   é   zContent-Lengthé   zhttp://example.com/zContent-length)r*   r   ré   r{   rÄ   Úarrayr   rY  r   rÉ   rW   )r   r;   r  Ziterable_arrayrK   rZ   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   Ú_debuglevel)r   r  r;   r$   r$   r%   Útest_http_handler_debuglevel  s
    


z)HandlerTests.test_http_handler_debuglevelc             C   s‚   t j ¡ }tƒ |_d}ddddg}xZ|D ]R}t||ƒ}| |¡}|  |jd d¡ | 	dd ¡ | |¡}|  |jd d¡ q(W d S )	NrU  z#http://example.com/foo/bar/baz.htmlz$http://example.com//foo/bar/baz.htmlz$http://example.com/foo//bar/baz.htmlz$http://example.com/foo/bar//baz.htmlrW  zexample.comzsomeproxy:3128)
r*   r   ré   r{   rÄ   r   rY  r   r[  Ú	set_proxy)r   r;   r|   Zds_urlsZds_urlZds_reqZ	np_ds_reqZp_ds_reqr$   r$   r%   Útest_http_doubleslash  s    




z"HandlerTests.test_http_doubleslashc             C   sn   dddg}t dƒ}xV|D ]N}||_t|ƒ}|  | ¡ |¡ |  |jpFd|j¡ |  t| ¡ ƒj|j¡ qW d S )Nzhttp://example.com?foo=bar#bazz)http://example.com?foo=bar&spam=eggs#bashzhttp://example.comr¡   )r   Úfull_urlr   r   rå   ÚfragmentÚquery)r   rJ  r  rL   Úparsedr$   r$   r%   Útest_full_url_setter-  s    
z!HandlerTests.test_full_url_setterc             C   s6   t dƒ}|`|  |j¡ |  |j¡ |  |jd¡ d S )Nzhttp://www.example.comr¡   )r   r…  rV   r†  r   r±   )r   r  r$   r$   r%   Útest_full_url_deleterD  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?getspamzwww.python.orgz	/?getspamzhttp://www.python.orgr¡   )
r*   r   ré   r{   rÄ   r   rY  r   r¨   r±   )r   r;   Z	weird_urlrZ   r]  Zurl_without_pathr$   r$   r%   Útest_fixpath_in_weirdurlsK  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 )Nzhttp://example.com/rž   rµ   r¡   r   éÊ   ÚAcceptedéÎ   zPartial contentiö  zBad gatewayrÂ   )r*   r   ÚHTTPErrorProcessorr{   rÄ   r   rŠ   r  rH  rU   rÐ   rV   r   r   r€   )r   r;   r  rL   rZ   r  Únewrr$   r$   r%   Útest_errors^  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 )Nzhttp://example.com/rž   rµ   r¡   zexample.com)r’   r*   r   ÚHTTPCookieProcessorr{   rÄ   r   rŠ   r  rH  r“   r   Úorigin_req_hostrU   Úunverifiabler  r•   r–   )r   Úcjr;   rZ   r  r]  r  r$   r$   r%   Útest_cookiesw  s    
zHandlerTests.test_cookiesc          
   C   s€  d}d}t j ¡ }tƒ  }|_xndD ]d}x\dD ]R}t|d| ƒ}t||ƒ}tj|_	| 
dd¡ |d k	r‚| 
dtt|ƒƒ¡ | d	d
¡ y||tƒ |dtd|iƒƒ W n. t jjk
rÚ   |  |d¡ |  |¡ Y nX |  |j ¡ |¡ y|  |j ¡ d¡ W n$ tk
r(   |  |jj¡ Y nX dd„ |jjD ƒ}	|  d|	¡ |  d|	¡ |  |jjd d¡ |  d	|jj¡ |  d	|jj¡ q4W q&W t|ƒ}tj|_	|fdd„}
t|dd}d}tj|_	y x|
||dƒ |d }qÈW W n, t jjk
r   |  |t jjj¡ Y nX t|dd}d}tj|_	y$x|
||d| ƒ |d }q.W W n, t jjk
rz   |  |t jjj¡ Y nX d S )Nzhttp://example.com/a.htmlzhttp://example.com/b.html)i-  i.  i/  i3  )Nz
blah
blah
zhttp_error_%sZNonsensezviking=withholdzContent-LengthrR  ri   ÚBlahÚlocationi3  rO  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 )Ni.  r—  r˜  )r  r„   r‡   )r;   rZ   rL   r$   r$   r%   rÿ   ´  s    z,HandlerTests.test_redirect.<locals>.redirectzexample.com)r“  r   zhttp://example.com/rÁ   zhttp://example.com/%d)r*   r   ÚHTTPRedirectHandlerr{   rÄ   Úgetattrr   r‚   rƒ   r}   rS   rD   r»   rY   r„   r‡   r   Ú	HTTPErrorr   ÚassertIsNotNonerZ   rå   Ú
get_methodÚAttributeErrorrU   r|   rK   rZ  r[  Úmax_repeatsÚmax_redirections)r   Úfrom_urlZto_urlr;   r  rŽ   r|   r°   rZ   rK   rÿ   r…   r$   r$   r%   Útest_redirectˆ  sj    

zHandlerTests.test_redirectc             C   sÎ   d}dddg}dddg}d}t j ¡ }tƒ  }|_t|ƒ}tj|_x>|D ]6}|d	 | }	|  	t j
j|j|tƒ d
dtd|	iƒ¡ qHW xF|D ]>}|d	 | }
| |tƒ d
dtd|
iƒ¡ |  |j ¡ |
¡ qˆW d S )Nzhttp://example.com/a.htmlrÂ   Úhttpsr:  ÚfileÚimapZldapzexample.com/b.htmlz://i.  zSecurity Loopholer˜  zThat's fine)r*   r   r  r{   rÄ   r   r‚   rƒ   r}   r(   r   rŸ  r  r„   r‡   r   rZ   rå   )r   r¥  Zvalid_schemesZinvalid_schemesZschemeless_urlr;   r  rZ   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 )Nzhttp://example.com/a.htmlz/b.htmli.  zThat's finer˜  )r*   r   r  r{   rÄ   r   r‚   rƒ   r}   r   Úurljoinr  r„   r‡   r   rZ   rå   )r   r¥  Zrelative_urlr;   r  rZ   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=eggsi.  z%Location: http://www.cracker.com/

ÚCookie)Úhttp.cookiejarr®  Ztest.test_http_cookiejarr¯  rÛ   r*   r   ÚHTTPDefaultErrorHandlerr  r’  rÚ   r~   rU   rZ   rQ   )	r   r®  r¯  r•  ÚhhÚhdehÚhrhÚ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

i.  z
Location: zhttp://www.example.com)
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                sn   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                s2   ˆ  |tˆƒ¡ ˆ j| ||f|ž|Ž d| j_d S )Ns   HTTP/1.1 200 OK

Hello!)r   Únextr   r½   Zfakedata)Úconnr°   rL   ÚposÚkw)Ú
real_classr   rJ  r$   r%   r     s    z3HandlerTests.test_redirect_no_path.<locals>.requestzhttp://python.org/pathzhttp://python.org/path?query)rÂ   râ   rº  r   Úfakehttprf  r¼   Úiterr   r*   r+   r   r‘   )r   Ú	response1r   rŸ   r$   )r¿  r   rJ  r%   Útest_redirect_no_path  s    
z"HandlerTests.test_redirect_no_pathc       
   
   C   s    G dd„ dt jjƒ}|ƒ }t j |¡}d}xp|D ]h\}}|  t|ƒ¡L t d| d ¡|_| 	d¡}d| d }|j
}	|  |	 |¡t|	ƒ¡ W d Q R X q0W 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   rZ   Úresultr$   r$   r%   ræ   !  s
    
z>HandlerTests.test_redirect_encoding.<locals>.Handler.http_openN)rG   r   rH   ræ   r$   r$   r$   r%   ÚHandler   s   rÈ  ))s   /pÃ¥-dansk/s   /p%C3%A5-dansk/)s   /spaced%20path/s   /spaced%20path/)s   /spaced path/s   /spaced%20path/)s   /?pÃ¥-dansks   /?p%C3%A5-dansks!   HTTP/1.1 302 Redirect
Location: s   

zhttp://example.com/s   GET ó    )r*   r   ÚHTTPHandlerÚbuild_openerÚsubTestÚreprr   rÀ  rÄ  r~   rÆ  rP   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ˆ   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 )
Nzproxy.example.com:3128)rÂ   )ræ   zreturn responsez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œ  O  s    z+HandlerTests.test_proxy.<locals>.<listcomp>)r   r*   r   ÚProxyHandlerÚdictrÔ   rÙ   r   r   r¨   r~   rÅ   )r   r  ÚphrÖ   r×   rZ   r$   r$   r%   Ú
test_proxy@  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_proxyzproxy.example.com)rÂ   zhttp://www.perl.org/zwww.perl.orgzhttp://www.python.orgzwww.python.org)r   Úenvironr   r*   r   rÐ  rÑ  rÔ   r   r   r¨   r~   )r   r  rÒ  rZ   r$   r$   r%   Útest_proxy_no_proxyQ  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Ô  zproxy.example.com)rÂ   zhttp://www.python.orgzwww.python.org)r   rÕ  r   r*   r   rÐ  rÑ  rÔ   r   r   r¨   r~   )r   r  rÒ  rZ   r$   r$   r%   Útest_proxy_no_proxy_all`  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 )
Nzproxy.example.com:3128)r§  )rì   zreturn responsezhttps://www.example.com/zwww.example.comr   rì   c             S   s   g | ]}|d d… ‘qS )r   rº   r$   )rš  rÏ  r$   r$   r%   rœ  y  s    z1HandlerTests.test_proxy_https.<locals>.<listcomp>)r   r*   r   rÐ  rÑ  rÔ   rÙ   r   r   r¨   r~   rÅ   )r   r  rÒ  rÖ   r×   rZ   r$   r$   r%   Útest_proxy_httpsk  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 )Nzproxy.example.com:3128)r§  zhttps://www.example.com/zProxy-AuthorizationÚFooBarz
User-AgentÚGrailzwww.example.com)zProxy-AuthorizationrÚ  )z
User-AgentrÛ  zProxy-authorization)r   r*   r   rÐ  rÑ  rÔ   rç   r   rS   r   r¨   rV   rª   r~   rZ  rê   r¤   rC   r   rW   )r   r  rÒ  Úhttps_handlerrZ   r$   r$   r%   Ú$test_proxy_https_proxy_authorization{  s$    




z1HandlerTests.test_proxy_https_proxy_authorizationÚdarwinzonly relevant for OSXc             C   sz   ddddddgdœ}x"dD ]}|   t||ƒd	| ¡ qW x"d
D ]}|  t||ƒd| ¡ q>W dg dœ}|   td|ƒ¡ d S )NFzfoo.barz	*.bar.comz	127.0.0.1z10.10z10.0/16)Úexclude_simpleÚ
exceptions)zfoo.barzwww.bar.comz	127.0.0.1z	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Útest)rP   r	   rU   )r   Zbypassr¨   r$   r$   r%   Útest_osx_proxy_bypass’  s    



z"HandlerTests.test_osx_proxy_bypassú"c          
   C   s`   t ƒ }tƒ }tj |¡}d}tdd|||f ƒ}| |¡ | |¡ |  ||d|||dd¡ d S )NzACME Widget Storei‘  z(WWW-Authenticate: Basic realm=%s%s%s

rï   z!http://acme.example.com/protected)r   rð   r*   r   r   rÛ   rÔ   Ú_test_basic_auth)r   Ú
quote_charrÕ   Úpassword_managerÚauth_handlerrñ   Úhttp_handlerr$   r$   r%   Útest_basic_auth¨  s    


zHandlerTests.test_basic_authc             C   s   | j dd d S )Nú')rå  )ré  )r   r$   r$   r%   Ú(test_basic_auth_with_single_quoted_realm¸  s    z5HandlerTests.test_basic_auth_with_single_quoted_realmc             C   sp   t ƒ }tƒ }tj |¡}d}tdd| ƒ}| |¡ | |¡ |  t¡ |  	||d|||dd¡ W d Q R X d S )NzACME Widget Storei‘  z$WWW-Authenticate: Basic realm=%s

rï   z!http://acme.example.com/protected)
r   rð   r*   r   r   rÛ   rÔ   ÚassertWarnsÚUserWarningrä  )r   rÕ   ræ  rç  rñ   rè  r$   r$   r%   Ú#test_basic_auth_with_unquoted_realm»  s    


z0HandlerTests.test_basic_auth_with_unquoted_realmc          
   C   sv   t ƒ }tj tdd¡}| |¡ tƒ }tj |¡}d}tdd| ƒ}| |¡ | |¡ |  	||d|||dd¡ d S )Nzproxy.example.com:3128)rÂ   zACME Networksi—  z(Proxy-Authenticate: Basic realm="%s"

zProxy-authorizationz&http://acme.example.com:3128/protected)
r   r*   r   rÐ  rÑ  rÔ   rð   Ú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 )N)r   r   Úrecorded)r   r$   r$   r%   r   æ  s    
zZHandlerTests.test_basic_and_digest_auth_handlers.<locals>.RecordingOpenerDirector.__init__c             S   s   | j  |¡ d S )N)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| f|ž|Ž d S )NÚdigest)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| f|ž|Ž d S )NÚbasic)rÄ   rò  r*   r   r   rö  )r   r€   rÌ   r$   r$   r%   rö  ô  s    z]HandlerTests.test_basic_and_digest_auth_handlers.<locals>.TestBasicAuthHandler.http_error_401N)rG   r   rH   rö  r$   r$   r$   r%   ÚTestBasicAuthHandleró  s   rù  zACME Networksi‘  z&WWW-Authenticate: Basic realm="%s"

rï   z!http://acme.example.com/protectedrô  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 )Ni‘  zWWW-Authenticate: Kerberos

zhttp://www.example.com)	r   r*   r   rõ  rÛ   rÔ   r(   r)   r~   )r   rÕ   Zdigest_auth_handlerrè  r$   r$   r%   Ú$test_unsupported_auth_digest_handler  s    

z1HandlerTests.test_unsupported_auth_digest_handlerc             C   sD   t ƒ }tj d ¡}tddƒ}| |¡ | |¡ |  t|jd¡ d S )Ni‘  zWWW-Authenticate: NTLM

zhttp://www.example.com)	r   r*   r   r   rÛ   rÔ   r(   r)   r~   )r   rÕ   Zbasic_auth_handlerrè  r$   r$   r%   Ú#test_unsupported_auth_basic_handler  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   )ÚwileÚcoyoterº   z%s:%sÚasciizBasic rÁ   )Úbase64rl   r   rñ   rL   rò   r]   r~   rô   rõ   r»   rÞ   rU   rQ   ÚbytesÚencodebytesr¸  ÚdecoderW   r[  rÜ   )r   rÕ   rç  Úauth_headerrñ   rè  ræ  Úrequest_urlZprotected_urlr   rò   r]   ZuserpassZauth_hdr_valuer$   r$   r%   rä  "  s0    

zHandlerTests._test_basic_authc       	      C   s~   d\}}d}t dƒ}tƒ }t|ƒ}|jd |||dd | |¡}|  |¡ tƒ }| |¡ | |¡ | |¡ |  |j	¡ d S )N)rý  rþ  z!http://acme.example.com/protectedrž   T)Úis_authenticated)
rí   r   r   rl   r  rP   r   rÔ   r~   rî   )	r   rò   r]   r  rè  Úpwd_managerÚauth_prior_handlerÚis_authrÕ   r$   r$   r%   Útest_basic_prior_auth_auto_sendG  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 )N)rý  rþ  z!http://acme.example.com/protectedZACMEi‘  z&WWW-Authenticate: Basic realm="%s"

rž   )r   r   rl   r  rU   r   rÔ   rÛ   r~   rP   rí   rî   )
r   rò   r]   r  rñ   r  r  r	  rÕ   rè  r$   r$   r%   Ú.test_basic_prior_auth_send_after_first_successa  s.    









z;HandlerTests.test_basic_prior_auth_send_after_first_successc          
   C   s€   xzdD ]r\}}d  |¡}t | ¡ | ¡}tj ¡ }tdƒ}d|_| 	||¡}| 
¡  W dQ R X |  |jjd  |¡¡ qW dS )z=Test the connection is cleaned up when the response is closed))zConnection: closes   data)zTransfer-Encoding: chunkeds   4
data
0

)zContent-Length: 4s   datazHTTP/1.1 200 OK
{}

zhttp://dummy/NzConnection not closed with {!r})Úformatr   rÀ  r  r*   r   ré   r   r}   rë   r1   rP   ÚfakesockÚclosed)r   Ztransferr|   Úheaderr¼  r  rZ   Úrespr$   r$   r%   Útest_http_closed‰  s    


zHandlerTests.test_http_closedc          	   C   s\   t  d¡}tj ¡ }tdƒ}d|_|  tj	j
¡ | ||¡ W dQ R X |  |jjd¡ dS )z;Test the connection is cleaned up after an invalid responserU  zhttp://dummy/NzConnection not closed)r   rÀ  r*   r   ré   r   r}   r(   rÂ   râ   ÚBadStatusLinerë   rP   r  r  )r   r¼  r  rZ   r$   r$   r%   Útest_invalid_closedš  s    

z HandlerTests.test_invalid_closedN)rã  )0rG   r   rH   r7  rN  r^  rk  rm  rw  rz  r{  r€  r‚  r„  r‰  rŠ  r‹  r‘  r–  r¦  r«  r­  r·  r¹  rÃ  rÎ  rÓ  rÖ  rØ  rÙ  rÝ  r  Ú
skipUnlessrp  Úplatformrâ  ré  rë  rî  rð  rú  rû  rü  rä  r
  r  r  r  r$   r$   r$   r%   r   ¼  sR   @\BJ	#
2

%(r   c               @   sN   e Zd Zdd„ Zdd„ Ze e d¡d¡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 )N)r½   )rš  r;   )Úhandler_classr$   r%   ú	<genexpr>¨  s   z/MiscTests.opener_has_handler.<locals>.<genexpr>)rP   Ú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>.MyHTTPHandlerN)rG   r   rH   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 )Nr$   )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 )Nr$   )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>.MyOtherHTTPHandlerN)rG   r   rH   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_openerÚnetworkztest requires network accessc          	   C   s¢   t  d¡Ž tj ¡ }tj d¡}|  d |j¡ | |d 	d¡¡ |  d|j¡ |  d| 
d¡¡ | |d 	d¡¡ |  d|j¡ |  d| 
d¡¡ W d Q R X d S )	Nzhttp://www.example.com/rj   zus-asciió   1zContent-lengthÚ
1234567890s
   1234567890rr   )r   Útransient_internetr*   r   rË  r   r   r|   r~   r  rW   )r   rÕ   r   r$   r$   r%   Útest_issue16464×  s    
zMiscTests.test_issue16464c             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   rK   zHTTP Error %s: %sz<HTTPError %s: %r>)r*   r   rŸ  rP   rÐ   r   rA   rK   rŽ   r   rD   rÍ  )r   r   rL   rŽ   rŸ   r\  rE   Zexpected_errmsgr$   r$   r%   Útest_HTTPError_interfaceç  s    z"MiscTests.test_HTTPError_interfacec             C   sR   ddddddddddd	d
g}x |D ]\}}|   t|ƒ|¡ q"W |  ttd¡f d S )N)zproxy.example.com)NNNzproxy.example.com)zproxy.example.com:3128)NNNzproxy.example.com:3128)zjoe:password@proxy.example.com)Nr\   r]   zproxy.example.com)z#joe:password@proxy.example.com:3128)Nr\   r]   zproxy.example.com:3128)zhttp://proxy.example.com/)rÂ   NNzproxy.example.com)zhttp://proxy.example.com:3128/)rÂ   NNzproxy.example.com:3128)z&http://joe:password@proxy.example.com/)rÂ   r\   r]   zproxy.example.com)z*http://joe:password@proxy.example.com:3128)rÂ   r\   r]   zproxy.example.com:3128)z1ftp://joe:password@proxy.example.com/rubbish:3128)r:  r\   r]   zproxy.example.com)z%http://joe:password@proxy.example.com)rÂ   r\   r]   zproxy.example.comz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   s<   t ƒ }|  t¡}| d¡ W d Q R X |  t|jƒd¡ d S )NÚinvalidz5Unsupported digest authentication algorithm 'invalid')r
   r(   r)   Úget_algorithm_implsr   rD   Ú	exception)r   r  Úexcr$   r$   r%   Útest_unsupported_algorithm  s    z$MiscTests.test_unsupported_algorithmN)rG   r   rH   r  r"  r  r  r   Úis_resource_enabledr'  r(  r)  r.  r$   r$   r$   r%   r  ¥  s   ,%r  c               @   sŒ   e Zd ZG dd„ deƒZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS ) ÚRequestTestsc               @   s   e Zd ZdZdS )zRequestTests.PutRequestÚPUTN)rG   r   rH   r°   r$   r$   r$   r%   Ú
PutRequest)  s   r2  c             C   sL   t dƒ| _t ddddid| _t ddd| _|  d¡| _| jddd| _d S )	Nzhttp://www.python.org/~jeremy/r|   zX-Testrá  )rK   ÚHEAD)r°   rP  )r   r4  ÚpostÚheadr2  ÚputÚ
force_post)r   r$   r$   r%   ÚsetUp,  s    
zRequestTests.setUpc             C   s^   |   d| j ¡ ¡ |   d| j ¡ ¡ |   d| j ¡ ¡ |   d| j ¡ ¡ |   d| j ¡ ¡ d S )NrP  rO  r3  r1  )r   r4  r¡  r4  r5  r6  r7  )r   r$   r$   r%   Útest_method6  s
    zRequestTests.test_methodc             C   sL   |   | jj¡ |  d| j ¡ ¡ d| j_|  | jj¡ |  d| j ¡ ¡ d S )NrO  ri   rP  )rU   r4  r|   r   r¡  rP   )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 )NzContent-lengthé*   ri   )rZ  r4  r[  rY   r   r|   )r   r$   r$   r%   Ú.test_setting_data_should_remove_content_lengthG  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 )NzContent-lengthrd   r|  )rZ  r4  r[  r|   rY   r   )r   r$   r$   r%   Ú/test_deleting_data_should_remove_content_lengthO  s    z<RequestTests.test_deleting_data_should_remove_content_lengthc             C   s   |   d| j ¡ ¡ d S )Nzhttp://www.python.org/~jeremy/)r   r4  rå   )r   r$   r$   r%   Útest_get_full_urlW  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   r4  r±   r   )r   rZ   r$   r$   r%   Útest_selector[  s    zRequestTests.test_selectorc             C   s   |   d| jj¡ d S )NrÂ   )r   r4  rI  )r   r$   r$   r%   Útest_get_type`  s    zRequestTests.test_get_typec             C   s   |   d| jj¡ d S )Nzwww.python.org)r   r4  r¨   )r   r$   r$   r%   Útest_get_hostc  s    zRequestTests.test_get_hostc             C   s   t dƒ}|  d|j¡ d S )Nzhttp://www.%70ython.org/zwww.python.org)r   r   r¨   )r   rZ   r$   r$   r%   Útest_get_host_unquotef  s    z"RequestTests.test_get_host_unquotec             C   sR   |   | j ¡ ¡ | j dd¡ |  | j ¡ ¡ |  d| jj¡ |  d| jj¡ d S )Nzwww.perl.orgrÂ   zwww.python.org)rU   r4  Ú	has_proxyrƒ  rP   r   r“  r¨   )r   r$   r$   r%   rÓ  j  s
    zRequestTests.test_proxyc             C   s   t dƒ}|  d|j¡ d S )Nz<URL:http://www.python.org>zwww.python.org)r   r   r¨   )r   rZ   r$   r$   r%   Útest_wrapped_urlq  s    zRequestTests.test_wrapped_urlc             C   sL   t dƒ}|  d|j¡ t dƒ}|  d|j¡ d}t |ƒ}|  | ¡ |¡ d S )Nz-http://www.python.org/?qs=query#fragment=truez
/?qs=queryzhttp://www.python.org/#fun=truer'   z.http://docs.python.org/library/urllib2.html#OK)r   r   r±   rå   )r   rZ   rL   r$   r$   r%   Útest_url_fragmentu  s    zRequestTests.test_url_fragmentc             C   s6   dddg}x&|D ]}t |ƒ}|  | ¡ |j¡ qW d S )Nzhttp://docs.python.orgz.http://docs.python.org/library/urllib2.html#OKz-http://www.python.org/?qs=query#fragment=true)r   r   rå   r…  )r   rJ  rL   rZ   r$   r$   r%   Útest_url_fullurl_get_full_url€  s    
z*RequestTests.test_url_fullurl_get_full_urlN)rG   r   rH   r   r2  r8  r9  r:  r<  r=  r>  r?  r@  rA  rB  rÓ  rD  rE  rF  r$   r$   r$   r%   r0  (  s   

r0  Ú__main__)8r  rá  r   r   r   r‹   r‚   r  rp  rd  rr  Úurllib.requestr*   r   r   r   r   r   r	   r
   Úurllib.parser   r   Úhttp.clientrÂ   Ú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  r0  rG   Úmainr$   r$   r$   r%   Ú<module>   s`   $3 ,

-6"        p a
