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

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

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

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

        Method r.remove_header should remove items both from r.headers and
        r.unredirected_hdrs dictionaries
        rJ   rK   rL   rM   )rK   rL   zFoo-BarÚbaz)zFoo-barrQ   z	Not-thereÚdefaultzUnredirected-spamZEggsN)r   Ú
assertTrueÚ
has_headerr   Zheader_itemsÚ
add_headerÚsortedÚassertFalseÚassertIsNoneÚ
get_headerZremove_headerÚadd_unredirected_header)r   rO   Úreqr%   r%   r&   Útest_request_headers_methodsj   s"    ÿ

z-RequestHdrsTests.test_request_headers_methodsc                 C   sÆ  t j ¡ }|j}|j}|ddddƒ |ddddƒ |dddd	ƒ |dd
ddƒ |ddddƒ |  |ddƒd¡ |  |ddƒd¡ |  |ddƒd¡ |  |ddƒd¡ |  |ddƒd¡ |  |ddƒd¡ |d	dddƒ |d	dddƒ |  |d	dƒd¡ |  |d	dƒd¡ |ddddƒ |dddd ƒ |  |ddƒd!¡ |d"dd#d"ƒ |  |d"dƒd$¡ |  |d"d%ƒd&¡ |  |dd'ƒd&¡ |  |dd(ƒd)¡ |  |ddƒd)¡ |  |dd
ƒd*¡ |  |ddƒd+¡ d S ),Nz
Some Realmúhttp://example.com/ÚjoeÚpasswordzhttp://example.com/niÚnizhttp://c.example.com:3128Ú3r:   zd.example.comÚ4Údze.example.com:3128Ú5Úeúexample.com)r^   r_   rJ   zhttp://example.com/spamzhttp://example.com/spam/spamzhttp://example.com/fooÚfoozhttp://example.com/barÚbarÚnini)rg   r`   )rh   ri   r9   ÚfirstrL   ÚsecondÚspam)rk   rl   r8   Ú1)rm   r8   zhttp://a.example.com/©NNzc.example.comzc.example.com:3128)ra   r:   )rb   rc   )rd   re   ©r+   r   ZHTTPPasswordMgrÚadd_passwordÚfind_user_passwordr   ©r   ZmgrÚaddZfind_user_passr%   r%   r&   Útest_password_managerŽ   s„    
ÿÿÿÿÿþÿþÿÿÿÿÿÿÿþÿÿz&RequestHdrsTests.test_password_managerc                 C   sr  t j ¡ }|j}|j}|ddddƒ |ddddƒ |d	d
ddƒ |ddddƒ |  |ddƒd¡ |  |ddƒd¡ |  |ddƒd¡ |  |ddƒd¡ |  |ddƒd¡ |  |ddƒd¡ |  |ddƒd¡ |  |ddƒd¡ |  |ddƒd¡ |  |d	dƒd¡ |  |d	d
ƒd¡ |  |d	dƒd¡ |  |ddƒd¡ |  |dd ƒd¡ |  |dd!ƒd¡ |  |dd"ƒd¡ d#S )$z±
        The point to note here is that we can't guess the default port if
        there's no scheme.  This applies to both add_password and
        find_user_password.
        r6   zhttp://g.example.com:80Ú10Újr;   zhttp://h.example.comÚ11r#   r<   zi.example.com:80Ú12ÚlÚizj.example.comÚ13Úmzg.example.com:100rn   zg.example.com:80)ru   rv   zg.example.comzhttp://g.example.com:100zhttp://g.example.comzh.example.com)rw   r#   zh.example.com:80zhttp://h.example.com:80zi.example.com)rx   ry   zhttp://i.example.com:80)r{   r|   zj.example.com:80zhttp://j.example.comzhttp://j.example.com:80Nro   rr   r%   r%   r&   Ú"test_password_manager_default_portÔ   sZ    
ÿÿÿÿÿÿÿÿÿÿÿz3RequestHdrsTests.test_password_manager_default_portN)rG   r   rH   rP   r\   rt   r}   r%   r%   r%   r&   rI   S   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)r[   ÚdataÚtimeout)r   r[   r€   r   r%   r%   r&   Úopen  s    zMockOpener.openc                 G   s   || | _ | _d S r   )ÚprotoÚargs)r   rƒ   r„   r%   r%   r&   r     s    zMockOpener.error)rG   r   rH   Ú
addheadersÚsocketÚ_GLOBAL_DEFAULT_TIMEOUTr‚   r   r%   r%   r%   r&   r~   þ   s   r~   c                   @   s(   e Zd Zddd„Zd	dd„Zdd„ ZdS )
ÚMockFileNc                 C   s   d S r   r%   ©r   Úcountr%   r%   r&   r5   	  s    zMockFile.readc                 C   s   d S r   r%   r‰   r%   r%   r&   Úreadline  s    zMockFile.readlinec                 C   s   d S r   r%   ©r   r%   r%   r&   Úclose  s    zMockFile.close)N)N)rG   r   rH   r5   r‹   r   r%   r%   r%   r&   rˆ     s   

rˆ   c                   @   s   e Zd Zdd„ ZdS )ÚMockHeadersc                 C   s   t |  ¡ ƒS r   )r?   Úvalues)r   r   r%   r%   r&   Ú
getheaders  s    zMockHeaders.getheadersN)rG   r   rH   r   r%   r%   r%   r&   rŽ     s   rŽ   c                   @   s&   e Zd Zddd„Zdd„ Zdd„ ZdS )	ÚMockResponseNc                 C   s.   t j | |¡ ||||f\| _| _| _| _d S r   )ÚioÚStringIOÚ__init__ÚcodeÚmsgrN   rO   )r   r•   r–   rN   r€   rO   r%   r%   r&   r”     s    zMockResponse.__init__c                 C   s   | j S r   rM   rŒ   r%   r%   r&   Úinfo  s    zMockResponse.infoc                 C   s   | j S r   ©rO   rŒ   r%   r%   r&   Ú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 r   )Úach_req)r   r   r%   r%   r&   Úadd_cookie_header%  s    zMockCookieJar.add_cookie_headerc                 C   s   || | _ | _d S r   )Ú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 r   )Ú	meth_nameÚhandleÚaction)r   r¡   r£   r¢   r%   r%   r&   r”   -  s    zFakeMethod.__init__c                 G   s   | j | j| jg|¢R Ž S r   )r¢   r¡   r£   )r   r„   r%   r%   r&   Ú__call__2  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”   7  s
    zMockHTTPResponse.__init__c                 C   s   dS )NÚ r%   rŒ   r%   r%   r&   r5   >  s    zMockHTTPResponse.readc                 C   s   i S r   r%   rŒ   r%   r%   r&   r—   A  s    zMockHTTPResponse.infoc                 C   s   | j S r   r˜   rŒ   r%   r%   r&   r™   D  s    zMockHTTPResponse.geturlN)rG   r   rH   r”   r5   r—   r™   r%   r%   r%   r&   r¥   6  s   r¥   c                   @   sT   e Zd Zdd„ Zejfdd„Zdd„ Zddd	„Zdd
dœdd„Z	dd„ Z
dd„ ZdS )ÚMockHTTPClassc                 C   s(   d| _ g | _d | _d| _d | _i | _d S )Nr   F)ÚlevelÚreq_headersr€   Úraise_on_endheadersÚsockÚ_tunnel_headersrŒ   r%   r%   r&   r”   I  s    zMockHTTPClass.__init__c                 C   s   || _ || _| S r   )Úhostr   )r   r°   r   r%   r%   r&   r¤   Q  s    zMockHTTPClass.__call__c                 C   s
   || _ d S r   )r«   )r   r«   r%   r%   r&   Úset_debuglevelV  s    zMockHTTPClass.set_debuglevelNc                 C   s&   || _ || _|r|| _n
| j ¡  d S r   )Ú_tunnel_hostZ_tunnel_portr¯   Úclear)r   r°   ÚportrN   r%   r%   r&   Ú
set_tunnelY  s
    zMockHTTPClass.set_tunnelF)Úencode_chunkedc                C   sP   || _ || _|d ur&|  j| ¡ 7  _| j ¡  |r:|| _|| _| jrLtƒ ‚d S r   )	ÚmethodÚselectorr¬   r   Úsortr€   r¶   r­   ÚOSError)r   r·   rO   ÚbodyrN   r¶   r%   r%   r&   r   a  s    
zMockHTTPClass.requestc                 C   s   t tƒ i ddƒS )Nr¦   ÚOK)r¥   rˆ   rŒ   r%   r%   r&   Úgetresponsen  s    zMockHTTPClass.getresponsec                 C   s   d S r   r%   rŒ   r%   r%   r&   r   q  s    zMockHTTPClass.close)NN)NN)rG   r   rH   r”   r†   r‡   r¤   r±   rµ   r   r½   r   r%   r%   r%   r&   rª   H  s   
ÿrª   c                   @   s@   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dS )ÚMockHandleréô  c                 C   s   |   |¡ d S r   )Ú_define_methods)r   Úmethodsr%   r%   r&   r”   z  s    zMockHandler.__init__c                 C   sJ   |D ]@}t |ƒdkr|\}}n
|d  }}t||| jƒ}t| j||ƒ qd S )Né   )Úlenr    r¢   ÚsetattrÚ	__class__)r   rÁ   Úspecr   r£   Úmethr%   r%   r&   rÀ   }  s    

zMockHandler._define_methodsc                 O   sØ   | j j | |||f¡ |d u r"d S |dkr.| S |dkrHtddi dƒ}|S |dkrXtdƒS | d¡rÀ|| d	¡d
 d … }zt|ƒ}W n ty–   Y n0 tddi dƒ}| j  	d|d ||di ¡S |dkrÔt
j	 d¡‚d S )Núreturn selfúreturn responser¦   r¼   r©   úreturn requestzhttp://blah/r   ú é   Úhttpr   ÚraiserL   )ÚparentÚcallsÚappendr‘   r   Ú
startswithÚrfindÚintr.   r   r+   rB   )r   Zfn_namer£   r„   ÚkwdsÚresr•   r%   r%   r&   r¢   †  s*    
zMockHandler.handlec                 C   s   d S r   r%   rŒ   r%   r%   r&   r     s    zMockHandler.closec                 C   s   || _ g | j _d S r   )rÏ   rÐ   )r   rÏ   r%   r%   r&   Ú
add_parent   s    zMockHandler.add_parentc                 C   s   t |dƒsdS | j|jk S )NÚhandler_orderT)ÚhasattrrØ   )r   Úotherr%   r%   r&   Ú__lt__¤  s    
zMockHandler.__lt__N)
rG   r   rH   rØ   r”   rÀ   r¢   r   r×   rÛ   r%   r%   r%   r&   r¾   u  s   	r¾   c                 C   sb   g }d}|D ]P}G dd„ dt ƒ}||ƒ}| j|7  _| | ¡ |d }| |¡ |  |¡ q|S )a¯  Create MockHandlers and add them to an OpenerDirector.

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

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

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

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

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

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