o
    g4                    @   s4  d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlmZmZmZmZmZmZmZ 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/Z0G d%d& d&ej.j1Z2G d'd( d(ej.j/Z3G d)d* d*Z4G d+d, d,e jZ5d-d. Z6G d/d0 d0e jZ7G d1d2 d2e jZ8G d3d4 d4e jZ9e:d5kre ;  dS dS )6    N)support)	os_helper)socket_helper)warnings_helper)test_urllib)RequestOpenerDirectorHTTPBasicAuthHandlerHTTPPasswordMgrWithPriorAuth_parse_proxy_proxy_bypass_macosx_sysconfAbstractDigestAuthHandler)urlparsec                   @   ,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TrivialTestsc              
   C   s   dD ]I}i }t d| | |d= |dkr2tjdkr2|d|d}}| |jd | |jd | D ]\}}| |jd	| d
|||jf  q6qd S )N)requestresponseparseerrorrobotparserzfrom urllib.%s import *__builtins__r   nturl2pathnamepathname2urlZ
nturl2pathz	urllib.%sz.%r is exposed in 'urllib.%s' but defined in %r)execosnamepopassertEqual
__module__items)selfmodulecontextupkv r(   G/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/test/test_urllib2.pytest___all__#   s    
zTrivialTests.test___all__c                 C   s   |  tjj | ttjjd tj	tjj
tjd}tjdkr'd| }nd| }tj|}|  W d    d S 1 sAw   Y  d S )Nz	bogus url/r   z
file:///%s	file://%s)
addCleanupurllibr   
urlcleanupassertRaises
ValueErrorurlopenr   pathabspath__file__replacesepr   read)r!   fnameZfile_urlfr(   r(   r)   test_trivial2   s   


"zTrivialTests.test_trivialc                 C   sR   dg dfdddgfdg dfdg d	fg}|D ]\}}|  tj|| qd S )
Nza,b,c)abczpath"o,l"og"i"cal, examplezpath"o,l"og"i"calZexampleza, b, "c", "d", "e,f", g, h)r<   r=   z"c"z"d"z"e,f"ghza="b\"c", d="e\,f", g="h\\i")za="b"c"zd="e,f"zg="h\i")r   r.   r   Zparse_http_list)r!   testsstringlistr(   r(   r)   test_parse_http_listE   s   

z!TrivialTests.test_parse_http_listc                 C   s"   t jd}| |jt| d S )Nreason)r.   r   URLErrorassertInrE   str)r!   errr(   r(   r)   test_URLError_reasonstrP   s   z$TrivialTests.test_URLError_reasonstrN)__name__r   __qualname__r*   r;   rD   rJ   r(   r(   r(   r)   r   !   s
    r   c                   @   r   )
RequestHdrsTestsc                 C   sD   d}|  t|ddidjd d |  t|ddidjd d dS )a(  
        The Request.headers dictionary is not a documented interface.  It
        should stay that way, because the complete set of headers are only
        accessible through the .get_header(), .has_header(), .header_items()
        interface.  However, .headers pre-dates those methods, and so real code
        will be using the dictionary.

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

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

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

        Method r.remove_header should remove items both from r.headers and
        r.unredirected_hdrs dictionaries
        rN   rO   rP   rQ   )rO   rP   zFoo-Barbaz)zFoo-barrU   z	Not-theredefaultzUnredirected-spamZEggsN)r   
assertTrue
has_headerr   Zheader_items
add_headersortedassertFalseassertIsNone
get_headerZremove_headeradd_unredirected_header)r!   rS   reqr(   r(   r)   test_request_headers_methodsl   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)rb   rc   rN   zhttp://example.com/spamzhttp://example.com/spam/spamzhttp://example.com/foofoozhttp://example.com/barbarnini)rk   rd   )rl   rm   r=   firstrP   secondspam)ro   rp   r<   1)rq   r<   zhttp://a.example.com/NNzc.example.comzc.example.com:3128)re   r>   )rf   rg   )rh   ri   r.   r   ZHTTPPasswordMgradd_passwordfind_user_passwordr   r!   ZmgraddZfind_user_passr(   r(   r)   test_password_manager   s   
z&RequestHdrsTests.test_password_managerc                 C   sr  t j }|j}|j}|dddd |dddd |d	d
dd |dddd | |ddd | |ddd | |ddd | |ddd | |ddd | |ddd | |ddd | |ddd | |ddd | |d	dd | |d	d
d | |d	dd | |ddd | |dd d | |dd!d | |dd"d d#S )$z
        The point to note here is that we can't guess the default port if
        there's no scheme.  This applies to both add_password and
        find_user_password.
        r:   zhttp://g.example.com:8010jr?   zhttp://h.example.com11r&   r@   zi.example.com:8012lizj.example.com13mzg.example.com:100rr   zg.example.com:80)ry   rz   zg.example.comzhttp://g.example.com:100zhttp://g.example.comzh.example.com)r{   r&   zh.example.com:80zhttp://h.example.com:80zi.example.com)r|   r}   zhttp://i.example.com:80)r   r   zj.example.com:80zhttp://j.example.comzhttp://j.example.com:80Nrs   rv   r(   r(   r)   "test_password_manager_default_port   sZ   
z3RequestHdrsTests.test_password_manager_default_portN)rK   r   rL   rT   r`   rx   r   r(   r(   r(   r)   rM   U   s
    $FrM   c                   @   s(   e Zd Zg ZdejfddZdd ZdS )
MockOpenerNc                 C   s   |||| _ | _| _d S N)r_   datatimeout)r!   r_   r   r   r(   r(   r)   open  s   zMockOpener.openc                 G   s   ||| _ | _d S r   )protoargs)r!   r   r   r(   r(   r)   r        zMockOpener.error)rK   r   rL   
addheaderssocket_GLOBAL_DEFAULT_TIMEOUTr   r   r(   r(   r(   r)   r      s    r   c                   @   s(   e Zd ZdddZdddZdd ZdS )	MockFileNc                 C      d S r   r(   r!   countr(   r(   r)   r8        zMockFile.readc                 C   r   r   r(   r   r(   r(   r)   readline  r   zMockFile.readlinec                 C   r   r   r(   r!   r(   r(   r)   close  r   zMockFile.closer   )rK   r   rL   r8   r   r   r(   r(   r(   r)   r   
  s    

r   c                   @      e Zd Zdd ZdS )MockHeadersc                 C   s   t |  S r   )rC   values)r!   r   r(   r(   r)   
getheaders  s   zMockHeaders.getheadersN)rK   r   rL   r   r(   r(   r(   r)   r         r   c                   @   s&   e Zd ZdddZdd Zdd ZdS )	MockResponseNc                 C   s.   t j| | ||||f\| _| _| _| _d S r   )ioStringIO__init__codemsgrR   rS   )r!   r   r   rR   r   rS   r(   r(   r)   r     s    zMockResponse.__init__c                 C      | j S r   rQ   r   r(   r(   r)   info     zMockResponse.infoc                 C   r   r   rS   r   r(   r(   r)   geturl"  r   zMockResponse.geturlr   )rK   r   rL   r   r   r   r(   r(   r(   r)   r     s    
r   c                   @      e Zd Zdd Zdd ZdS )MockCookieJarc                 C   
   || _ d S r   )ach_req)r!   r   r(   r(   r)   add_cookie_header'     
zMockCookieJar.add_cookie_headerc                 C   s   ||| _ | _d S r   )ec_reqec_r)r!   r   r   r(   r(   r)   extract_cookies*  r   zMockCookieJar.extract_cookiesN)rK   r   rL   r   r   r(   r(   r(   r)   r   &  s    r   c                   @   r   )
FakeMethodc                 C   s   || _ || _|| _d S r   )	meth_namehandleaction)r!   r   r   r   r(   r(   r)   r   /  s   
zFakeMethod.__init__c                 G   s   | j | j| jg|R  S r   )r   r   r   )r!   r   r(   r(   r)   __call__4  s   zFakeMethod.__call__N)rK   r   rL   r   r   r(   r(   r(   r)   r   .  s    r   c                   @   r   )
MockHTTPResponsec                 C   s"   || _ || _|| _|| _d| _d S )N   )fpr   statusrE   r   )r!   r   r   r   rE   r(   r(   r)   r   9  s
   
zMockHTTPResponse.__init__c                 C   s   dS )N r(   r   r(   r(   r)   r8   @  r   zMockHTTPResponse.readc                 C   s   i S r   r(   r   r(   r(   r)   r   C  r   zMockHTTPResponse.infoc                 C   r   r   r   r   r(   r(   r)   r   F  r   zMockHTTPResponse.geturlN)rK   r   rL   r   r8   r   r   r(   r(   r(   r)   r   8  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   K  s   
zMockHTTPClass.__init__c                 C   s   || _ || _| S r   )hostr   )r!   r   r   r(   r(   r)   r   S  s   zMockHTTPClass.__call__c                 C   r   r   )r   )r!   r   r(   r(   r)   set_debuglevelX  r   zMockHTTPClass.set_debuglevelNc                 C   s(   || _ || _|r|| _d S | j  d S r   )_tunnel_hostZ_tunnel_portr   clear)r!   r   portrR   r(   r(   r)   
set_tunnel[  s
   
zMockHTTPClass.set_tunnelF)encode_chunkedc                C   sP   || _ || _|d ur|  j| 7  _| j  |r|| _|| _| jr&t d S r   )	methodselectorr   r    sortr   r   r   OSError)r!   r   rS   bodyrR   r   r(   r(   r)   r   c  s   
zMockHTTPClass.requestc                 C   s   t t i ddS )Nr   OK)r   r   r   r(   r(   r)   getresponsep     zMockHTTPClass.getresponsec                 C   r   r   r(   r   r(   r(   r)   r   s  r   zMockHTTPClass.closerr   )rK   r   rL   r   r   r   r   r   r   r   r   r   r(   r(   r(   r)   r   J  s    
r   c                   @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )MockHandler  c                 C   s   |  | d S r   )_define_methods)r!   methodsr(   r(   r)   r   |     zMockHandler.__init__c                 C   sJ   |D ] }t |dkr|\}}n|d }}t||| j}t| j|| qd S )N   )lenr   r   setattr	__class__)r!   r   specr   r   methr(   r(   r)   r     s   

zMockHandler._define_methodsc                 O   s   | j j| |||f |d u rd S |dkr| S |dkr$tddi d}|S |dkr,tdS |dr`||d	d
 d  }zt|}W n	 tyK   Y nw tddi d}| j 	d|d ||di S |dkrjt
j	dJ )Nreturn selfreturn responser   r   r   return requestzhttp://blah/r       httpr   raiserP   F)parentcallsappendr   r   
startswithrfindintr1   r   r.   rF   )r!   Zfn_namer   r   kwdsresr   r(   r(   r)   r     s,   
zMockHandler.handlec                 C   r   r   r(   r   r(   r(   r)   r     r   zMockHandler.closec                 C   s   || _ g | j _d S r   )r   r   )r!   r   r(   r(   r)   
add_parent  s   zMockHandler.add_parentc                 C   s   t |dsdS | j|jk S )Nhandler_orderT)hasattrr   )r!   otherr(   r(   r)   __lt__  s   
zMockHandler.__lt__N)
rK   r   rL   r   r   r   r   r   r   r   r(   r(   r(   r)   r   w  s    	r   c                 C   sb   g }d}|D ](}G dd dt }||}| j|7  _||  |d }|| | | q|S )a  Create MockHandlers and add them to an OpenerDirector.

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

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

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

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

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

    r   c                   @      e Zd ZdS )z6add_ordered_mock_handlers.<locals>.MockHandlerSubclassNrK   r   rL   r(   r(   r(   r)   MockHandlerSubclass      r   r   N)r   r   r   r   add_handler)opener	meth_spechandlersr   methsr   r@   r(   r(   r)   add_ordered_mock_handlers  s   

r   c                  G   s   t  }| D ]}|| q|S r   )r   r   )Zhandler_instancesr   r@   r(   r(   r)   build_test_opener  s   r   c                   @   $   e Zd Zdd Zdd Zdd ZdS )MockHTTPHandlerc                 C   s   || _ || _|   d S r   )r   rR   reset)r!   r   rR   r(   r(   r)   r        zMockHTTPHandler.__init__c                 C   s   d| _ g | _d S )Nr   )_countrequestsr   r(   r(   r)   r        
zMockHTTPHandler.resetc                 C   s   dd l }dd l}| j|| | jdkr6| jd | _tjj| j	 }|
| j}| jd|t | j	||S || _|
d}tdd|d| S )Nr   r   r   

r   r   r   )emailcopyr   r   deepcopyr   r   client	responsesr   Zmessage_from_stringrR   r   r   r   r_   r   get_full_url)r!   r_   r   r   r   r   r(   r(   r)   	http_open  s   

zMockHTTPHandler.http_openNrK   r   rL   r   r   r  r(   r(   r(   r)   r     s    r   c                   @   s   e Zd ZdddZdd ZdS )MockHTTPSHandlerr   c                 C   s   t jjj| |d t | _d S )N
debuglevel)r.   r   AbstractHTTPHandlerr   r   httpconn)r!   r	  r(   r(   r)   r     s   zMockHTTPSHandler.__init__c                 C   s   |  | j|S r   )do_openr  r!   r_   r(   r(   r)   
https_open  r   zMockHTTPSHandler.https_openN)r   )rK   r   rL   r   r  r(   r(   r(   r)   r    s    
r  c                   @   r   )MockHTTPHandlerCheckAuthc                 C   s   || _ d| _d S NF)r   has_auth_header)r!   r   r(   r(   r)   r     r   z!MockHTTPHandlerCheckAuth.__init__c                 C   s
   d| _ d S r  )r  r   r(   r(   r)   r     r   zMockHTTPHandlerCheckAuth.resetc                 C   s6   | drd| _tjj| j }t| j|t d| S )NAuthorizationTr   )	rX   r  r   r  r  r   r   r   r  )r!   r_   r   r(   r(   r)   r  	  s   
z"MockHTTPHandlerCheckAuth.http_openNr  r(   r(   r(   r)   r    s    r  c                   @   r   )MockPasswordManagerc                 C   s   || _ || _|| _|| _d S r   )realmrS   userrc   )r!   r  Zurir  rc   r(   r(   r)   rt     s   
z MockPasswordManager.add_passwordc                 C   s   || _ || _| j| jfS r   )target_realm
target_urlr  rc   )r!   r  Zauthurir(   r(   r)   ru     r   z&MockPasswordManager.find_user_passwordN)rK   r   rL   rt   ru   r(   r(   r(   r)   r    s    r  c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )OpenerDirectorTestsc                 C   s(   G dd dt }| tt j|  d S )Nc                   @   r   )z<OpenerDirectorTests.test_add_non_handler.<locals>.NonHandlerNr   r(   r(   r(   r)   
NonHandler!  r   r  )objectr0   	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   )rF   )r  r   )Z
proxy_openr   )Zredirect_requestr   )Zdoproxyredirectz://example.com/)
urllib.errorrF   r   r   r   r.   r   ZUnknownHandlerr0   r   )r!   rF   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 ]\}}|\}	}
}}| |	|
f| | ||f q6d S )N)r  ftp_openhttp_error_302r#  r  r   ra   r   r   r  )r   r   r   r   r   zipr   )r!   r   r   r   r_   rr   expectedgothandlerr   r   r   r(   r(   r)   test_handled;  s    

z OpenerDirectorTests.test_handledc                 C   s   t  }g }dgdfdgdffD ]\}}G dd dt}||}||_|| || q|d | |jd d |d  | |jd d |d  d S )	Nr%  r   r  r   c                   @   r   )zCOpenerDirectorTests.test_handler_order.<locals>.MockHandlerSubclassNr   r(   r(   r(   r)   r   Z  r   r   ra   r   )r   r   r   r   r   r   r   r   )r!   r   r   r   r   r   r@   r(   r(   r)   test_handler_orderU  s   

z&OpenerDirectorTests.test_handler_orderc                 C   sZ   t  }dgdgg}t||}td}| tjj|j| | |j	|d d|fi fg d S )N)r  r   r%  ra   r   r  )
r   r   r   r0   r.   r   rF   r   r   r   )r!   r   r   r   r_   r(   r(   r)   
test_raiseg  s   
"zOpenerDirectorTests.test_raisec                 C   s   t  }dgddgg ddgg}t||}td}|| t|jdks&J |d d|ff|d d|tjd	d
i ffg}t||jD ]\}}|\}}	}
| 	||	f|d d  | 	|
|d  qAd S )N)r  z	error 302)Zhttp_error_400r   r  ))r$  r   Zhttp_error_303Z
http_errorr$  ra   r   r   .  r   )
r   r   r   r   r   r   r   Z	ALWAYS_EQr&  r   )r!   r   r   r   r_   r   r(  r)  r*  Zmethod_namer   r(   r(   r)   test_http_errort  s(   


z#OpenerDirectorTests.test_http_errorc                 C   s  t  }ddgddgg}t||}td}|| |d df|d df|d df|d dfg}t|jD ]O\}\}}}	}
|dk r[| ||f||  | t|	d | |	d t q4| ||f||  | t|	d | |	d t |	d d ur| |	d t	 q4d S )	N)http_requestr   )http_responser   ra   r   r0  r   r1  r   )
r   r   r   r   	enumerater   r   r   ZassertIsInstancer   )r!   r   r   r   r_   r   r~   r*  r   r   r   r(   r(   r)   test_processors  s4   

z#OpenerDirectorTests.test_processorsN)
rK   r   rL   r  r"  r+  r,  r-  r/  r3  r(   r(   r(   r)   r    s    r  c                 C   sX   z|  d W n ty   tdw tj| }tjdkr*|	dr*|dd  }|S )Nzutf-8zpath is not encodable to utf8r   z///r   )
encodeUnicodeEncodeErrorunittestZSkipTestr.   r   r   r   r   r   )r3   urlpathr(   r(   r)   sanepathname2url  s   
r8  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 ]f\	}}}}}	}
}}}t|}d |_|	|}| 
|j| | 
|j|	 | 
|jt| | 
|j| | 
|j| | 
|jj| | 
|jj|
 | }| 
|d| | 
t|d t| qnd S )Nc                   @   r   )z-HandlerTests.test_ftp.<locals>.MockFTPWrapperc                 S   r   r   r   r!   r   r(   r(   r)   r     r   z6HandlerTests.test_ftp.<locals>.MockFTPWrapper.__init__c                 S   s$   ||| _ | _t| jt| jfS r   )filenamefiletyper   r   r   r   )r!   r<  r=  r(   r(   r)   retrfile  s   z6HandlerTests.test_ftp.<locals>.MockFTPWrapper.retrfilec                 S   r   r   r(   r   r(   r(   r)   r     r   z3HandlerTests.test_ftp.<locals>.MockFTPWrapper.closeN)rK   r   rL   r   r>  r   r(   r(   r(   r)   MockFTPWrapper  s    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   r   r   r:  r;  r(   r(   r)   r     r   z6HandlerTests.test_ftp.<locals>.NullFTPHandler.__init__c                    s4   ||| _ | _||| _| _|| _ | j| _| jS r   )r  passwdr   r   dirsr   
ftpwrapper)r!   r  r@  r   r   rA  r   r?  r(   r)   connect_ftp  s
   z9HandlerTests.test_ftp.<locals>.NullFTPHandler.connect_ftpN)rK   r   rL   r   r   r   rD  r(   rC  r(   r)   NullFTPHandler  s    rE  r   zrheum rhaponicumz ftp://localhost/foo/bar/baz.html	localhostr   Irk   rl   zbaz.htmlz	text/htmlz'ftp://parrot@localhost/foo/bar/baz.htmlZparrotz*ftp://%25parrot@localhost/foo/bar/baz.htmlz%parrotz,ftp://%2542parrot@localhost/foo/bar/baz.htmlz	%42parrotzftp://localhost:80/foo/bar/P   Dzftp://localhost/baz.gif;type=aAzbaz.gifContent-typeContent-length)r.   r   Z
FTPHandlerftplibr   r   ZFTP_PORTr   r   r#  r   r  r@  r   r   gethostbynamer   rA  rB  r<  r=  r   getr   r   )r!   rE  rM  r   r@   rS   r   r   r  r@  Ztype_rA  r<  Zmimetyper_   r'  rR   r(   rC  r)   test_ftp  sZ   






zHandlerTests.test_ftpc              
   C   s  dd l }tj }t  }|_tj}tt	j
|}d}d| d| dtd|f g}z	tt }W n tjyA   d}Y nw |rM|d||f  |D ]w}	t|d}
zEz|
| W |
  n|
  w |t|	}z| }| }| }W |  n|  w t	|}|jj|jd	d
}W t	| nt	| w | || | |d d | |d d | |d | | ||	 qOd| dddtdt	 |f dt	 |f fD ]1}	z)t|d}
z|
| W |
  n|
  w |  tj!j"|jt|	 W t	| qt	| w tj }t  }|_dD ]9\}	}t|	}z|| W n tj!j"y?   | #| Y nw | $|j%| | |j&d | |j&dk| qd S )Nr   s   hello, world
zfile://localhost%sr,   zfile://%s%srF  r   wbT)ZusegmtrK  z
text/plainrL  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   TESTFNr8  r   r3   r4   r   rN  gethostnamegaierrorr   r   writer   Z	file_openr   r8   r   r   statZutilsZ
formatdatest_mtimeremover   getcwdr0   r   rF   r[   assertIsr_   type)r!   r   r@   r   rT  r7  ZtowriteurlsZ	localaddrrS   r:   r'  r   rR   ZrespurlZstatsZmodifiedrR  r_   r(   r(   r)   	test_file  s   





	



zHandlerTests.test_filec                 C   s`  t j }t  }|_d}dD ]q\}}t||ddi}d |_|dd t }|	||}|j
 |j |j |j |j|jdkdf | }	|	j |	j | | | | |jd	 | |jd
 | |j| | |jd | |jg d | |j| qd|_| t jj|j	|| tdd}| t|j| dg|_dD ]}td|}t ddi d}||}
|d u r| !d|j" | !d|j" n| |j"d d | |j"d d | |j"d d	 | |j"d d |dd |dd |dd |dd ||}
| |j"d d | |j"d d | |j"d d | |j"d d qd S )Nra   ))GETN)POSTs   blahFoorl   Spameggsr   r   rj   r   r+   ))
Connectionr   )rb  rl   rc  rd  TZbadpostrf  )    Nr   rL  rK  0z!application/x-www-form-urlencodedHostrk   rU   )#r.   r   r
  r   r   r   r   r^   r   r  r8   r   r   r   r   r   rO  __contains__r   r   r   r   r   r   r   r   r0   r   rF   r  do_request_r   r   assertNotInunredirected_hdrs)r!   r@   r   rS   r   r   r_   r   r'  hdrsnewreqr(   r(   r)   	test_httpY  sf   




zHandlerTests.test_httpc           	      C   s  t j }t  }|_tjddd}|j}|  | 	t
j| t|d&}td|i }||}|d}| |d | |d W d    n1 sNw   Y  t|d)}td|d	d
i}||}| t|dd
 | |d W d    d S 1 sw   Y  d S )Nzw+bF)modedeleterbra   Transfer-encodingchunkedrL  Content-Length   )r.   r   r
  r   r   tempfileNamedTemporaryFiler   r   r-   r   unlinkr   r   rk  r]   r   r[   rX   r   )	r!   r@   r   file_objZ	file_pathr:   r_   ro  ter(   r(   r)   test_http_body_file  s&   



"z HandlerTests.test_http_body_filec                 C   s   t j }t  }|_t }td|i }||}| 	|
dd | |d ddi}td||}||}| 	t|
dd | |d |  d S )Nra   rt  ru  rL  rv  rw  )r.   r   r
  r   r   r   BytesIOr   rk  r   r]   r[   rX   r   r   )r!   r@   r   r{  r_   ro  rR   r(   r(   r)   test_http_body_fileobj  s   


z#HandlerTests.test_http_body_fileobjc              	   C   s   t j }t  }|_tjddg}i ddifD ]F}tj|tj	d4}t
d|j|}||}|sC| |dd  | |dd	 n| t|dd W d    q1 sXw   Y  qd S )
Nz-cpassrv  rw  )stdoutra   rL  rt  ru  )r.   r   r
  r   r   sys
executable
subprocessPopenPIPEr   r  rk  r   r]   r   )r!   r@   r   cmdrR   procr_   ro  r(   r(   r)   test_http_body_pipe  s$   

z HandlerTests.test_http_body_pipec                 C   s   t j }t  }|_dd }i ddifD ].}td| |}||}|s8| |dd  | |dd q| t	|dd qd S )	Nc                   s   s    dV  d S )Ns   oner(   r(   r(   r(   r)   iterable_body  s   
z;HandlerTests.test_http_body_iterable.<locals>.iterable_bodyrv     ra   rL  rt  ru  )
r.   r   r
  r   r   r   rk  r   r]   r   )r!   r@   r   r  rR   r_   ro  r(   r(   r)   test_http_body_iterable  s   

z$HandlerTests.test_http_body_iterablec                 C   sH   t j }t |_|tdd}| |dd | 	|
d d S )Nra   r(   rt  ru  rL  )r.   r   r
  r   r   rk  r   r   r]   r[   rX   )r!   r@   r_   r(   r(   r)   test_http_body_empty_seq  s
   
z%HandlerTests.test_http_body_empty_seqc                 C   sh   t j }t  }|_tdg d}i ddifD ]}td||}||}| t	|
dd qd S )NrG  )r   r         rv     ra   rL  )r.   r   r
  r   r   arrayr   rk  r   r   r]   )r!   r@   r   Ziterable_arrayrR   r_   ro  r(   r(   r)   test_http_body_array  s   

z!HandlerTests.test_http_body_arrayc                 C   s6   t  }tdd}|| |d | |jd d S )Nr   r  zhttps://www.example.com)r   r  r   r   r   Z_debuglevel)r!   r   r@   r(   r(   r)   test_http_handler_debuglevel
  s
   


z)HandlerTests.test_http_handler_debuglevelc                 C   sz   t j }t |_d}g d}|D ])}t||}||}| |jd d |	dd  ||}| |jd d qd S )Nrg  )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.htmlri  rj   zsomeproxy:3128)
r.   r   r
  r   r   r   rk  r   rm  	set_proxy)r!   r@   r   Zds_urlsZds_urlZds_reqZ	np_ds_reqZp_ds_reqr(   r(   r)   test_http_doubleslash  s   



z"HandlerTests.test_http_doubleslashc                 C   sh   g d}t d}|D ]'}||_t|}| | | | |jp!d|j | t| j|j q
d S )N)zhttp://example.com?foo=bar#bazz)http://example.com?foo=bar&spam=eggs#bashrN   rN   r   )r   full_urlr   r   r  fragmentquery)r!   r^  r'  rS   parsedr(   r(   r)   test_full_url_setter,  s   z!HandlerTests.test_full_url_setterc                 C   s6   t d}|`| |j | |j | |jd d S )Nhttp://www.example.comr   )r   r  r\   r  r   r   )r!   r'  r(   r(   r)   test_full_url_deleterC  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   rk  r   r   r   )r!   r@   Z	weird_urlr_   ro  Zurl_without_pathr(   r(   r)   test_fixpath_in_weirdurlsJ  s   


z&HandlerTests.test_fixpath_in_weirdurlsc                 C   s  t j }t  }|_d}t|}tddi d|}|||}| || | 	t
|d tddi d|}|||}| || | 	t
|d tdd	i d|}|||}| || | 	t
|d td
di d|}| ||| | |jd | |j||d
di f d S )Nra   r   r   r   r      ZAccepted   zPartial contenti  zBad gatewayr   )r.   r   ZHTTPErrorProcessorr   r   r   r   r1  r\  r[   r   r\   r   r   r   )r!   r@   r   rS   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 )Nra   r   r   r   rj   )r   r.   r   HTTPCookieProcessorr   r   r   r   r0  r\  r   r   origin_req_hostr[   Zunverifiabler1  r   r   )r!   cjr@   r_   r'  ro  r  r(   r(   r)   test_cookiesv  s   
zHandlerTests.test_cookiesc              
   C   sT  d}d}t j }t  }|_dD ]}dD ]}t|d| }t||}tj|_	|
dd |d ur;|
dtt| |d	d
 z||t |dtd|i W n t jjyf   | |d | | Y nw | |j | z| |j d W n ty   | |jj Y nw dd |jjD }	| d|	 | d|	 | |jjd d | d	|jj | d	|jj qqt|}tj|_	|fdd}
t|dd}d}tj|_	z	 |
||d |d }q t jjy   | |t jjj Y nw t|dd}d}tj|_	z	 |
||d|  |d }q t jjy)   | |t jjj Y d S w )Nhttp://example.com/a.htmlzhttp://example.com/b.html)i-  r.  i/  3  )Nz
blah
blah
zhttp_error_%sZNonsensezviking=withholdrv  rc  rp   Blahlocationr  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 )Nr.  r  r  )r$  r   r   )r@   r_   rS   r(   r(   r)   r    s   
z,HandlerTests.test_redirect.<locals>.redirectrj   )r  r   r   ra   zhttp://example.com/%d)r.   r   HTTPRedirectHandlerr   r   getattrr   r   r   r   rY   rH   r   r^   r   r   r   	HTTPErrorr   assertIsNotNoner_   r  
get_methodAttributeErrorr[   r   rR   rl  rm  Zmax_repeatsZmax_redirections)r!   from_urlZto_urlr@   r   r   r   r   r_   rR   r  r   r(   r(   r)   test_redirect  s~   


!
zHandlerTests.test_redirectc                 C   s   d}g d}g d}d}t j }t  }|_t|}tj|_|D ]}|d | }	| 	t j
j|j|t ddtd|	i q!|D ]}|d | }
||t dd	td|
i | |j |
 q?d S )
Nr  )r   httpsrR  )fileimapZldapzexample.com/b.htmlz://r.  zSecurity Loopholer  That's fine)r.   r   r  r   r   r   r   r   r   r0   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   r[   r_   rX   )	r!   r  r  r  hhhdehhrhZcpr   r(   r(   r)   test_cookie_redirect  s   



z!HandlerTests.test_cookie_redirectc                 C   sT   d}t dd| }tj }tj }t|||}|d}| | |	  d S )Nz(http://www.example.com/index.html#OK

r.  z
Location: r  )
r   r.   r   r  r  r   r   r   r   strip)r!   Zredirected_urlr  r  r  r   r   r(   r(   r)   test_redirect_fragment  s   


z#HandlerTests.test_redirect_fragmentc                    s|    tjj tjj d}t|tj_ t	tjd  t
d fdd}|tjj_tjd}| d d S )Ns(   HTTP/1.1 302 Found
Location: ?query

HTTPConnection)z/pathz/path?queryc                    s8    |t  j| ||g|R i | d| j_d S )Ns   HTTP/1.1 200 OK

Hello!)r   nextr   r   Zfakedata)connr   rS   poskwZ
real_classr!   r^  r(   r)   r     s   z3HandlerTests.test_redirect_no_path.<locals>.requestzhttp://python.org/pathzhttp://python.org/path?query)r-   r.   r   r/   r   r  r  r   fakehttpr   iterr2   r   r   )r!   Z	response1r   r   r(   r  r)   test_redirect_no_path  s   
z"HandlerTests.test_redirect_no_pathc           
   	   C   s   G dd dt jj}| }t j|}d}|D ]>\}}| t|+ td| d |_|	d}d| d }|j
}	| |	|t|	 W d    q1 sPw   Y  qd S )	Nc                   @   r   )z4HandlerTests.test_redirect_encoding.<locals>.Handlerc                 S   s(   |  | j|}| jj| _td| _|S )Ns)   HTTP/1.1 200 OK
Content-Length: 3

123)r  
connectionbuflast_bufr   r  )r!   r_   resultr(   r(   r)   r  $  s   
z>HandlerTests.test_redirect_encoding.<locals>.Handler.http_openN)rK   r   rL   r  r(   r(   r(   r)   Handler#  r   r  ))s   /på-dansk/s   /p%C3%A5-dansk/)   /spaced%20path/r  )s   /spaced path/r  )s   /?på-dansks   /?p%C3%A5-dansks!   HTTP/1.1 302 Redirect
Location: s   

ra   s   GET     )r.   r   HTTPHandlerbuild_openersubTestreprr   r  r  r   r  rW   r   )
r!   r  r*  r   rA   r  r  r   r(  r   r(   r(   r)   test_redirect_encoding   s&   
z#HandlerTests.test_redirect_encodingc                 C   s   d}t |dt |dfD ]A}t }tj|}|| dgg}t||}td}| |j	d |
| | |j	| | |d dfgd	d
 |jD  qd S )Nproxy.example.com:3128r   )ZHTTP)r  r   zhttp://acme.example.com/zacme.example.comr   r  c                 S      g | ]}|d d qS r   r   r(   r  tupr(   r(   r)   r  S      z+HandlerTests.test_proxy.<locals>.<listcomp>)dictr   r.   r   ProxyHandlerr   r   r   r   r   r   r   )r!   r$   rg   r   phr   r   r_   r(   r(   r)   
test_proxyC  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_proxyU  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_alld  s   


z$HandlerTests.test_proxy_no_proxy_allc                 C   s   t  }tjtdd}|| dgg}t||}td}| |j	d |
| | |j	d | |d dfgdd	 |jD  d S )
Nr  r  )r  r   https://www.example.com/www.example.comr   r  c                 S   r  r  r(   r  r(   r(   r)   r  }  r  z1HandlerTests.test_proxy_https.<locals>.<listcomp>)r   r.   r   r  r  r   r   r   r   r   r   r   )r!   r   r  r   r   r_   r(   r(   r)   test_proxy_httpso  s   


zHandlerTests.test_proxy_httpsc                 C   s   t  }tjtdd}|| t }|| td}|dd |dd | 	|j
d | |j || | d	|jj | d
|jj | |j | 	|j
d | 	|dd d S )Nr  r  r  Proxy-AuthorizationFooBar
User-AgentGrailr  )r  r  )r  r  Proxy-authorization)r   r.   r   r  r  r   r  r   rY   r   r   r\   r   r   rl  r  r   rG   r  r]   )r!   r   r  Zhttps_handlerr_   r(   r(   r)   $test_proxy_https_proxy_authorization  s(   


z1HandlerTests.test_proxy_https_proxy_authorizationdarwinzonly relevant for OSXc                 C   s   dg dd}dD ]}|  t||d|  q	dD ]}| t||d|  qdg d}|  td	| dd
dgd}d}|  t||d|  d}| t||d|  d S )NF)foo.barz	*.bar.com	127.0.0.1z10.10z10.0/16)Zexclude_simple
exceptions)r  zwww.bar.comr   z	10.10.0.1z10.0.0.1z expected bypass of %s to be True)zabc.foo.barzbar.comz	127.0.0.2z	10.11.0.1Z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)rW   r   r[   )r!   Zbypassr   r(   r(   r)   test_osx_proxy_bypass  s0   
z"HandlerTests.test_osx_proxy_bypassc                 C   s   | j ||d7 t }t }tj|}d|d }td|}|| || | 	||d|||dd W d    d S 1 sAw   Y  d S )N)r  rR   z
r     r  !http://acme.example.com/protected)
r  r   r  r.   r   r	   joinr   r   _test_basic_auth)r!   rR   r  r   password_managerauth_handlerr   http_handlerr(   r(   r)   check_basic_auth  s   



"zHandlerTests.check_basic_authc           
   
   C   s,  d}d}d| d}d| d}d}d| d}d| dd| dd| d	| d
| | d
| | d
| | d
| | d
| fD ]}d| g}|  || qGtdtf d| g}|  || W d    n1 stw   Y  ||g||g||gfD ]}	dd |	D }|  || qd S )Nzrealm2@example.comzBasic realm=""zOtherscheme xxxzDigest realm="zn", qop="auth, auth-int", nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", opaque="5ccc069c403ebaf9f0171e9517f40e41"zBasic realm=''z", charset="UTF-8"z, WWW-Authenticate: zBasic Auth Realm was unquotedzWWW-Authenticate: Basic realm=c                 S   s   g | ]}d | qS )r  r(   )r  Z	challenger(   r(   r)   r    s    z0HandlerTests.test_basic_auth.<locals>.<listcomp>)r  r   Zcheck_warningsUserWarning)
r!   r  Zrealm2basicZbasic2Zother_no_realmdigestZ	realm_strrR   Z
challengesr(   r(   r)   test_basic_auth  s@   


zHandlerTests.test_basic_authc              
   C   sv   t  }tjtdd}|| t }tj|}d}tdd| }|| || | 	||d|||dd d S )Nr  r  ACME Networksi  z(Proxy-Authenticate: Basic realm="%s"

r  z&http://acme.example.com:3128/protected)
r   r.   r   r  r  r   r  ZProxyBasicAuthHandlerr   r  )r!   r   r  r  r	  r  r
  r(   r(   r)   test_proxy_basic_auth  s    



z"HandlerTests.test_proxy_basic_authc           
   
   C   s   G dd dt }G dd dtjj}G dd dtjj}| }t }||}||}d}tdd	| }	|| || ||	 | ||d
||	|dd | 	|j
ddgd  d S )Nc                   @   r   )zQHandlerTests.test_basic_and_digest_auth_handlers.<locals>.RecordingOpenerDirectorc                 S   s   t |  g | _d S r   )r   r   recordedr   r(   r(   r)   r     s   

zZHandlerTests.test_basic_and_digest_auth_handlers.<locals>.RecordingOpenerDirector.__init__c                 S   s   | j | d S r   )r  r   )r!   r   r(   r(   r)   record  r   zXHandlerTests.test_basic_and_digest_auth_handlers.<locals>.RecordingOpenerDirector.recordN)rK   r   rL   r   r  r(   r(   r(   r)   RecordingOpenerDirector  s    r  c                   @   r   )zOHandlerTests.test_basic_and_digest_auth_handlers.<locals>.TestDigestAuthHandlerc                 _   ,   | j d tjjj| g|R i | d S )Nr  )r   r  r.   r   HTTPDigestAuthHandlerhttp_error_401r!   r   r   r(   r(   r)   r       
z^HandlerTests.test_basic_and_digest_auth_handlers.<locals>.TestDigestAuthHandler.http_error_401NrK   r   rL   r  r(   r(   r(   r)   TestDigestAuthHandler  r   r  c                   @   r   )zNHandlerTests.test_basic_and_digest_auth_handlers.<locals>.TestBasicAuthHandlerc                 _   r  )Nr  )r   r  r.   r   r	   r  r  r(   r(   r)   r    r  z]HandlerTests.test_basic_and_digest_auth_handlers.<locals>.TestBasicAuthHandler.http_error_401Nr  r(   r(   r(   r)   TestBasicAuthHandler  r   r  r  r  &WWW-Authenticate: Basic realm="%s"

r  r  r  r  r   )r   r.   r   r  r	   r  r   r   r  r   r  )
r!   r  r  r  r   r  Zdigest_handlerZbasic_handlerr  r
  r(   r(   r)   #test_basic_and_digest_auth_handlers  s(   	



z0HandlerTests.test_basic_and_digest_auth_handlersc                 C   D   t  }tjd }tdd}|| || | t|jd d S )Nr  zWWW-Authenticate: Kerberos

r  )	r   r.   r   r  r   r   r0   r1   r   )r!   r   Zdigest_auth_handlerr
  r(   r(   r)   $test_unsupported_auth_digest_handler6  s   

z1HandlerTests.test_unsupported_auth_digest_handlerc                 C   r"  )Nr  zWWW-Authenticate: NTLM

r  )	r   r.   r   r	   r   r   r0   r1   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   )base64rt   r   r  rS   r  rc   r   r  r  r   r   r[   rX   bytesZencodebytesr  decoder]   rm  r   )r!   r   r	  Zauth_headerr  r
  r  request_urlZprotected_urlr'  r  rc   ZuserpassZauth_hdr_valuer(   r(   r)   r  J  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	   rt   r+  rW   r   r   r   r  )	r!   r  rc   r*  r
  pwd_managerauth_prior_handleris_authr   r(   r(   r)   test_basic_prior_auth_auto_sendo  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	   rt   r+  r[   r   r   r   r   rW   r  r  )
r!   r  rc   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 ]C\}}d |}t| | }tj }td}d|_|	||}|
  W d   n1 s5w   Y  | |jjd | qdS )z=Test the connection is cleaned up when the response is closed))zConnection: close   data)zTransfer-Encoding: chunkeds   4
data
0

)zContent-Length: 4r1  zHTTP/1.1 200 OK
{}

http://dummy/NzConnection not closed with {!r})formatr   r  r4  r.   r   r
  r   r   r  r8   rW   fakesockclosed)r!   Ztransferr   headerr  r*  r_   Zrespr(   r(   r)   test_http_closed  s   



zHandlerTests.test_http_closedc                 C   sp   t d}tj }td}d|_| tj	j
 ||| W d   n1 s)w   Y  | |jjd dS )z;Test the connection is cleaned up after an invalid responserg  r2  NzConnection not closed)r   r  r.   r   r
  r   r   r0   r   r  ZBadStatusLiner  rW   r4  r5  )r!   r  r*  r_   r(   r(   r)   test_invalid_closed  s   

z HandlerTests.test_invalid_closedN)/rK   r   rL   rP  r_  rp  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r6  
skipUnlessr  platformr  r  r  r  r!  r#  r$  r  r/  r0  r7  r8  r(   r(   r(   r)   r9    sT    @\BJ	#
!-2

%(r9  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>)rW   anyr   )r!   r   r=  r(   r<  r)   opener_has_handler  s   zMiscTests.opener_has_handlerc                 C   s(  G dd dt jj}G dd dt jj}G dd dt jj}t jj}|||}| || | || ||| }| || | || ||}| || | }| |t jj |t jj}| |t jj |t j }| |t jj G dd dt jj}|||}| || | || d S )	Nc                   @   r   )z2MiscTests.test_build_opener.<locals>.MyHTTPHandlerNr   r(   r(   r(   r)   MyHTTPHandler  r   rA  c                   @   r   )z/MiscTests.test_build_opener.<locals>.FooHandlerc                 S   r   r   r(   r   r(   r(   r)   foo_open  r   z8MiscTests.test_build_opener.<locals>.FooHandler.foo_openN)rK   r   rL   rB  r(   r(   r(   r)   
FooHandler  r   rC  c                   @   r   )z/MiscTests.test_build_opener.<locals>.BarHandlerc                 S   r   r   r(   r   r(   r(   r)   bar_open  r   z8MiscTests.test_build_opener.<locals>.BarHandler.bar_openN)rK   r   rL   rD  r(   r(   r(   r)   
BarHandler  r   rE  c                   @   r   )z7MiscTests.test_build_opener.<locals>.MyOtherHTTPHandlerNr   r(   r(   r(   r)   MyOtherHTTPHandler  r   rF  )r.   r   r  BaseHandlerr  r@  )r!   rA  rC  rE  r  r   rF  r(   r(   r)   test_build_opener  s,   

zMiscTests.test_build_openerZnetworkztest requires network accessc                 C   s   t dM tj }tjd}| d |j ||d	d | d|j | d|
d ||d	d | d|j | d|
d W d    d S 1 sUw   Y  d S )	Nr  rq   zus-ascii   1rL  Z
1234567890s
   1234567890ry   )r   Ztransient_internetr.   r   r  r   r   r   r   r4  r]   )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: 42rE   rR   zHTTP Error %s: %sz<HTTPError %s: %r>)r.   r   r  rW   r   r   rE   rR   r   r   rH   r  )r!   r   rS   r   r   rn  rI   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  rL  rM  )zjoe:password@proxy.example.com)Nrb   rc   r  )z#joe:password@proxy.example.com:3128)Nrb   rc   r  )zhttp://proxy.example.com/)r   NNr  )zhttp://proxy.example.com:3128/)r   NNr  )z&http://joe:password@proxy.example.com/r   rb   rc   r  )z*http://joe:password@proxy.example.com:3128)r   rb   rc   r  )z1ftp://joe:password@proxy.example.com/rubbish:3128)rR  rb   rc   r  )z%http://joe:password@proxy.example.comrN  )z&http://user/name:password@localhost:22)r   	user/namerc   localhost:22)z&http://username:pass/word@localhost:22)r   username	pass/wordrP  )z'http://user/name:pass/word@localhost:22)r   rO  rR  rP  zfile:/ftp.example.com)r   r   r0   r1   )r!   Zparse_proxy_test_casesZtcr(  r(   r(   r)   test_parse_proxy!  s   'zMiscTests.test_parse_proxyc                 C   sP   t  }| t}|d W d    n1 sw   Y  | t|jd d S )Ninvalidz5Unsupported digest authentication algorithm 'invalid')r   r0   r1   Zget_algorithm_implsr   rH   	exception)r!   r*  excr(   r(   r)   test_unsupported_algorithmN  s   z$MiscTests.test_unsupported_algorithmN)rK   r   rL   r@  rH  r6  r9  r   Zis_resource_enabledrJ  rK  rS  rW  r(   r(   r(   r)   r;    s    ,
-r;  c                   @   s   e Zd ZG dd deZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS ) RequestTestsc                   @   s   e Zd ZdZdS )zRequestTests.PutRequestPUTN)rK   r   rL   r   r(   r(   r(   r)   
PutRequestY  s    rZ  c                 C   sL   t d| _t ddddid| _t ddd| _| d| _| jddd| _d S )	Nhttp://www.python.org/~jeremy/r   zX-Testr  rQ   HEAD)r   ra  )r   rO  postheadrZ  put
force_postr   r(   r(   r)   setUp\  s   
zRequestTests.setUpc                 C   s^   |  d| j  |  d| j  |  d| j  |  d| j  |  d| j  d S )Nra  r`  r\  rY  )r   r]  r  rO  r^  r_  r`  r   r(   r(   r)   test_methodf  s
   zRequestTests.test_methodc                 C   sL   |  | jj | d| j  d| j_| | jj | d| j  d S )Nr`  rp   ra  )r[   rO  r   r   r  rW   r   r(   r(   r)   	test_datam  s
   zRequestTests.test_datac                 C   sN   |  d| jj | jdd | d| jjd  d| j_|  d| jj d S )NrL  *   rp   )rl  rO  rm  r^   r   r   r   r(   r(   r)   .test_setting_data_should_remove_content_lengthw  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 )NrL  rk   r  )rl  rO  rm  r   r^   r   r   r(   r(   r)   /test_deleting_data_should_remove_content_length  s   z<RequestTests.test_deleting_data_should_remove_content_lengthc                 C   s   |  d| j  d S )Nr[  )r   rO  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   rO  r   r   r  r(   r(   r)   test_selector  s   zRequestTests.test_selectorc                 C      |  d| jj d S )Nr   )r   rO  r]  r   r(   r(   r)   test_get_type     zRequestTests.test_get_typec                 C   ri  )Nr  )r   rO  r   r   r(   r(   r)   test_get_host  rk  zRequestTests.test_get_hostc                 C      t d}| d|j d S )Nzhttp://www.%70ython.org/r  r   r   r   r  r(   r(   r)   test_get_host_unquote     z"RequestTests.test_get_host_unquotec                 C   sR   |  | j  | jdd | | j  | d| jj | d| jj d S )Nr  r   r  )r[   rO  Z	has_proxyr  rW   r   r  r   r   r(   r(   r)   r    s
   zRequestTests.test_proxyc                 C   rm  )Nz<URL:http://www.python.org>r  rn  r  r(   r(   r)   test_wrapped_url  rp  zRequestTests.test_wrapped_urlc                 C   sL   t d}| d|j t d}| d|j d}t |}| | | d S )N-http://www.python.org/?qs=query#fragment=truez
/?qs=queryzhttp://www.python.org/#fun=truer+   .http://docs.python.org/library/urllib2.html#OK)r   r   r   r  )r!   r_   rS   r(   r(   r)   test_url_fragment  s   zRequestTests.test_url_fragmentc                 C   s0   g d}|D ]}t |}| | |j qd S )N)zhttp://docs.python.orgrs  rr  )r   r   r  r  )r!   r^  rS   r_   r(   r(   r)   test_url_fullurl_get_full_url  s
   z*RequestTests.test_url_fullurl_get_full_urlN)rK   r   rL   r   rZ  ra  rb  rc  re  rf  rg  rh  rj  rl  ro  r  rq  rt  ru  r(   r(   r(   r)   rX  X  s     

rX  __main__)<r6  r  r   Ztest.supportr   r   r   r   r   r   r   r  r  rx  r  Zurllib.requestr.   r   r   r	   r
   r   r   r   urllib.parser   r  Zhttp.clientr   ZTestCaser   rM   r   r   r  r   r   r   r   r   IOBaser   r   r   r   r   r   rG  r   r
  r  r  r  r  r8  r9  r;  rX  rK   mainr(   r(   r(   r)   <module>   sl    $4 ,

-6"          
a