B
    u9aÝ, ã               @   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ÚerrorZrobotparserzfrom urllib.%s import *Ú__builtins__r   ÚntZ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.7/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   Z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"calZ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   Z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ÚassertInr<   Ústr)r   Úerrr"   r"   r#   Útest_URLError_reasonstrL   s    z$TrivialTests.test_URLError_reasonstrN)Ú__name__r   Ú__qualname__r$   r2   r;   rA   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   rF   )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-eggsrE   )rF   )z	Spam-eggsrE   zFoo-BarÚbaz)zFoo-barrI   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   rG   Ú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Ú3r5   zd.example.comÚ4Údze.example.com:3128Ú5Úezexample.com)rU   rV   zhttp://example.comzhttp://example.com/spamzhttp://example.com/spam/spamzhttp://example.com/fooÚfoozhttp://example.com/barÚbarÚnini)r]   rW   )r^   r_   r4   ÚfirstrE   ÚsecondÚspam)ra   rb   r3   Ú1)rc   r3   zhttp://a.example.com/)NNzc.example.comzc.example.com:3128)rX   r5   )rY   rZ   )r[   r\   )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.
        r1   zhttp://g.example.com:80Ú10Újr6   zhttp://h.example.comÚ11r    r7   zi.example.com:80Ú12ÚlÚizj.example.comÚ13Úmzg.example.com:100)NNzg.example.com:80)rk   rl   zg.example.comzhttp://g.example.com:100zhttp://g.example.comzh.example.com)rm   r    zh.example.com:80zhttp://h.example.com:80zi.example.com)rn   ro   zhttp://i.example.com:80)rq   rr   zj.example.com:80zhttp://j.example.comzhttp://j.example.com:80N)r(   r   rd   re   rf   r   )r   rg   rh   ri   r"   r"   r#   Ú"test_password_manager_default_portÒ   sD    
z3RequestHdrsTests.test_password_manager_default_portN)rB   r   rC   rH   rT   rj   rs   r"   r"   r"   r#   rD   Q   s   $FrD   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)rS   ÚdataÚtimeout)r   rS   ru   rv   r"   r"   r#   Úopenÿ   s    zMockOpener.openc             G   s   || | _ | _d S )N)ÚprotoÚargs)r   rx   ry   r"   r"   r#   r     s    zMockOpener.error)rB   r   rC   Ú
addheadersÚsocketÚ_GLOBAL_DEFAULT_TIMEOUTrw   r   r"   r"   r"   r#   rt   ü   s   rt   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#   r/     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#   r0     s    zMockFile.close)N)N)rB   r   rC   r/   r   r0   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)rB   r   rC   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ÚmsgrF   rG   )r   r‡   rˆ   rF   ru   rG   r"   r"   r#   r†     s    zMockResponse.__init__c             C   s   | j S )N)rF   )r   r"   r"   r#   Úinfo  s    zMockResponse.infoc             C   s   | j S )N)rG   )r   r"   r"   r#   Úgeturl  s    zMockResponse.geturl)N)rB   r   rC   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)rB   r   rC   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   ry   r"   r"   r#   Ú__call__0  s    zFakeMethod.__call__N)rB   r   rC   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ˆ   Ústatusr<   r‡   )r   r˜   rˆ   r™   r<   r"   r"   r#   r†   5  s
    zMockHTTPResponse.__init__c             C   s   dS )NÚ r"   )r   r"   r"   r#   r/   <  s    zMockHTTPResponse.readc             C   s   i S )Nr"   )r   r"   r"   r#   r‰   ?  s    zMockHTTPResponse.infoc             C   s   | j S )N)rG   )r   r"   r"   r#   rŠ   B  s    zMockHTTPResponse.geturlN)rB   r   rC   r†   r/   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_headersru   Úraise_on_endheadersZsockÚ_tunnel_headers)r   r"   r"   r#   r†   G  s    zMockHTTPClass.__init__c             C   s   || _ || _| S )N)Úhostrv   )r   r    rv   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_hostZ_tunnel_portrŸ   Úclear)r   r    ÚportrF   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   Úsortru   r¦   rž   ÚOSError)r   r§   rG   ZbodyrF   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#   r0   o  s    zMockHTTPClass.close)NN)NN)rB   r   rC   r†   r{   r|   r•   r¡   r¥   r   r¬   r0   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”   Z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 )Nzreturn selfzreturn responser—   r«   rš   zreturn requestzhttp://blah/r   ú é   Úhttpr   ÚraiserE   )ÚparentÚcallsÚappendrƒ   r   Ú
startswithÚrfindÚintr'   r   r(   r=   )r   Zfn_namer”   ry   ÚkwdsZresr‡   r"   r"   r#   r“   „  s*    
zMockHandler.handlec             C   s   d S )Nr"   )r   r"   r"   r#   r0   ›  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)
rB   r   rC   rÁ   r†   r®   r“   r0   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)rB   r   rC   r"   r"   r"   r#   ÚMockHandlerSubclass¿  s   rÅ   r¶   )r­   rÁ   rÀ   r»   Úadd_handler)ÚopenerÚ	meth_specÚhandlersr~   ÚmethsrÅ   r7   r"   r"   r#   Úadd_ordered_mock_handlers©  s    


rË   c              G   s"   t ƒ }x| D ]}| |¡ qW |S )N)r   rÆ   )Zhandler_instancesrÇ   r7   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‡   rF   Úreset)r   r‡   rF   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»   ZdeepcopyrÏ   r·   ÚclientÚ	responsesr‡   Zmessage_from_stringrF   r¹   r   r}   rS   rƒ   Úget_full_url)r   rS   rÑ   rÒ   r   rˆ   r"   r"   r#   Ú	http_openß  s    

zMockHTTPHandler.http_openN)rB   r   rC   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   rS   r"   r"   r#   Ú
https_openö  s    zMockHTTPSHandler.https_openN)r   )rB   r   rC   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š   )	rL   rÞ   r·   rÓ   rÔ   r‡   rƒ   r}   rÕ   )r   rS   r   r"   r"   r#   rÖ     s    
z"MockHTTPHandlerCheckAuth.http_openN)rB   r   rC   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)ÚrealmrG   ÚuserrV   )r   rá   Zurirâ   rV   r"   r"   r#   re     s    z MockPasswordManager.add_passwordc             C   s   || _ || _| j| jfS )N)Útarget_realmÚ
target_urlrâ   rV   )r   rá   Zauthurir"   r"   r#   rf     s    z&MockPasswordManager.find_user_passwordN)rB   r   rC   re   rf   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)rB   r   rC   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   )r=   )rÛ   zreturn self)Z
proxy_openzreturn self)Zredirect_requestzreturn self)ZdoÚproxyÚredirectz://example.com/)
Úurllib.errorr=   r   rË   rÆ   r(   r   ZUnknownHandlerr&   rw   )r   r=   Ú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   rw   r   Úziprº   )r   rí   rÈ   rÉ   rS   Úrrº   ÚexpectedÚgotÚhandlerr   ry   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)rB   r   rC   r"   r"   r"   r#   rÅ   V  s   rÅ   zhttp://example.com/r¶   )r   r­   rÁ   r»   rÆ   rw   r   rº   )r   rí   rÉ   rÊ   rÁ   rÅ   r7   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   r=   rw   r   rº   )r   rí   rÈ   rÉ   rS   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
ƒ}| |¡ |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 responseZhttp_error_303Z
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)rB   r   rC   rú   r"   r"   r"   r#   ÚUnknown}  s   rû   zhttp://example.com/r   r°   i.  rš   )r   rË   r   rw   rò   rº   r   )r   rí   rÈ   rÉ   rû   rS   rº   rô   rõ   rö   Zmethod_namery   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   rw   Ú	enumeraterº   r   r±   ZassertIsInstancerƒ   )r   rí   rÈ   rÉ   rS   rº   rp   rö   r   ry   r¿   r"   r"   r#   Útest_processorsŒ  s(    

z#OpenerDirectorTests.test_processorsN)
rB   r   rC   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ÚunittestZ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)ru   )r   ru   r"   r"   r#   r†   À  s    z6HandlerTests.test_ftp.<locals>.MockFTPWrapper.__init__c             S   s$   || | _ | _t | j¡t| jƒfS )N)ÚfilenameÚfiletyper„   r…   ru   r±   )r   r  r  r"   r"   r#   ÚretrfileÃ  s    z6HandlerTests.test_ftp.<locals>.MockFTPWrapper.retrfilec             S   s   d S )Nr"   )r   r"   r"   r#   r0   Ç  s    z3HandlerTests.test_ftp.<locals>.MockFTPWrapper.closeN)rB   r   rC   r†   r	  r0   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)ru   )r   ru   r"   r"   r#   r†   Ë  s    z6HandlerTests.test_ftp.<locals>.NullFTPHandler.__init__c                s4   || | _ | _|| | _| _|| _ˆ | jƒ| _| jS )N)râ   Úpasswdr    r¤   Údirsru   Ú
ftpwrapper)r   râ   r  r    r¤   r  rv   )r
  r"   r#   Úconnect_ftpÎ  s
    z9HandlerTests.test_ftp.<locals>.NullFTPHandler.connect_ftpN)rB   r   rC   r†   r{   r|   r  r"   )r
  r"   r#   ÚNullFTPHandlerÊ  s   r  r   zrheum rhaponicumz ftp://localhost/foo/bar/baz.htmlÚ	localhostrš   ÚIr]   r^   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.gifzContent-typezContent-length)r(   r   Z
FTPHandlerÚftplibrt   r¹   ZFTP_PORTr   rv   rð   r   râ   r  r    r{   Úgethostbynamer¤   r  r  r  r  r‰   Úgetr¾   r±   )r   r  r  ru   r7   rG   r    r¤   râ   r  Ztype_r  r  ZmimetyperS   ró   rF   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)ZusegmtzContent-typez
text/plainzContent-lengthrq   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   ZFileHandlerrt   r¹   r   ÚTESTFNr  r   r*   r+   r{   r  ZgethostnameZgaierrorr»   rw   Úwriter0   Z	file_openr   r/   r‰   rŠ   ÚstatZutilsZ
formatdateÚst_mtimeÚremover   Úgetcwdr&   r   r=   rO   ÚassertIsrS   Útype)r   rÑ   r7   rí   r  r  ZtowriteÚurlsZ	localaddrrG   r1   ró   ru   rF   ZrespurlZstatsZmodifiedr  rS   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ÚFoor^   ÚSpamÚeggsr—   r«   zexample.comr   r%   )Z
Connectionr0   )r'  r^   )r(  r)  TZbadpost)ó    Nrš   zContent-lengthzContent-typeÚ0z!application/x-www-form-urlencodedÚHostr]   rI   )#r(   r   rÙ   rt   r¹   r   rv   rR   r›   rÛ   r/   r   r‰   rŠ   r‡   rˆ   r  Ú__contains__r   r    rœ   r§   r¨   r   ru   rž   r&   r   r=   rè   Údo_request_rz   rƒ   ÚassertNotInÚunredirected_hdrs)r   r7   rí   rG   r§   ru   rS   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Ù   rt   r¹   ÚtempfileZNamedTemporaryFiler   r0   Ú
addCleanupr   Úunlinkrw   r   r.  rQ   r   rO   rL   r¾   )	r   r7   rí   Úfile_objZ	file_pathr1   rS   r2  Ú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-encodingr7  zContent-lengthzContent-Lengthr8  )r(   r   rÙ   rt   r¹   r„   ÚBytesIOr   r.  r   rQ   rO   rL   r¾   r0   )r   r7   rí   r<  rS   r2  rF   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-Lengthr8  )Ústdoutzhttp://example.com/zContent-lengthzTransfer-encodingr7  )r(   r   rÙ   rt   r¹   ÚsysÚ
executableÚ
subprocessÚPopenÚPIPEr   rB  r.  r   rQ   r¾   )r   r7   rí   ÚcmdrF   ÚprocrS   r2  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-encodingr7  )
r(   r   rÙ   rt   r¹   r   r.  r   rQ   r¾   )r   r7   rí   rK  rF   rS   r2  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-encodingr7  zContent-length)r(   r   rÙ   rt   r¹   r.  r   r   rQ   rO   rL   )r   r7   rS   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Ù   rt   r¹   Úarrayr   r.  r   r¾   rQ   )r   r7   rí   Ziterable_arrayrF   rS   r2  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Æ   rw   r   Z_debuglevel)r   rí   r7   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 )	Nr*  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.htmlr,  zexample.comzsomeproxy:3128)
r(   r   rÙ   rt   r¹   r   r.  r   r0  Ú	set_proxy)r   r7   ru   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Õ   ÚfragmentZquery)r   r#  ró   rG   Z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   rW  rP   rX  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Ù   rt   r¹   r   r.  r   r    r¨   )r   r7   Z	weird_urlrS   r2  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š   rx   éÊ   ZAcceptedéÎ   zPartial contentiö  zBad gatewayr·   )r(   r   ZHTTPErrorProcessorrt   r¹   r   rƒ   rþ   r!  rO   rÂ   rP   r   rx   ry   )r   r7   rí   rG   rS   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   ÚHTTPCookieProcessorrt   r¹   r   rƒ   rý   r!  rŒ   r   Úorigin_req_hostrO   Zunverifiablerþ   rŽ   r   )r   Úcjr7   rS   ró   r2  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-Lengthr(  rb   ÚBlahÚlocationi3  r%  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.  rd  re  )rñ   r}   r€   )r7   rS   rG   r"   r"   r#   rë   ´  s    z,HandlerTests.test_redirect.<locals>.redirectzexample.com)ra  r   zhttp://example.com/r¶   zhttp://example.com/%d)r(   r   ÚHTTPRedirectHandlerrt   r¹   Úgetattrr   r{   r|   rv   rM   r?   r±   rR   r}   r€   r   Ú	HTTPErrorr   ÚassertIsNotNonerS   rÕ   Ú
get_methodÚAttributeErrorrO   ru   rF   r/  r0  Zmax_repeatsZmax_redirections)r   Úfrom_urlZto_urlr7   rí   r‡   ru   r§   rS   rF   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  ÚfileZimapZldapzexample.com/b.htmlz://i.  zSecurity Loopholere  zThat's fine)r(   r   rj  rt   r¹   r   r{   r|   rv   r&   r   rl  rñ   r}   r€   r   rS   rÕ   )r   rp  Zvalid_schemesZinvalid_schemesZschemeless_urlr7   rí   rS   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 finere  )r(   r   rj  rt   r¹   r   r{   r|   rv   r   Zurljoinrñ   r}   r€   r   rS   rÕ   )r   rp  Zrelative_urlr7   rí   rS   rt  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/

ZCookie)Zhttp.cookiejarrw  Ztest.test_http_cookiejarrx  rÍ   r(   r   ÚHTTPDefaultErrorHandlerrj  r`  rÌ   rw   rO   rS   rL   )	r   rw  rx  rb  Ú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

i.  z
Location: zhttp://www.example.com)
rÍ   r(   r   ry  rj  rÌ   rw   r   rŠ   Ústrip)r   Zredirected_urlrz  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§   rG   ÚposÚkw)Ú
real_classr   r#  r"   r#   r     s    z3HandlerTests.test_redirect_no_path.<locals>.requestzhttp://python.org/pathzhttp://python.org/path?query)r·   rÓ   r€  r   Úfakehttpr:  r²   Úiterr   r(   r)   r   rŠ   )r   Z	response1r   r˜   r"   )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}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   rS   Úresultr"   r"   r#   rÖ   !  s
    
z>HandlerTests.test_redirect_encoding.<locals>.Handler.http_openN)rB   r   rC   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_openerZsubTestÚreprr   r†  r‰  rw   r‹  rK   r¼   )
r   r  rö   rÇ   r8   re  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"   )rg  Útupr"   r"   r#   ri  O  s    z+HandlerTests.test_proxy.<locals>.<listcomp>)r   r(   r   ÚProxyHandlerÚdictrÆ   rË   r   r   r    rw   rº   )r   rí   ÚphrÈ   rÉ   rS   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    rw   )r   rí   r–  rS   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    rw   )r   rí   r–  rS   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)rr  )rÜ   zreturn responsezhttps://www.example.com/zwww.example.comr   rÜ   c             S   s   g | ]}|d d… ‘qS )r   r°   r"   )rg  r“  r"   r"   r#   ri  y  s    z1HandlerTests.test_proxy_https.<locals>.<listcomp>)r   r(   r   r”  r•  rÆ   rË   r   r   r    rw   rº   )r   rí   r–  rÈ   rÉ   rS   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)rr  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   rM   r   r    rP   r¢   rw   r/  rÚ   r   r>   rm  rQ   )r   rí   r–  Zhttps_handlerrS   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)Z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)rK   r	   rO   )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Æ   Z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à   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 )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)rB   r   rC   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   ry   r¿   r"   r"   r#   r¶  î  s    z^HandlerTests.test_basic_and_digest_auth_handlers.<locals>.TestDigestAuthHandler.http_error_401N)rB   r   rC   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   ry   r¿   r"   r"   r#   r¶  ô  s    z]HandlerTests.test_basic_and_digest_auth_handlers.<locals>.TestBasicAuthHandler.http_error_401N)rB   r   rC   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'   rw   )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'   rw   )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¶   )Úbase64re   r   rá   rG   râ   rV   rw   rã   rä   r±   rÐ   rO   rL   ÚbytesZencodebytesr~  ÚdecoderQ   r0  rÎ   )r   rÇ   r©  Zauth_headerrá   rª  r¨  Úrequest_urlZprotected_urlrÀ  râ   rV   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   re   rÄ  rK   r   rÆ   rw   rÞ   )	r   râ   rV   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   re   rÄ  rO   r   rÆ   rÍ   rw   rK   rÝ   rÞ   )
r   râ   rV   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   rv   rÛ   r/   rK   ÚfakesockÚclosed)r   Ztransferru   Úheaderr‚  rö   rS   Z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 responser*  zhttp://dummy/NzConnection not closed)r   r†  r(   r   rÙ   r   rv   r&   r·   rÓ   ZBadStatusLinerÛ   rK   rË  rÌ  )r   r‚  rö   rS   r"   r"   r#   Útest_invalid_closedš  s    

z HandlerTests.test_invalid_closedN)r¥  )0rB   r   rC   r  r$  r3  r>  r@  rJ  rM  rN  rS  rT  rV  rY  rZ  r[  r_  rc  rq  ru  rv  r}  r  rˆ  r’  r—  rš  rœ  r  r   r  Ú
skipUnlessrC  Ú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³   )rg  r7   )Úhandler_classr"   r#   ú	<genexpr>¨  s   z/MiscTests.opener_has_handler.<locals>.<genexpr>)rK   Ú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)rB   r   rC   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)rB   r   rC   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)rB   r   rC   rÚ  r"   r"   r"   r#   Ú
BarHandler³  s   rÛ  c               @   s   e Zd ZdS )z7MiscTests.test_build_opener.<locals>.MyOtherHTTPHandlerN)rB   r   rC   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_openerZ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/rc   zus-asciió   1zContent-lengthZ
1234567890s
   1234567890rk   )r   Ztransient_internetr(   r   r  r   r   ru   rw   r  rQ   )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: 42r<   rF   zHTTP Error %s: %sz<HTTPError %s: %r>)r(   r   rl  rK   rÂ   r   r<   rF   r‡   rˆ   r?   r‘  )r   rˆ   rG   r‡   r˜   r1  r@   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)NrU   rV   zproxy.example.com)z#joe:password@proxy.example.com:3128)NrU   rV   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·   rU   rV   zproxy.example.com)z*http://joe:password@proxy.example.com:3128)r·   rU   rV   zproxy.example.com:3128)z1ftp://joe:password@proxy.example.com/rubbish:3128)r  rU   rV   zproxy.example.com)z%http://joe:password@proxy.example.com)r·   rU   rV   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 )NZinvalidz5Unsupported digest authentication algorithm 'invalid')r
   r&   r'   Zget_algorithm_implsr   r?   Z	exception)r   rö   Úexcr"   r"   r#   Útest_unsupported_algorithm  s    z$MiscTests.test_unsupported_algorithmN)rB   r   rC   rÖ  rÞ  r  rÐ  r   Z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)rB   r   rC   r§   r"   r"   r"   r#   Ú
PutRequest)  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 )	Nzhttp://www.python.org/~jeremy/ru   zX-Testr£  )rF   ÚHEAD)r§   r&  )r   r  ÚpostÚheadrç  Ú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 )Nr&  r%  rè  ræ  )r   ré  rn  r  rê  rë  rì  )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 )Nr%  rb   r&  )rO   r  ru   r   rn  rK   )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é*   rb   )r/  r  r0  rR   r   ru   )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-lengthr]   rO  )r/  r  r0  ru   rR   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   r  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   r  r¨   r   )r   rS   r"   r"   r#   Útest_selector[  s    zRequestTests.test_selectorc             C   s   |   d| jj¡ d S )Nr·   )r   r  r"  )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   r  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   rS   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)rO   r  Z	has_proxyrU  rK   r   ra  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   rS   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   rS   rG   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Õ   rW  )r   r#  rG   rS   r"   r"   r#   Útest_url_fullurl_get_full_url€  s    
z*RequestTests.test_url_fullurl_get_full_urlN)rB   r   rC   r   rç  rí  rî  rï  rñ  rò  ró  rô  rõ  rö  r÷  r—  rø  rù  rú  r"   r"   r"   r#   rå  (  s   

rå  Ú__main__)8r  r£  r   r   r   r„   r{   rR  rC  r9  rE  Zurllib.requestr(   r   r   r   r   r   r	   r
   Zurllib.parser   rì   Zhttp.clientr·   ZTestCaser   rD   rt   r}   r•  r€   r…   rƒ   r‹   r‘   ÚIOBaser–   r›   r­   rË   rÌ   r   rÝ  rÍ   rÙ   r×   rÝ   rà   rå   r  r  rÒ  rå  rB   Úmainr"   r"   r"   r#   Ú<module>   s`   $3 ,

-6"        p a
