
    0hhaE                    d   S SK r S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJ	r	  S SK J
r
  S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS S	KJrJrJrJrJrJrJrJr  S S
KJr  S SKrS SKr \RB                  " SS9   " S S\ RD                  5      r# " S S\ RD                  5      r$ " S S5      r% " S S5      r& " S S\'5      r( " S S\RR                  5      r* " S S5      r+ " S S5      r, " S S\RZ                  5      r. " S S 5      r/ " S! S"5      r0S# r1S$ r2 " S% S&\Rf                  Rh                  5      r5 " S' S(\Rf                  Rl                  5      r7\8" \ Rr                  S)5      (       a   " S* S+\Rf                  Rt                  5      r; " S, S-\Rf                  Rl                  5      r< " S. S/5      r= " S0 S1\ RD                  5      r>S2 r? " S3 S4\ RD                  \5      r@ " S5 S6\ RD                  \5      rA " S7 S8\ RD                  5      rB\CS9:X  a  \ R                  " 5         gg):    N)support)	os_helper)requires_subprocess)warnings_helper)ExtraAssertions)test_urllib)mock)RequestOpenerDirectorHTTPBasicAuthHandlerHTTPPasswordMgrWithPriorAuth_parse_proxy_proxy_bypass_winreg_override_proxy_bypass_macosx_sysconfAbstractDigestAuthHandler)urlparseT)modulec                   ,    \ rS rSrS rS rS rS rSrg)TrivialTests&   c                    S H  n0 n[        SU-  U5        US	 US:X  am  [        R                  S:X  aY  UR                  S5      UR                  S5      pCU R	                  UR
                  S5        U R	                  UR
                  S5        UR                  5        H:  u  pVU R	                  UR
                  S	U-  U< S
U< SUR
                  < 35        M<     M     g )N)requestresponseparseerrorrobotparserzfrom urllib.%s import *__builtins__r   nturl2pathnamepathname2url
nturl2pathz	urllib.%sz is exposed in 'urllib.z' but defined in )execosnamepopassertEqual
__module__items)selfr   contextupkvs          :/opt/python-3.13.8/usr/lib/python3.13/test/test_urllib2.pytest___all__TrivialTests.test___all__(   s    LFG*V3W='"rww${{>2GKK4O1  |<  |<  {V/C./ ( M    c                 .   U R                  [        R                  R                  5        U R	                  [
        [        R                  R                  S5        [        R                  R                  [        R                  R                  5      R                  [        R                  S5      n[        R                  S:X  a  SU-  nOSU-  n[        R                  R                  U5       nUR                  5         S S S 5        g ! , (       d  f       g = f)Nz	bogus url/r   z
file:///%s	file://%s)
addCleanupurllibr   
urlcleanupassertRaises
ValueErrorurlopenr#   pathabspath__file__replacesepr$   read)r)   fnamefile_urlfs       r/   test_trivialTrivialTests.test_trivial7   s     	112*fnn&<&<kJ  7 78@@M77d?#e+H"U*H^^##H-FFH .--s   ,D
Dc                     S/ SQ4SSS/4S/ SQ4S/ S	Q4/nU H4  u  p#U R                  [        R                  R                  U5      U5        M6     g )
Nza,b,c)abczpath"o,l"og"i"cal, examplezpath"o,l"og"i"calexampleza, b, "c", "d", "e,f", g, h)rH   rI   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&   r7   r   parse_http_list)r)   testsstringlists       r/   test_parse_http_list!TrivialTests.test_parse_http_listJ   sb    o&),?+KL*8://12 "LFV^^;;FCTJ "r2   c                     [         R                  R                  S5      nU R                  UR                  [        U5      5        g )Nreason)r7   r   URLErrorassertInrU   str)r)   errs     r/   test_URLError_reasonstr$TrivialTests.test_URLError_reasonstrU   s,    ll##H-cjj#c(+r2    N)	__name__r'   __qualname____firstlineno__r0   rE   rR   rZ   __static_attributes__r\   r2   r/   r   r   &   s    /&	K,r2   r   c                   ,    \ rS rSrS rS rS rS rSrg)RequestHdrsTestsZ   c                     SnU R                  [        USS0S9R                  S   S5        U R                  [        USS0S9R                  S   S5        g)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
   ri   )r)   urls     r/   test_request_headers_dict*RequestHdrsTests.test_request_headers_dict\   si     #*5v)>##*7;89?	A 	*5v)>##*7;89?	Ar2   c                    Sn[        USS0S9nU R                  UR                  S5      5        U R                  UR	                  5       S/5        UR                  SS5        U R                  [        UR	                  5       5      SS/5        U R                  UR                  S	5      5        U R                  UR                  S	5      5        U R                  UR                  S	S
5      S
5        UR                  S5        U R                  UR                  S5      5        UR                  SS5        U R                  UR                  S5      5        UR                  S5        U R                  UR                  S5      5        g)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
re   rf   rg   rh   )rf   rg   zFoo-Barbaz)zFoo-barrn   z	Not-theredefaultzUnredirected-spamEggsN)r
   
assertTrue
has_headerr&   header_items
add_headersortedassertFalseassertIsNone
get_headerremove_headeradd_unredirected_header)r)   rj   reqs      r/   test_request_headers_methods-RequestHdrsTests.test_request_headers_methodsq   s>    #cK#89{34))+.C-DEy%( 0 0 23,.CD	F45#..56Y?K+&45##$7@':;<-.(;<=r2   c                    [         R                  R                  5       nUR                  nUR                  nU" SSSS5        U" SSSS5        U" SSSS	5        U" SS
SS5        U" SSSS5        U R                  U" SS5      S5        U R                  U" SS5      S5        U R                  U" SS5      S5        U R                  U" SS5      S5        U R                  U" SS5      S5        U R                  U" SS5      S5        U" S	SSS5        U" S	SSS5        U" S	SSS5        U R                  U" S	S5      S5        U R                  U" S	S5      S5        U R                  U" S	S5      S5        U R                  U" S	S5      S5        U R                  U" S	S 5      S5        U R                  U" S	S!5      S"5        U" S	S#S$S%5        U R                  U" S	S&5      S"5        U R                  U" S	S#5      S'5        U R                  U" S	S(5      S'5        U" S)SS*S+5        U" S)SS,S-5        U R                  U" S)S5      S.5        U" S/SS0S/5        U R                  U" S/S5      S15        U R                  U" S/S25      S"5        U R                  U" SS35      S"5        U R                  U" SS45      S55        U R                  U" SS5      S55        U R                  U" SS
5      S65        U R                  U" SS5      S75        g )8Nz
Some Realmhttp://example.com/joepasswordzhttp://example.com/ninizhttp://c.example.com:31283rJ   zd.example.com4dze.example.com:31285eexample.com)r   r   re   zhttp://example.com/spamzhttp://example.com/spam/spamzhttp://example.com/foofoozhttp://example.com/barbarninizhttp://example.com/foo/barfoobarnibar)r   r   )r   r   zhttp://example.com/foo/zhttp://example.com/foo/bazzhttp://example.com/foobarNNzhttp://example.com/baz/rn   nininizhttp://example.com/baz)rn   r   zhttp://example.com/baz/barrI   firstrg   secondspam)r   r   rH   1)r   rH   zhttp://a.example.com/zc.example.comzc.example.com:3128)r   rJ   )r   r   )r   r   r7   r   HTTPPasswordMgradd_passwordfind_user_passwordr&   r)   mgraddfind_user_passs       r/   test_password_manager&RequestHdrsTests.test_password_manager   s`   nn,,.//L/
CL14>L5sC@L/34L.S9 	mD,	.6MN,	.6JK,	.6KL,	.(AC,	. 	(FH,	. 	C)5$7C)5&9C-xA-EF&	(-EF(	*-FG&	(-IJ&	(-IJ&	(-HI%	' 	C*E8<-EF%	'-FG*	,-IJ*	,
 	C&8C&&9-BC+	-
 	C%sC0-BC#	% 	-DE%	'
 	oF%	'6JK#	%<)DE	 	oF#	%6JK#	%r2   c                    [         R                  R                  5       nUR                  nUR                  nU" SSSS5        U" SSSS5        U" S	S
SS5        U" SSSS5        U R                  U" SS5      S5        U R                  U" SS5      S5        U R                  U" SS5      S5        U R                  U" SS5      S5        U R                  U" SS5      S5        U R                  U" SS5      S5        U R                  U" SS5      S5        U R                  U" SS5      S5        U R                  U" SS5      S5        U R                  U" S	S5      S5        U R                  U" S	S
5      S5        U R                  U" S	S5      S5        U R                  U" SS5      S5        U R                  U" SS 5      S5        U R                  U" SS!5      S5        U R                  U" SS"5      S5        g#)$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.
rD   zhttp://g.example.com:8010jrL   zhttp://h.example.com11r-   rM   zi.example.com:8012lizj.example.com13mzg.example.com:100r   zg.example.com:80)r   r   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:80Nr   r   s       r/   "test_password_manager_default_port3RequestHdrsTests.test_password_manager_default_port   s    nn,,.//C*D#6C's3C#T3/C$,-@A%	'-?@$	&_=%	'-GH%	'-FG$	&-CD$	&_={K-?@+N-FG$	&_=|L-?@+N-FG$	&_={K-?@%	'-CD$	&-FG%	'r2   r\   N)	r]   r'   r^   r_   rk   r|   r   r   r`   r\   r2   r/   rb   rb   Z   s    A*">HT%l''r2   rb   c                   @    \ rS rSr/ rS\R                  4S jrS rSr	g)
MockOpeneri  Nc                 .    XUsU l         U l        U l        g N)r{   datatimeout)r)   r{   r   r   s       r/   openMockOpener.open  s    ,/w)$)T\r2   c                      XsU l         U l        g r   )protoargs)r)   r   r   s      r/   r   MockOpener.error  s     %
DIr2   )r   r   r   r{   r   )
r]   r'   r^   r_   
addheaderssocket_GLOBAL_DEFAULT_TIMEOUTr   r   r`   r\   r2   r/   r   r     s    J!6+I+I ?,r2   r   c                   .    \ rS rSrSS jrSS jrS rSrg)MockFilei  Nc                     g r   r\   r)   counts     r/   rA   MockFile.read       r2   c                     g r   r\   r   s     r/   readlineMockFile.readline#  r   r2   c                     g r   r\   r)   s    r/   closeMockFile.close&  r   r2   r\   r   )r]   r'   r^   r_   rA   r   r   r`   r\   r2   r/   r   r     s    r2   r   c                       \ rS rSrS rSrg)MockHeadersi*  c                 4    [        U R                  5       5      $ r   )rQ   values)r)   r$   s     r/   
getheadersMockHeaders.getheaders+  s    DKKM""r2   r\   N)r]   r'   r^   r_   r   r`   r\   r2   r/   r   r   *  s    #r2   r   c                   *    \ rS rSrSS jrS rS rSrg)MockResponse/  Nc                 |    [         R                  R                  X5        XX54u  U l        U l        U l        U l        g r   )ioStringIO__init__codemsgri   rj   )r)   r   r   ri   r   rj   s         r/   r   MockResponse.__init__0  s/    
T(6:6M3	48T\48r2   c                     U R                   $ r   rh   r   s    r/   infoMockResponse.info4  s    ||r2   c                     U R                   $ r   rj   r   s    r/   geturlMockResponse.geturl7      xxr2   )r   ri   r   rj   r   )r]   r'   r^   r_   r   r   r   r`   r\   r2   r/   r   r   /  s    Nr2   r   c                        \ rS rSrS rS rSrg)MockCookieJari;  c                     Xl         g r   )ach_req)r)   r   s     r/   add_cookie_headerMockCookieJar.add_cookie_header<  s    r2   c                      X!sU l         U l        g r   )ec_reqec_r)r)   r   r   s      r/   extract_cookiesMockCookieJar.extract_cookies?  s    !(TYr2   )r   r   r   N)r]   r'   r^   r_   r   r   r`   r\   r2   r/   r   r   ;  s    3r2   r   c                        \ rS rSrS rS rSrg)
FakeMethodiC  c                 (    Xl         X0l        X l        g r   )	meth_namehandleaction)r)   r   r   r   s       r/   r   FakeMethod.__init__D  s    "r2   c                 R    U R                   " U R                  U R                  /UQ76 $ r   )r   r   r   )r)   r   s     r/   __call__FakeMethod.__call__I  s     {{4>>4;;>>>r2   )r   r   r   N)r]   r'   r^   r_   r   r   r`   r\   r2   r/   r   r   C  s    
?r2   r   c                   ,    \ rS rSrS rS rS rS rSrg)MockHTTPResponseiM  c                 B    Xl         X l        X0l        X@l        SU l        g )N   )fpr   statusrU   r   )r)   r   r   r   rU   s        r/   r   MockHTTPResponse.__init__N  s    	r2   c                     g)N r\   r   s    r/   rA   MockHTTPResponse.readU  s    r2   c                     0 $ r   r\   r   s    r/   r   MockHTTPResponse.infoX  s    	r2   c                     U R                   $ r   r   r   s    r/   r   MockHTTPResponse.geturl[  r   r2   )r   r   r   rU   r   N)	r]   r'   r^   r_   r   rA   r   r   r`   r\   r2   r/   r   r   M  s    r2   r   c                   h    \ rS rSrS r\R                  4S jrS rSS jr	SSS.S	 jjr
S
 rS rSrg)MockHTTPClassi_  c                 X    SU l         / U l        S U l        SU l        S U l        0 U l        g )Nr   F)levelreq_headersr   raise_on_endheaderssock_tunnel_headersr   s    r/   r   MockHTTPClass.__init__`  s/    
	#( 	!r2   c                     Xl         X l        U $ r   )hostr   )r)   r  r   s      r/   r   MockHTTPClass.__call__h  s    	r2   c                     Xl         g r   )r  )r)   r  s     r/   set_debuglevelMockHTTPClass.set_debuglevelm  s    
r2   Nc                 l    Xl         X l        U(       a  X0l        g U R                  R                  5         g r   )_tunnel_host_tunnel_portr  clear)r)   r  portri   s       r/   
set_tunnelMockHTTPClass.set_tunnelp  s)      #*   &&(r2   F)encode_chunkedc                    Xl         X l        Ub#  U =R                  UR                  5       -  sl        U R                  R	                  5         U(       a  X0l        XPl        U R                  (       a
  [        5       eg r   )	methodselectorr  r(   sortr   r  r  OSError)r)   r  rj   bodyri   r  s         r/   r   MockHTTPClass.requestx  s^    /I,##)O $r2   c                 .    [        [        5       0 SS5      $ )Nr   OK)r   r   r   s    r/   getresponseMockHTTPClass.getresponse  s    
BT::r2   c                     g r   r\   r   s    r/   r   MockHTTPClass.close  r   r2   )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   r!  r   r`   r\   r2   r/   r  r  _  s8    " &,%C%C 
)$;r2   r  c                   <    \ rS rSrSrS rS rS rS rS r	S r
S	rg
)MockHandleri    c                 &    U R                  U5        g r   )_define_methods)r)   methodss     r/   r   MockHandler.__init__  s    W%r2   c                     U HF  n[        U5      S:X  a  Uu  p4OUS pC[        X4U R                  5      n[        U R                  X55        MH     g )N   )lenr   r   setattr	__class__)r)   r*  specr$   r   meths         r/   r)  MockHandler._define_methods  sE    D4yA~#f#TfdDKK8DDNND/ r2   c                    U R                   R                  R                  XX445        Uc  g US:X  a  U $ US:X  a  [        SS0 S5      nU$ US:X  a  [	        S5      $ UR                  S5      (       aR  X"R                  S	5      S
-   S  n [        U5      n[        SS0 S5      nU R                   R                  SUS   XVS0 5      $ US:X  a  [        R                  R                  S5      eg ! [         a     Nbf = f)Nreturn selfreturn responser   r   r   return requestzhttp://blah/r       httpr   raiserg   )parentcallsappendr   r
   
startswithrfindintr:   r   r7   rV   )r)   fn_namer   r   kwdsresr   s          r/   r   MockHandler.handle  s     $!<=>}$K((sD"b1CJ''>**w'',,s+A-./D4y sD"b1C;;$$VT!WcRHHw,,''// 	  s   C) )
C65C6c                     g r   r\   r   s    r/   r   MockHandler.close  r   r2   c                 2    Xl         / U R                   l        g r   )r<  r=  )r)   r<  s     r/   
add_parentMockHandler.add_parent  s    r2   c                 X    [        US5      (       d  gU R                  UR                  :  $ )Nhandler_orderT)hasattrrL  )r)   others     r/   __lt__MockHandler.__lt__  s)    uo..!!E$7$777r2   )r<  N)r]   r'   r^   r_   rL  r   r)  r   r   rI  rO  r`   r\   r2   r/   r&  r&    s'     M&0.8r2   r&  c                     / nSnU Hg  n " S S[         5      nU" U5      nU=R                  U-  sl        UR                  U 5        US-   nUR                  U5        U R	                  U5        Mi     U$ )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                       \ rS rSrSrg)6add_ordered_mock_handlers.<locals>.MockHandlerSubclassi  r\   Nr]   r'   r^   r_   r`   r\   r2   r/   MockHandlerSubclassrS        r2   rU  r9  )r&  rL  rI  r>  add_handler)opener	meth_spechandlersr   methsrU  rM   s          r/   add_ordered_mock_handlersr\    st    & HE	+ 	  &	5 	V	1  Or2   c                  N    [        5       nU  H  nUR                  U5        M     U$ r   )r   rW  )handler_instancesrX  rM   s      r/   build_test_openerr_    s'    F1 Mr2   c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )MockHTTPHandleri  c                 F   > [         [        U ]  US9  [        5       U l        g )N
debuglevel)superra  r   r  httpconn)r)   rd  r0  s     r/   r   MockHTTPHandler.__init__  s    ot--D%r2   c                 :    U R                  U R                  U5      $ r   do_openrf  r)   r{   s     r/   	http_openMockHTTPHandler.http_open  s    ||DMM3//r2   rf  r   )r]   r'   r^   r_   r   rl  r`   __classcell__r0  s   @r/   ra  ra    s    (0 0r2   ra  c                   &    \ rS rSrS rS rS rSrg)MockHTTPHandlerRedirect  c                 <    Xl         X l        U R                  5         g r   )r   ri   reset)r)   r   ri   s      r/   r    MockHTTPHandlerRedirect.__init__  s    	

r2   c                      SU l         / U l        g )Nr   )_countrequestsr   s    r/   ru  MockHTTPHandlerRedirect.reset  s    r2   c                    SS K nSS KnU R                  R                  UR	                  U5      5        U R
                  S:X  a  U R
                  S-   U l        [        R                  R                  U R                     nUR                  U R                  5      nU R                  R                  SU[        5       U R                  XE5      $ Xl        UR                  S5      n[!        SSUSUR#                  5       5      $ )Nr   r9  r:  

r   r   r   )emailcopyry  r>  deepcopyrx  r:  client	responsesr   message_from_stringri   r<  r   r   r{   r   get_full_url)r)   r{   r}  r~  r$   r   s         r/   rl  !MockHTTPHandlerRedirect.http_open  s    T]]3/0;;!++/DK;;((3D++DLL9C;;$$XZD? ? H++J7CT3C4D4D4FGGr2   )rx  r   ri   r{   ry  Nr]   r'   r^   r_   r   ru  rl  r`   r\   r2   r/   rr  rr    s    
Hr2   rr  HTTPSConnectionc                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )MockHTTPSHandleri  c                 L   > [         [        U ]  XU5        [        5       U l        g r   )re  r  r   r  rf  )r)   rd  r*   check_hostnamer0  s       r/   r   MockHTTPSHandler.__init__  s    "D2:W)ODMr2   c                 :    U R                  U R                  U5      $ r   ri  rk  s     r/   
https_openMockHTTPSHandler.https_open  s    <<s33r2   rn  )NNN)r]   r'   r^   r_   r   r  r`   ro  rp  s   @r/   r  r    s    	,	4 	4r2   r  c                   &    \ rS rSrS rS rS rSrg)MockHTTPHandlerCheckAuthi  c                     Xl         SU l        g NFr   has_auth_header)r)   r   s     r/   r   !MockHTTPHandlerCheckAuth.__init__#  s    	$r2   c                     SU l         g r  )r  r   s    r/   ru  MockHTTPHandlerCheckAuth.reset'  s
    $r2   c                     UR                  S5      (       a  SU l        [        R                  R                  U R
                     n[        U R
                  U[        5       SUR                  5       5      $ )NAuthorizationTr   )	rr   r  r:  r  r  r   r   r   r  )r)   r{   r$   s      r/   rl  "MockHTTPHandlerCheckAuth.http_open*  sS    >>/**#'D {{$$TYY/DIItXZS=M=M=OPPr2   r  Nr  r\   r2   r/   r  r    s    %%Qr2   r  c                        \ rS rSrS rS rSrg)MockPasswordManageri2  c                 4    Xl         X l        X0l        X@l        g r   )realmrj   userr   )r)   r  urir  r   s        r/   r    MockPasswordManager.add_password3  s    
	 r2   c                 J    Xl         X l        U R                  U R                  4$ r   )target_realm
target_urlr  r   )r)   r  authuris      r/   r   &MockPasswordManager.find_user_password9  s     !!yy$--''r2   )r   r  r  r  rj   r  N)r]   r'   r^   r_   r   r   r`   r\   r2   r/   r  r  2  s    !(r2   r  c                   >    \ rS rSrS rS rS rS rS rS r	S r
S	rg
)OpenerDirectorTestsi?  c                 ~     " S S[         5      nU R                  [        [        5       R                  U" 5       5        g )Nc                       \ rS rSrSrg)<OpenerDirectorTests.test_add_non_handler.<locals>.NonHandleriB  r\   NrT  r\   r2   r/   
NonHandlerr  B  rV  r2   r  )objectr9   	TypeErrorr   rW  )r)   r  s     r/   test_add_non_handler(OpenerDirectorTests.test_add_non_handlerA  s/    	 	)(*66
	Fr2   c                     SSK Jn  [        5       nSS/S//n[        X#5        UR	                  [
        R                  R                  5       5        S H"  nU R                  XR                  US-   5        M$     g )Nr   )rV   )rj  r5  )
proxy_openr5  )redirect_requestr5  )doproxyredirectz://example.com/)
urllib.errorrV   r   r\  rW  r7   r   UnknownHandlerr9   r   )r)   rV   orY  schemes        r/   test_badly_named_methods,OpenerDirectorTests.test_badly_named_methodsG  sl     	*')FG01	 	"!/	fnn3356/Fh7H0HI 0r2   c                 P   [        5       n/ SQS/S/S//n[        X5      n[        S5      nUR                  U5      nU R	                  XSS   5        US   S4US   S4/n[        XaR                  5       H/  u  pxUu  ppU R	                  X4U5        U R	                  X45        M1     g )N)rl  ftp_openhttp_error_302r  rl  r5  r   r-  r   rl  )r   r\  r
   r   r&   zipr=  )r)   r  rY  rZ  r{   rr=  expectedgothandlerr$   r   rC  s                r/   test_handled OpenerDirectorTests.test_handled\  s    7L)*)*		 -Q:+,FF3K 	QK(1+{+hqk;-GH 0MH(+%G4g_h7T6* 1r2   c                 v   [        5       n/ nS/S4S/S44 HD  u  p4 " S S[        5      nU" U5      nXFl        UR                  U5        UR	                  U5        MF     UR                  S5        U R                  UR                  S   S   US   5        U R                  UR                  S   S   US   5        g )	Nr  r'  rl  r   c                       \ rS rSrSrg)COpenerDirectorTests.test_handler_order.<locals>.MockHandlerSubclassi{  r\   NrT  r\   r2   r/   rU  r  {  s    r2   rU  r   r9  )r   r&  rL  r>  rW  r   r&   r=  )r)   r  rZ  r[  rL  rU  rM   s          r/   test_handler_order&OpenerDirectorTests.test_handler_orderv  s    'C&Dc%J'2mQ%7%9 Ek  $E*A+OOOAMM!%9 	
$%A4A4r2   c                    [        5       nS/S//n[        X5      n[        S5      nU R                  [        R
                  R                  UR                  U5        U R                  UR                  US   SU40 4/5        g )N)rl  r;  r  r   r   rl  )
r   r\  r
   r9   r7   r   rV   r   r&   r=  )r)   r  rY  rZ  r{   s        r/   
test_raiseOpenerDirectorTests.test_raise  sz    #$)*	 -Q:+,&,,//=HQKsfb#I"JKr2   c                 `   [        5       nS/SS// SQS//n[        X5      n[        S5      nUR                  U5        US   SU44US   SU[        R
                  S	S
0 44/n[        XQR                  5       H4  u  pgUu  pn
U R                  X4US S 5        U R                  XS   5        M6     g )N)rl  z	error 302)http_error_400r;  rl  ))r  r6  http_error_303
http_errorr  r   r   r-  .  r   )	r   r\  r
   r   r   	ALWAYS_EQr  r=  r&   )r)   r  rY  rZ  r{   r=  r  r  r  method_namer   s              r/   test_http_error#OpenerDirectorTests.test_http_error  s     '((+6 	 -Q:+,	s1+{SF31+/))3B79: !0MH)1&G$g3S!W=Tq6* 1r2   c                 d   [        5       nSS/SS//n[        X5      n[        S5      nUR                  U5        US   S4US   S4US   S4US   S4/n[	        UR
                  5       H  u  nu  pxpUS:  aK  U R                  Xx4XV   5        U R                  [        U	5      S5        U R                  U	S   [        5        MZ  U R                  Xx4XV   5        U R                  [        U	5      S5        U R                  U	S   [        5        U	S   c  M  U R                  U	S   [        5        M     g )	N)http_requestr7  )http_responser6  r   r   r  r9  r  r-  )
r   r\  r
   r   	enumerater=  r&   r.  assertIsInstancer   )r)   r  rY  rZ  r{   r=  r   r  r$   r   rC  s              r/   test_processors#OpenerDirectorTests.test_processors  sB   /13/13	 -Q:+,	s a[.)HQK+Ha[/*Xa[/,JL /8.@*A*t1u  '%(;  TA.%%d1gw7   '%(;  TA.%%d1gw7 7&))$q'<@ /Ar2   r\   N)r]   r'   r^   r_   r  r  r  r  r  r  r  r`   r\   r2   r/   r  r  ?  s)    FJ*+45$L+.!Ar2   r  c                     [         R                  R                  U 5      n[        R                  S:X  a  UR                  S5      (       a  USS  nU$ )Nr   z///r-  )r7   r   r    r#   r$   r?  )r<   urlpaths     r/   sanepathname2urlr    sA    nn))$/G	ww$7--e44!"+Nr2   c                      \ rS rSrS rS rS rS rS r\	" 5       S 5       r
S rS	 rS
 rS rS r\R"                  " \" \R(                  S5      S5      S 5       r\R"                  " \" \R(                  S5      S5      S 5       rS rS rS rS rS rS rS rS rS rS r S r!S r"S r#S r$S r%S  r&S! r'S" r(\R"                  " \" \R(                  S5      S5      S# 5       r)\R"                  " \*RV                  S$:H  S%5      S& 5       r,\R"                  " \-R\                  S':H  S(5      S) 5       r/S* r0S+ r1S, r2S- r3S. r4S/ r5S0 r6S1 r7S2 r8S3 r9S4 r:S5r;g6)7HandlerTestsi  c                   ^  " S S5      m " U4S jS[         R                  R                  5      nSS KnSnU" U5      n[	        5       Ul        SSUR                  S	S	S
SS/SS4	SSUR                  SS	S
SS/SS4	SSUR                  SS	S
SS/SS4	SSUR                  SS	S
SS/SS4	SSSS	S	SSS/S	S 4	SSUR                  S	S	S/ SS4	4 GH  u	  pVpxppn[        U5      nS Ul        UR                  U5      nU R                  UR                  U5        U R                  UR                  U	5        U R                  UR                  [        R                  " U5      5        U R                  UR                   U5        U R                  UR"                  U5        U R                  UR$                  R&                  U5        U R                  UR$                  R(                  U
5        UR+                  5       nU R                  UR-                  S5      U5        U R                  [/        US   5      [1        U5      5        UR3                  5         GM     g )Nc                   &    \ rS rSrS rS rS rSrg)-HandlerTests.test_ftp.<locals>.MockFTPWrapperi  c                     Xl         g r   r   r)   r   s     r/   r   6HandlerTests.test_ftp.<locals>.MockFTPWrapper.__init__       	r2   c                     XsU l         U l        [        R                  " U R                  5      [        U R                  5      4$ r   )filenamefiletyper   r   r   r.  )r)   r  r  s      r/   retrfile6HandlerTests.test_ftp.<locals>.MockFTPWrapper.retrfile  s0    /7,t}{{499-s499~==r2   c                     g r   r\   r   s    r/   r   3HandlerTests.test_ftp.<locals>.MockFTPWrapper.close      r2   )r   r  r  N)r]   r'   r^   r_   r   r  r   r`   r\   r2   r/   MockFTPWrapperr    s    !>r2   r  c                   B   > \ rS rSrS r\R                  4U 4S jjrSrg)-HandlerTests.test_ftp.<locals>.NullFTPHandleri  c                     Xl         g r   r  r  s     r/   r   6HandlerTests.test_ftp.<locals>.NullFTPHandler.__init__  r  r2   c                    > XsU l         U l        X4sU l        U l        XPl        T" U R
                  5      U l        U R                  $ r   )r  passwdr  r  dirsr   
ftpwrapper)r)   r  r  r  r  r  r   r  s          r/   connect_ftp9HandlerTests.test_ftp.<locals>.NullFTPHandler.connect_ftp  s>    )-&	4;'+$	49 	"0";&r2   )r   r  r  r  r  r  r  N)	r]   r'   r^   r_   r   r   r   r  r`   )r  s   r/   NullFTPHandlerr    s    ! %+$B$B' 'r2   r   r   zrheum rhaponicumz ftp://localhost/foo/bar/baz.html	localhostr   Ir   r   zbaz.htmlz	text/htmlz'ftp://parrot@localhost/foo/bar/baz.htmlparrotz*ftp://%25parrot@localhost/foo/bar/baz.htmlz%parrotz,ftp://%2542parrot@localhost/foo/bar/baz.htmlz	%42parrotzftp://localhost:80/foo/bar/P   Dzftp://localhost/baz.gif;type=aAzbaz.gifz	image/gifContent-typeContent-length)r7   r   
FTPHandlerftplibr   r<  FTP_PORTr
   r   r  r&   r  r  r  r   gethostbynamer  r  r  r  r  r   getrA  r.  r   )r)   r   r
  r   rM   rj   r  r  r  r  type_r  r  mimetyper{   r  ri   r  s                    @r/   test_ftpHandlerTests.test_ftp  s8   		 		
	'V^^66 
	' 	!4 < 0&//2r3U^Z6 7&//8RU^Z6 :&//9b#U^Z6 <&//;CU^Z6 +"b"cU^R' .&//2r3K)!OJCt6$(( #,CCK

3AQVVT*QXXv.QVVV%9%9$%?@QVVT*QVVT*Q\\22H=Q\\22E:ffhGW[[8(CS)9!:;SYGGGIEOr2   c           	         SS K n[        R                  R                  5       n[	        5       =o2l        [        R                  n[        [        R                  R                  U5      5      nSnSU-  SU-  S[        R                  " S5      < U< 3/n [        R                  " [        R                  " 5       5      nU(       a  UR!                  SU< U< 35        U GH?  n	[#        US5      n
  U
R%                  U5        U
R'                  5         UR)                  [+        U	5      5      n UR-                  5       nUR/                  5       nUR1                  5       nUR'                  5         [        R2                  " U5      nUR4                  R7                  UR8                  S	S
9n[        R:                  " U5        U R=                  X5        U R=                  US   S5        U R=                  US   S5        U R=                  US   U5        U R=                  X5        GMB     SU-  SSS[        R                  " S5      < S[        R>                  " 5       < SU< 3S[        R>                  " 5       < SU< 34 H  n	 [#        US5      n
 U
R%                  U5        U
R'                  5         U RA                  [        RB                  RD                  UR(                  [+        U	5      5        [        R:                  " U5        M     [        R                  R                  5       n[	        5       =o2l        S Hz  u  n	n[+        U	5      n UR)                  U5        U RG                  URH                  U5        U R=                  URJ                  S5        U R=                  URJ                  S:H  U5        M|     g ! [        R                   a    Sn GNf = f! U
R'                  5         f = f! UR'                  5         f = f! [        R:                  " U5        f = f! U
R'                  5         f = f! [        R:                  " U5        f = f! [        RB                  RD                   a    U RM                  U5         Nf = f)Nr   s   hello, world
zfile://localhost%sr5   zfile://r  r   wbT)usegmtr  z
text/plainr  r   zLast-modifiedzfile://localhost:80%szfile:///file_does_not_exist.txtz)file://not-a-local-host.com//dir/file.txtz:80r4   z'file://somerandomhost.ontheinternet.com))zfile://ftp.example.com//foo.txtF)z file://ftp.example.com///foo.txtF)zfile://ftp.example.com/foo.txtF)z"file://somehost//foo/something.txtF)z#file://localhost//foo/something.txtFftp)'email.utilsr7   r   FileHandlerr   r<  r   TESTFNr  r#   r<   r=   r   r  gethostnamegaierrorr>  r   writer   	file_openr
   rA   r   r   statutils
formatdatest_mtimeremover&   getcwdr9   r   rV   assertIsr{   typerv   )r)   r}  rM   r  r  r  towriteurls	localaddrrj   rD   r  r   ri   respurlstatsmodifiedr  r{   s                      r/   	test_fileHandlerTests.test_file  sn   NN&&(!|#H!!"277??6#:;# 7*'!#11+>H
	,,V-?-?-ABI KKG<=CVT"A"GGG$GGIKK-668DffhGhhjGGGI ;;11%..1N		&!T+W^4lCW%56=W_5x@W*/ 4 $g--7#)#7#7#D#%99;8 YY[&"C
"&GGG$GGI!!&,,"7"7"#++ws|= 		&!'* NN&&(!|#HHC #,C2C  aeeS)  51SXX.4y  	I	 GGI GGI 		&!* GGI
 		&!* <<(( &  %&s   )N3 0O*O:,0O%A
O:>P*PAP*Q3OOO""O:%O77O::PP''P**Q/Q76Q7c                    [         R                  R                  5       n[        5       =o!l        SnS GH  u  pE[        X5SS05      nS Ul        UR                  SS5        [        5       nUR                  Xv5      nUR                    UR                    UR                    UR                    UR                  UR                  S:H  S4  UR                  5       n	U	R                     U	R"                    U R%                  UR                  5       U5        U R%                  UR&                  S	5        U R%                  UR(                  S
5        U R%                  UR*                  U5        U R%                  UR,                  S5        U R%                  UR.                  / SQ5        U R%                  UR0                  U5        GM     SWl        U R5                  [         R6                  R8                  UR                  UW5        [        SS5      nU R5                  [:        UR<                  U5        S/Ul        S GH  n[        SU5      n[A        SS0 S5      nUR=                  U5      n
Uc9  U RC                  SURD                  5        U RC                  SURD                  5        O>U R%                  URD                  S   S5        U R%                  URD                  S   S5        U R%                  URD                  S   S	5        U R%                  URD                  S   S5        UR                  SS5        UR                  SS5        UR                  SS5        UR                  SS5        UR=                  U5      n
U R%                  URD                  S   S5        U R%                  URD                  S   S5        U R%                  URD                  S   S5        U R%                  URD                  S   S5        GM     g )Nr   ))GETN)POSTs   blahFoor   Spameggsr   r   r   r   r4   ))
Connectionr   )r0  r   r1  r2  Tbadpostr4  )r2   Nr   r  r  0z!application/x-www-form-urlencodedHostr   rn   )#r7   r   AbstractHTTPHandlerr   r<  r
   r   rz   r  rj  rA   r   r   r   r   r   r  __contains__r&   r  r  r  r  r  r   r  r9   r   rV   r  do_request_r   r   assertNotInunredirected_hdrs)r)   rM   r  rj   r  r   r{   r:  r  hdrsnewreqs              r/   	test_httpHandlerTests.test_httpw  sG   NN..0!|#H#>LF#eU^4CCK''7 ?D		$$A FFAJJFFAHHFFAEESL$&668DHHd''QXXZ-TYY6TZZ+T[[&1T]]C0T--@A TYY-- ?2 $( &,,//D#F +I6)Q]]C8 ))D/6CS$B/A]]3'F|  !133H3HI  1F1FG  !6!67G!H#N  !6!6~!F@B S226:MJS226:FC ''(8%@''>''6''6]]3'FS223CDeLS22>BEJS226:EBS226:EB1 r2   c                 0   [         R                  R                  5       n[        5       =o!l        [
        R                  " SSS9nUR                  nUR                  5         U R                  [        R                  U5        [        US5       n[        SU0 5      nUR                  U5      nUR                  S5      nU R!                  US5        U R#                  UR%                  S5      5        S S S 5        [        US5       n[        SUS	S
05      nUR                  U5      nU R!                  ['        UR                  S5      5      S
5        U R#                  UR%                  S5      5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nzw+bF)modedeleterbr   Transfer-encodingchunkedr  Content-Length   )r7   r   r8  r   r<  tempfileNamedTemporaryFiler$   r   r6   r#   unlinkr   r
   r:  rx   r&   rv   rr   rA  )	r)   rM   r  file_obj	file_pathrD   r{   r>  tes	            r/   test_http_body_file HandlerTests.test_http_body_file  sH    NN..0!|#H..E%HMM			9-)T"a/B7C]]3'F""#67BR+V../?@A # )T"a/5Er4JKC]]3'FS!2!23C!DErJV../BCD	 #" #" #"s   A"E6A+F6
F
Fc                 >   [         R                  R                  5       n[        5       =o!l        [
        R                  " 5       n[        SU0 5      nUR                  U5      nU R                  UR                  S5      S5        U R                  UR                  S5      5        SS0n[        SX65      nUR                  U5      nU R                  [        UR                  S5      5      S5        U R                  UR                  S5      5        UR                  5         g )Nr   rE  rF  r  rG  rH  )r7   r   r8  r   r<  r   BytesIOr
   r:  r&   rx   rv   rr   rA  r   )r)   rM   r  rL  r{   r>  ri   s          r/   test_http_body_fileobj#HandlerTests.test_http_body_fileobj  s     NN..0!|#H::<+Xr:s#**+>?K**+;<=#R(+X?s#V../?@A2F**+>?@r2   c           	      T   [         R                  R                  5       n[        5       =o!l        [
        R                  SS/n0 SS04 H  n[        R                  " U[        R                  S9 n[        SUR                  U5      nUR                  U5      nU(       dC  U R                  UR                  S5      S 5        U R                  UR                  S5      S	5        O*U R                  [        UR                  S5      5      S5        S S S 5        M     g ! , (       d  f       M  = f)
Nz-cpassrG  rH  )stdoutr   r  rE  rF  )r7   r   r8  r   r<  sys
executable
subprocessPopenPIPEr
   rW  r:  r&   rx   rA  )r)   rM   r  cmdri   procr{   r>  s           r/   test_http_body_pipe HandlerTests.test_http_body_pipe  s     NN..0!|#H~~tW-,b11G!!#joo>$3T[['Js+$$V%6%67G%H$O$$V%6%67J%K%.0 $$S):):;K)L%M%') ?> 2>>s   .BD
D'	c                    [         R                  R                  5       n[        5       =o!l        S n0 SS04 H  n[        SU" 5       U5      nUR                  U5      nU(       dD  U R                  UR                  S5      S 5        U R                  UR                  S5      S5        Mq  U R                  [        UR                  S5      5      S5        M     g )Nc               3      #    Sv   g 7f)Ns   oner\   r\   r2   r/   iterable_body;HandlerTests.test_http_body_iterable.<locals>.iterable_body  s
     Ls   rG     r   r  rE  rF  )
r7   r   r8  r   r<  r
   r:  r&   rx   rA  )r)   rM   r  rc  ri   r{   r>  s          r/   test_http_body_iterable$HandlerTests.test_http_body_iterable   s     NN..0!|#H	 ,b11G/'JC]]3'F  !2!23C!DdK  !2!23F!G!*,   V%6%67G%H!I2N 2r2   c                    [         R                  R                  5       n[        5       Ul        UR                  [        SS5      5      nU R                  UR                  S5      S5        U R                  UR                  S5      5        g )Nr   r\   rE  rF  r  )r7   r   r8  r   r<  r:  r
   r&   rx   rv   rr   )r)   rM   r{   s      r/   test_http_body_empty_seq%HandlerTests.test_http_body_empty_seq  se    NN..0<mmG$92>?(;<iH(89:r2   c                 :   [         R                  R                  5       n[        5       =o!l        [
        R
                  " S/ SQ5      n0 SS04 HJ  n[        SX45      nUR                  U5      nU R                  [        UR                  S5      5      S5        ML     g )Nr  )r9  r-        rG     r   r  )r7   r   r8  r   r<  arrayr
   r:  r&   rA  rx   )r)   rM   r  iterable_arrayri   r{   r>  s          r/   test_http_body_array!HandlerTests.test_http_body_array  s     NN..0!|#HS3,b11G/IC]]3'FS!2!23C!DEbI 2r2   c                 N   [         R                  R                  [        R                  R
                  SS5         [        5       n[        5       nUR                  U5        UR                  S5        U R                  UR                  S5        S S S 5        g ! , (       d  f       g = f)Nrd     http://www.example.com)r	   patchr  r:  r  HTTPConnectionr   ra  rW  r   r&   _debuglevelr)   r  rM   s      r/   #test_http_handler_global_debuglevel0HandlerTests.test_http_handler_global_debuglevel)  sl    ZZt{{99<K A!AMM!FF+,Q]]A. LKK   AB
B$c                     [        5       n[        SS9nUR                  U5        UR                  S5        U R	                  UR
                  S5        g )N   rc  ru  )r   ra  rW  r   r&   rx  ry  s      r/   "test_http_handler_local_debuglevel/HandlerTests.test_http_handler_local_debuglevel1  sA    q)	a	'(*r2   r  z)HTTPSConnection required for HTTPS tests.c                 N   [         R                  R                  [        R                  R
                  SS5         [        5       n[        5       nUR                  U5        UR                  S5        U R                  UR                  S5        S S S 5        g ! , (       d  f       g = f)Nrd     https://www.example.com)r	   rv  r  r:  r  r  r   r  rW  r   r&   rx  ry  s      r/   $test_https_handler_global_debuglevel1HandlerTests.test_https_handler_global_debuglevel8  sl    ZZt{{::L!L A "AMM!FF,-Q]]A. MLLr|  c                     [        5       n[        SS9nUR                  U5        UR                  S5        U R	                  UR
                  S5        g )Nrm  rc  r  )r   r  rW  r   r&   rx  ry  s      r/   #test_https_handler_local_debuglevel0HandlerTests.test_https_handler_local_debuglevelA  sA    *	a	()*r2   c                 v   [         R                  R                  5       n[        5       Ul        Sn/ SQnU H  n[        XB5      nUR                  U5      nU R                  UR                  S   S5        UR                  SS 5        UR                  U5      nU R                  UR                  S   S5        M     g )Nr2   )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.htmlr7  r   zsomeproxy:3128)
r7   r   r8  r   r<  r
   r:  r&   r<  	set_proxy)r)   rM   r   ds_urlsds_urlds_req	np_ds_reqp_ds_reqs           r/   test_http_doubleslash"HandlerTests.test_http_doubleslashI  s     NN..0< FV*F f-IY88@-P -t4}}V,HX77?O r2   c                 n   / SQn[        S5      nU H  nX2l        [        U5      nU R                  UR	                  5       U5        U R                  UR
                  =(       d    SUR
                  5        U R                  [        UR	                  5       5      R                  UR                  5        M     g )N)zhttp://example.com?foo=bar#bazz)http://example.com?foo=bar&spam=eggs#bashre   re   r   )r
   full_urlr   r&   r  fragmentquery)r)   r&  r  rj   parseds        r/   test_full_url_setter!HandlerTests.test_full_url_setterd  s    
 ()CJc]FQ^^-s3 QZZ-2v?Xann&67==v||L r2   c                     [        S5      nU?U R                  UR                  5        U R                  UR                  5        U R	                  UR
                  S5        g )Nru  r   )r
   r  rw   r  r&   r  )r)   r  s     r/   test_full_url_deleter"HandlerTests.test_full_url_deleter{  sJ    ,-J!**%!**%R(r2   c                    [         R                  R                  5       n[        5       Ul        Sn[        U5      nUR                  U5      nU R                  UR                  S5        U R                  UR                  S5        Sn[        U5      nUR                  U5      nU R                  UR                  S5        U R                  UR                  S5        g )Nzhttp://www.python.org?getspamwww.python.orgz	/?getspamhttp://www.python.orgr   )
r7   r   r8  r   r<  r
   r:  r&   r  r  )r)   rM   	weird_urlr{   r>  url_without_paths         r/   test_fixpath_in_weirdurls&HandlerTests.test_fixpath_in_weirdurls  s     NN..0<3	i s#&67+62&'s#&67"-r2   c                    [         R                  R                  5       n[        5       =o!l        Sn[        U5      n[        SS0 SU5      nUR                  XE5      nU R                  XV5        U R                  US5        [        SS0 SU5      nUR                  XE5      nU R                  XV5        U R                  US5        [        SS	0 SU5      nUR                  XE5      nU R                  XV5        U R                  US5        [        S
S0 SU5      nU R                  UR                  XE5      5        U R                  UR                  S5        U R                  UR                  XES
S0 45        g )Nr   r   r   r   r      Accepted   zPartial contentrs  zBad gatewayr:  )r7   r   HTTPErrorProcessorr   r<  r
   r   r  r#  assertNotHasAttrrw   r&   r   r   )r)   rM   r  rj   r{   r  newrs          r/   test_errorsHandlerTests.test_errors  s=   NN--/!|#H#cldBC0s&aa)j"b#6s&aa)/R=s&aa)mRS9!//#12&)##}b!ABr2   c                 Z   [        5       n[        R                  R                  U5      n[	        5       Ul        [        S5      n[        SS0 S5      nUR                  U5      nU R                  UR                  U5        U R                  UR                  U5        U R                  UR                  S5        U R                  UR                  5        UR                  X45      nU R                  UR                   U5        U R                  UR"                  U5        U R                  XF5        g )Nr   r   r   r   r   )r   r7   r   HTTPCookieProcessorr   r<  r
   r   r  r#  r   r&   origin_req_hostrv   unverifiabler  r   r   )r)   cjrM   r{   r  r>  r  s          r/   test_cookiesHandlerTests.test_cookies  s    _NN..r2<+,dB+$bjj#&bjj&),,m<))*s&bii%bggq!ar2   c                    SnSn[         R                  R                  5       n[        5       =oCl        S GH  nS GH  n[        USU-  5      n[        X5      n[        R                  Ul	        UR                  SS5        Ub$  UR                  S[        [        U5      5      5        UR                  S	S
5         U" U[        5       US[        SU05      5        U R+                  UR,                  R/                  5       U5         U R+                  UR,                  R1                  5       S5        UR,                  R8                   V
s/ s H  oR;                  5       PM     nn
U R=                  SU5        U R=                  SU5        U R+                  UR,                  R8                  S   S5        U R=                  S	UR,                  R8                  5        U R=                  S	UR,                  R>                  5        GM     GM     [        U5      n[        R                  Ul	        U4S jn[        USS9nSn[        R                  Ul	          U" X8S5        US-   nM  ! [         R                   R"                   a>  n	U R%                  US5        U R'                  U5        U	R)                  5          S n	A	GNS n	A	ff = f! [2         a)    U R5                  UR,                  R6                  5         GNf = fs  sn
f ! [         R                   R"                   aN  n	U R+                  U[         R                  R                  R@                  5        U	R)                  5          S n	A	OS n	A	ff = f[        USS9nSn[        R                  Ul	          U" X8SU-  5        US-   nM  ! [         R                   R"                   aN  n	U R+                  U[         R                  R                  RB                  5        U	R)                  5          S n	A	g S n	A	ff = f)Nhttp://example.com/a.htmlhttp://example.com/b.html)i-  r  r   3  4  )Nz
blah
blah
zhttp_error_%sNonsensezviking=withholdrG  r1  r   Blahlocation)r  r  r.  zcontent-lengthzcontent-typec           
      T    U R                  U[        5       SS[        SU05      5        g )Nr  r  r  )r  r   r   )rM   r{   rj   s      r/   r  ,HandlerTests.test_redirect.<locals>.redirect  s'    S(*c6(*c):;=r2   r   )r  r   r9  r   zhttp://example.com/%d)"r7   r   HTTPRedirectHandlerr   r<  getattrr
   r   r   r   rt   rX   r.  rz   r   r   r   	HTTPErrorrW   assertIsNotNoner   r&   r{   r  
get_methodAttributeErrorrv   r   ri   lowerr;  r<  max_repeatsmax_redirections)r)   from_urlto_urlrM   r  r   r   r  r{   rY   xri   r  r   s                 r/   test_redirectHandlerTests.test_redirect  sG   .,NN..0!|#H ,D, Od$:;h-$<<z+<=#NN#3ST^D++FF; 3
D&&
F';<>   !3!3!5v>1$$QUU%5%5%7? /0eemm<m779m<  !17;  9  z!:!24  7  )@)@A? - ,F h44!' 	= h>44	!67	 K ||--  MM$
3((.IIKK	  & 1$$QUUZZ01
 =6 ||%% 	UFNN$F$F$R$RSIIKK	 h>44	!85!@A	  ||%% 	U#^^??PPRIIKK	sb   :I*J<K2K7 J9;3J44J9</K/.K/7M#AMM#N P:APPc                    Sn/ SQn/ SQnSn[         R                  R                  5       n[        5       =oel        [        U5      n[        R                  Ul        U H  nUS-   U-   n	U R                  [         R                  R                  5       n
UR                  U[        5       SS[        SU	05      5        S S S 5        W
R                  R!                  5         M     U H]  nUS-   U-   nUR                  U[        5       SS	[        SU05      5        U R#                  UR$                  R'                  5       U5        M_     g ! , (       d  f       N= f)
Nr  )r:  httpsr  )fileimapldapzexample.com/b.htmlz://r  zSecurity Loopholer  That's fine)r7   r   r  r   r<  r
   r   r   r   r9   r   r  r  r   r   	exceptionr   r&   r{   r  )r)   r  valid_schemesinvalid_schemesschemeless_urlrM   r  r{   r  invalid_urlcm	valid_urls               r/   test_invalid_redirect"HandlerTests.test_invalid_redirect  s    ..0-NN..0!|#Hh44%F 5.>9K""6<<#9#9:b  S*=[ 9:< ; LL  & $F7IS(*c=Z346QUU//19=	 $ ;:s   )E
E	c           
         SnSn[         R                  R                  5       n[        5       =oCl        [        U5      n[        R                  Ul        [         R                  R                  X5      nUR                  U[        5       SS[        SU05      5        U R                  UR                  R!                  5       U5        g )Nr  z/b.htmlr  r  r  )r7   r   r  r   r<  r
   r   r   r   r   urljoinr  r   r   r&   r{   r  )r)   r  relative_urlrM   r  r{   r  s          r/   test_relative_redirect#HandlerTests.test_relative_redirect$  s    . NN..0!|#Hh44LL((?		hj#}Y/0	2++-y9r2   c                    SSK Jn  SSKJn  U" 5       nU" USS5        [	        SS5      n[
        R                  R                  5       n[
        R                  R                  5       n[
        R                  R                  U5      n[        XEXg5      nUR                  S5        U R                  UR                  R                  S5      5        g )	Nr   )	CookieJar)interact_netscapezhttp://www.example.com/z	spam=eggsr  z%Location: http://www.cracker.com/

Cookie)http.cookiejarr  test.test_http_cookiejarr  rr  r7   r   HTTPDefaultErrorHandlerr  r  r_  r   rv   r{   rr   )	r)   r  r  r  hhhdehhrhcpr  s	            r/   test_cookie_redirect!HandlerTests.test_cookie_redirect1  s    ,>["7E$S*UV~~557nn002^^//3b0	()**845r2   c                 4   Sn[        SSU-   5      n[        R                  R                  5       n[        R                  R	                  5       n[        X#U5      nUR                  S5      nU R                  UR                  5       UR                  5       5        g )Nz(http://www.example.com/index.html#OK

r  z
Location: ru  )
rr  r7   r   r  r  r_  r   r&   r   strip)r)   redirected_urlr  r  r  r  r   s          r/   test_redirect_fragment#HandlerTests.test_redirect_fragment@  sv    G$S,*GH~~557nn002b,VV,-n&:&:&<=r2   c                   ^ ^^ T R                  [        R                  R                  5        [        R
                  R                  mSn[        R                  " U5      [        R
                  l        T R                  [        [        R
                  ST5        [        S5      mUU U4S jnU[        R
                  R                  l        [        R                  R                  S5      nT R                  UR                  5       S5        g )Ns(   HTTP/1.1 302 Found
Location: ?query

rw  )z/pathz/path?queryc                    > TR                  U[        T5      5        TR                  " XU/UQ70 UD6  SU R                  l        g )Ns   HTTP/1.1 200 OK

Hello!)r&   nextr   r0  fakedata)connr  rj   poskw
real_classr)   r&  s        r/   r   3HandlerTests.test_redirect_no_path.<locals>.requestT  s=    S$t*-tS=3="=&FDNN#r2   zhttp://python.org/pathzhttp://python.org/path?query)r6   r7   r   r8   r:  r  rw  r   fakehttpr/  iterr;   r&   r   )r)   	response1r   r   r  r&  s   `   @@r/   test_redirect_no_path"HandlerTests.test_redirect_no_pathI  s     	112[[//
E	%0%9%9)%D".>
K,-	G
 .5""*^^##$<=&DEr2   c                     " S S[         R                  R                  5      nU" 5       n[         R                  R                  U5      nSnU H  u  pVU R	                  [        U5      5         [        R                  " SU-   S-   5      Ul        UR                  S5      nSU-   S-   nUR                  n	U R                  X5        S S S 5        M     g ! , (       d  f       M  = f)	Nc                       \ rS rSrS rSrg)4HandlerTests.test_redirect_encoding.<locals>.Handleri`  c                     U R                  U R                  U5      nU R                  R                  U l        [        R
                  " S5      U l        U$ )Ns)   HTTP/1.1 200 OK
Content-Length: 3

123)rj  
connectionbuflast_bufr   r  )r)   r{   results      r/   rl  >HandlerTests.test_redirect_encoding.<locals>.Handler.http_opena  sE    doos; $ 3 3"-"6"6# r2   )r  r  N)r]   r'   r^   r_   rl  r`   r\   r2   r/   Handlerr  `  s    
r2   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     )r7   r   HTTPHandlerbuild_openersubTestreprr   r  r  r   r  assertStartsWith)
r)   r  r  rX  rO   r  r  r   r  r   s
             r/   test_redirect_encoding#HandlerTests.test_redirect_encoding]  s    	fnn00 	 ),,W5
 #(Xd8n-%0%9%9"$,-0&"
 ";;'<="V+d2!**%%g8 .- #(--s   -AC
C!	c                     SnSn[         R                  R                  5       n[        USS9n[	        5       nUR                  XESS0 U5      nU R                  UR                  5       S5        g )Nr  r  HEADr  r  Found)r7   r   r  r
   r   r  r&   r  )r)   r  r  rM   r{   r   new_reqs          r/   test_redirect_head_request'HandlerTests.test_redirect_head_request  sb    .,NN..0hv.Z$$Sc7BG++-v6r2   c           
         Sn[        US9[        US94 H  n[        5       n[        R                  R	                  U5      nUR                  U5        S//n[        X55      n[        S5      nU R                  UR                  S5        UR                  U5        U R                  UR                  U5        U R                  US   S4/UR                   Vs/ s H  oSS	 PM	     sn5        M     g s  snf )
Nproxy.example.com:3128r:  )HTTP)rl  r6  zhttp://acme.example.com/zacme.example.comr   rl  r-  )dictr   r7   r   ProxyHandlerrW  r\  r
   r&   r  r   r=  )	r)   r+   r   r  phrY  rZ  r{   tups	            r/   
test_proxyHandlerTests.test_proxy  s    $1t|+A A,,Q/BMM"12I 1>H45CSXX'9:FF3KSXXq)x{K8923'':'3!Ah':< , ;s   C/c                 (   U R                  [        R                  " 5       5      nSUS'   [        5       n[        R
                  R                  [        SS95      nUR                  U5        [        S5      nU R                  UR                  S5        UR                  U5        U R                  UR                  S5        [        S5      nU R                  UR                  S5        UR                  U5        U R                  UR                  S5        g )	Nz
python.orgno_proxyproxy.example.comr  zhttp://www.perl.org/www.perl.orgr  r  enterContextr   EnvironmentVarGuardr   r7   r   r  r  rW  r
   r&   r  r   r)   envr  r  r{   s        r/   test_proxy_no_proxy HandlerTests.test_proxy_no_proxy  s    	 = = ?@&J^^((3F)GH	b,->2	s#67-.#34	s#34r2   c                    U R                  [        R                  " 5       5      nSUS'   [        5       n[        R
                  R                  [        SS95      nUR                  U5        [        S5      nU R                  UR                  S5        UR                  U5        U R                  UR                  S5        g )N*r$  r%  r  r  r  r'  r*  s        r/   test_proxy_no_proxy_all$HandlerTests.test_proxy_no_proxy_all  s    	 = = ?@J^^((3F)GH	b-.#34	s#34r2   c           	         [        5       n[        R                  R                  [	        SS95      nUR                  U5        S//n[        X5      n[        S5      nU R                  UR                  S5        UR                  U5        U R                  UR                  S5        U R                  US   S4/UR                   Vs/ s H  ofSS PM	     sn5        g s  snf )	Nr  r  )r  r6  https://www.example.com/www.example.comr   r  r-  )r   r7   r   r  r  rW  r\  r
   r&   r  r   r=  )r)   r  r  rY  rZ  r{   r   s          r/   test_proxy_httpsHandlerTests.test_proxy_https  s    ^^((4L)MN	b./
	 -Q:01#45	s#;<8A;56./gg6gsa(g6	86s   C
c                    [        5       n[        R                  R                  [	        SS95      nUR                  U5        [        5       nUR                  U5        [        S5      nUR                  SS5        UR                  SS5        U R                  UR                  S5        U R                  UR                  5        UR                  U5        U R                  S	UR                  R                   5        U R#                  S
UR                  R                   5        U R%                  UR                  5        U R                  UR                  S5        U R                  UR'                  S5      S5        g )Nr  r3  r4  Proxy-AuthorizationFooBar
User-AgentGrailr5  )r9  r:  )r;  r<  Proxy-authorization)r   r7   r   r  r  rW  r  r
   rt   r&   r  rw   r  r   r;  rf  r  rW   r  rx   )r)   r  r  https_handlerr{   s        r/   $test_proxy_https_proxy_authorization1HandlerTests.test_proxy_https_proxy_authorization  s#   ^^((4L)MN	b(*	m$01,h7|W-#45#**+	s 	:&//;;	=-#,,88	:S--.#;<(=>Ir2   r   zonly relevant for Windowsc                 `   Sn[         nS H  nU R                  U" X15      SU-  5        M      S H  nU R                  U" X15      SU-  5        M      SnU R                  U" SU5      SW-  5        U R                  U" SU5      SU-  5        S	 H  nU R                  U" X15      S
U-  5        M      g )Nz*www.example.com;*.example.net; 192.168.0.1)r5  zwww.example.netz192.168.0.1z expected bypass of %s to be true)r   zwww.example.orgexample.netz192.168.0.2!expected bypass of %s to be Falsezexample.com; <local>r   rB  )testr  z.expect <local> to bypass intranet address '%s')r   rq   rv   )r)   proxy_overrideproxy_bypassr  s       r/   test_winreg_proxy_bypass%HandlerTests.test_winreg_proxy_bypass  s    E4IDOOL>>EG J$D\$?@4GI$ 0]NC:TA	Cm^D<tC	E)DOOL>L"#$ *r2   darwinzonly relevant for OSXc                 |   S/ SQS.nS H!  nU R                  [        X!5      SU-  5        M#     S H!  nU R                  [        X!5      SU-  5        M#     S/ S.nU R                  [        S	U5      5        SS
S/S.nSnU R                  [        X!5      SU-  5        SnU R                  [        X!5      SU-  5        g )NF)foo.barz	*.bar.com	127.0.0.1z10.10z10.0/16)exclude_simple
exceptions)rK  zwww.bar.comrL  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.1notinbypassrC  TrD  z10.0.0.0/40z172.19.10.0/24z172.19.10.5z10.0.1.5)rq   r   rv   )r)   bypassr  s      r/   test_osx_proxy_bypass"HandlerTests.test_osx_proxy_bypass  s     $&
!DOO8F>EG!
D9$G@4GI %);4VVDE $)+;=
 4TB:TA	C5dC;dB	Dr2   c                 l   U R                  X!S9   [        5       n[        5       n[        R                  R                  U5      nSR                  U5      S-   n[        SU5      nUR                  U5        UR                  U5        U R                  X5SX'USS5        S S S 5        g ! , (       d  f       g = f)N)r  ri   z
r|    r  !http://acme.example.com/protected)
r  r   r  r7   r   r   joinrr  rW  _test_basic_auth)r)   ri   r  rX  password_managerauth_handlerr  http_handlers           r/   check_basic_authHandlerTests.check_basic_auth  s    \\\7#%F24!>>>>?OPL;;w'*4D23=L|,|,!!&"'7G"E"EG 877s   BB%%
B3c           
         SnSnSU S3nSU S3nSnSU S3nSU S3SU S3SU S	3U S
U 3U S
U 3U S
U 3U S
U 3U S
U 34 H  nSU 3/nU R                  X5        M     [        R                  " S[        45         SU 3/nU R                  X5        S S S 5        X4/X6/Xc/4 H)  n	U	 V
s/ s H  n
SU
 3PM
     nn
U R                  X5        M+     g ! , (       d  f       ND= fs  sn
f )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, zWWW-Authenticate: zBasic Auth Realm was unquotedzWWW-Authenticate: Basic realm=)r[  r   check_warningsUserWarning)r)   r  realm2basicbasic2other_no_realmdigest	realm_strri   
challenges	challenges              r/   test_basic_authHandlerTests.test_basic_auth%  s   $%wa( **"6( +> ? E7!$E7!$ E7"45 gRx gR'(b(gRx hb 
I ,I;78G!!'1!
& ++-L%0-2 37w?@G!!'13 O
J )34(29 ,I;7(2  4!!'1
3 34s   C1C)
C&c           
      j   [        5       n[        R                  R                  [	        SS95      nUR                  U5        [        5       n[        R                  R                  U5      nSn[        SSU-  5      nUR                  U5        UR                  U5        U R                  XSXVUSS5        g )Nr  r  ACME Networksi  z(Proxy-Authenticate: Basic realm="%s"

r=  z&http://acme.example.com:3128/protected)
r   r7   r   r  r  rW  r  ProxyBasicAuthHandlerrr  rW  )r)   rX  r  rX  rY  r  rZ  s          r/   test_proxy_basic_auth"HandlerTests.test_proxy_basic_authR  s    !^^((3K)LM2.0~~;;<LM.?%GI<(<(f4I#3CF6	 r2   c           
          " S S[         5      n " S S[        R                  R                  5      n " S S[        R                  R                  5      nU" 5       n[        5       nU" U5      nU" U5      nSn[        SS	U-  5      n	UR                  U5        UR                  U5        UR                  U	5        U R                  XGS
XUSS5        U R                  UR                  SS/S-  5        g )Nc                        \ rS rSrS rS rSrg)QHandlerTests.test_basic_and_digest_auth_handlers.<locals>.RecordingOpenerDirectoril  c                 >    [         R                  " U 5        / U l        g r   )r   r   recordedr   s    r/   r   ZHandlerTests.test_basic_and_digest_auth_handlers.<locals>.RecordingOpenerDirector.__init__m  s    ''- "r2   c                 :    U R                   R                  U5        g r   )ru  r>  )r)   r   s     r/   recordXHandlerTests.test_basic_and_digest_auth_handlers.<locals>.RecordingOpenerDirector.recordq  s    $$T*r2   )ru  N)r]   r'   r^   r_   r   rx  r`   r\   r2   r/   RecordingOpenerDirectorrs  l  s    #+r2   rz  c                       \ rS rSrS rSrg)OHandlerTests.test_basic_and_digest_auth_handlers.<locals>.TestDigestAuthHandlerit  c                     U R                   R                  S5        [        R                  R                  R
                  " U /UQ70 UD6  g )Nrf  )r<  rx  r7   r   HTTPDigestAuthHandlerhttp_error_401r)   r   rC  s      r/   r  ^HandlerTests.test_basic_and_digest_auth_handlers.<locals>.TestDigestAuthHandler.http_error_401u  sA    ""8,44CCD L>BLFJLr2   r\   Nr]   r'   r^   r_   r  r`   r\   r2   r/   TestDigestAuthHandlerr|  t  s    Lr2   r  c                       \ rS rSrS rSrg)NHandlerTests.test_basic_and_digest_auth_handlers.<locals>.TestBasicAuthHandleriz  c                     U R                   R                  S5        [        R                  R                  R
                  " U /UQ70 UD6  g )Nrc  )r<  rx  r7   r   r   r  r  s      r/   r  ]HandlerTests.test_basic_and_digest_auth_handlers.<locals>.TestBasicAuthHandler.http_error_401{  sA    ""7+33BB4 K=AKEIKr2   r\   Nr  r\   r2   r/   TestBasicAuthHandlerr  z  s    Kr2   r  rm  rT  &WWW-Authenticate: Basic realm="%s"

r  rU  rf  rc  r-  )r   r7   r   r~  r   r  rr  rW  rW  r&   ru  )
r)   rz  r  r  rX  rX  digest_handlerbasic_handlerr  rZ  s
             r/   #test_basic_and_digest_auth_handlers0HandlerTests.test_basic_and_digest_auth_handlersc  s    	+n 	+	LFNN$H$H 	L	K6>>#F#F 	K )*.0./?@,-=>.=EG=)>*<( 	f_#3CAA	  	8W*=a*?@r2   c                     [        5       n[        R                  R                  S 5      n[	        SS5      nUR                  U5        UR                  U5        U R                  [        UR                  S5        g )NrT  zWWW-Authenticate: Kerberos

ru  )	r   r7   r   r~  rr  rW  r9   r:   r   )r)   rX  digest_auth_handlerrZ  s       r/   $test_unsupported_auth_digest_handler1HandlerTests.test_unsupported_auth_digest_handler  sc    !$nnBB4H.57./<(*fkk3KLr2   c                     [        5       n[        R                  R                  S 5      n[	        SS5      nUR                  U5        UR                  U5        U R                  [        UR                  S5        g )NrT  zWWW-Authenticate: NTLM

ru  )	r   r7   r   r   rr  rW  r9   r:   r   )r)   rX  basic_auth_handlerrZ  s       r/   #test_unsupported_auth_basic_handler0HandlerTests.test_unsupported_auth_basic_handler  sc    !#^^@@F.13-.<(*fkk3KLr2   c	                    SS K n	Su  pUR                  XGX5        U R                  XFR                  5        U R                  XvR                  5        U R                  XR
                  5        U R                  XR                  5        UR                  U5        U R                  UR                  U5        U R                  UR                  U5        U R                  [        UR                  5      S5        U R                  UR                  S   R                  U5      5        [        U
< SU< 3S5      nSU	R                  U5      R!                  5       R#                  5       -   nU R                  UR                  S   R%                  U5      U5        U R                  UR                  S   R&                  U   U5        S =Ul        Ul        UR)                  5         UR                  U5        U R                  [        UR                  5      S5        U R                  UR                  S   R                  U5      5        g )Nr   wilecoyoter-  :asciizBasic r9  )base64r   r&   r  rj   r  r   r   r  r  r.  ry  rv   rr   bytesencodebytesr  decoderx   r<  ru  )r)   rX  rY  auth_headerr  rZ  rX  request_urlprotected_urlr  r  r   userpassauth_hdr_values                 r/   rW  HandlerTests._test_basic_auth  s    	) 	!!%dE 6 67&:&:;445#<#<=K  	)66>)44mD 	\223Q7..q1<<[IJD(3W="x(..0779:..q1<<[I'	)..q1CCKP'	) =A@ 0 9K \223Q7..q1<<[IJr2   c                    Su  pSn[        S5      n[        5       n[        U5      nUR                  S X1USS9  U R	                  UR                  U5      5        U R	                  UR                  US-   5      5        U R                  UR                  US-   5      5        [        5       nUR                  U5        UR                  U5        UR                  U5        U R	                  UR                  5        g )Nr  rU  r   T)is_authenticatedz/nestedplain)r  r   r   r   rq   r  rv   r   rW  r   r  )r)   r  r   r  rZ  pwd_managerauth_prior_handlerrX  s           r/   test_basic_prior_auth_auto_send,HandlerTests.test_basic_prior_auth_auto_send  s     *9/4241+>''+X 	( 	F 	44[AB44[95LMN55kG6KLM!-.<(K  	445r2   c                 ~   Su  pSnSn[        5       n[        U5      nUR                  XCX5        UR                  U5      nU R	                  U5        [        5       nUR                  U5        [        SSS -  5      n	UR                  U	5        UR                  U5        UR                  U5      nU R                  U5        [        S5      n	U R	                  U	R                  5        [        5       nUR                  U5        UR                  U	5        UR                  U5        U R                  U	R                  5        g )Nr  rU  ACMErT  r  r   )r   r   r   r  rv   r   rW  rr  r   rq   r  r  )
r)   r  r   r  r  r  r  is_authrX  rZ  s
             r/   .test_basic_prior_auth_send_after_first_success;HandlerTests.test_basic_prior_auth_send_after_first_success  s    *9241+>''DK..{;!!-..=DF<(K ..{; /4556!-.<( 	K  	445r2   c                    S H  u  pSR                  U5      n[        R                  " UR                  5       U-   5      n[        R
                  R                  5       n[        S5      nSUl        UR                  XF5       nUR                  5         SSS5        U R                  UR                  R                  SR                  U5      5        M     g! , (       d  f       NH= f)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  encoder7   r   r8  r
   r   rj  rA   rq   fakesockclosed)r)   transferr   headerr  r  r{   resps           r/   test_http_closedHandlerTests.test_http_closed  s    !
X
 5;;HEF''$(>?Dnn88:G/*CCK+t		 ,OODMM00188BD!
 ,+s   C
C"	c                    [         R                  " S5      n[        R                  R	                  5       n[        S5      nSUl        U R                  [        R                  R                  5         UR                  X5        SSS5        U R                  UR                  R                  S5        g! , (       d  f       N5= f)z;Test the connection is cleaned up after an invalid responser2   r  NzConnection not closed)r   r  r7   r   r8  r
   r   r9   r:  r  BadStatusLinerj  rq   r  r  )r)   r  r  r{   s       r/   test_invalid_closed HandlerTests.test_invalid_closed"  s    ##C(..446o&t{{889OOD& :,,.EF :9s   0B11
B?r\   N)<r]   r'   r^   r_   r  r+  r?  rO  rS  r   r_  rf  ri  rq  rz  r  unittest
skipUnlessrM  r:  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r,  r0  r6  r?  r#   r$   rG  rX  platformrQ  r[  rj  ro  r  r  r  rW  r  r  r  r  r`   r\   r2   r/   r  r    s   ?BZ5x@CDE2. ) ),O(;J/+ .?@Bmn/ o/ .?@Bmn+ o+P6M.).&C2"KZ>0:6>F(!9F7<$5	58  .?@BmnJ oJ. D*EF$ G$. 13JKD LDBG+2Z "0AdMM#KJ66&6PD"Gr2   r  c                   8    \ rS rSrS rS rS rS rS rS r	Sr
g	)
	MiscTestsi-  c                 b   ^ U R                  [        U4S jUR                   5       5      5        g )Nc              3   B   >#    U  H  nUR                   T:H  v   M     g 7fr   rp  ).0rM   handler_classs     r/   	<genexpr>/MiscTests.opener_has_handler.<locals>.<genexpr>0  s!      6%4 KK=8%4s   )rq   anyrZ  )r)   rX  r  s     `r/   opener_has_handlerMiscTests.opener_has_handler/  s'     6%+__6 6 	7r2   c                     " S S[         R                  R                  5      n " S S[         R                  R                  5      n " S S[         R                  R                  5      n[         R                  R                  nU" X#5      nU R                  XR5        U R                  XS5        U" X#" 5       5      nU R                  XR5        U R                  XS5        U" U5      nU R                  XQ5        U" 5       nU R                  U[         R                  R                  5        U" [         R                  R                  5      nU R                  U[         R                  R                  5        U" [         R                  R                  5       5      nU R                  U[         R                  R                  5         " S S[         R                  R                  5      nU" X5      nU R                  XQ5        U R                  XV5        g )	Nc                       \ rS rSrSrg)2MiscTests.test_build_opener.<locals>.MyHTTPHandleri4  r\   NrT  r\   r2   r/   MyHTTPHandlerr  4  rV  r2   r  c                       \ rS rSrS rSrg)/MiscTests.test_build_opener.<locals>.FooHandleri7  c                     g r   r\   r   s    r/   foo_open8MiscTests.test_build_opener.<locals>.FooHandler.foo_open8  r  r2   r\   N)r]   r'   r^   r_   r  r`   r\   r2   r/   
FooHandlerr  7      r2   r  c                       \ rS rSrS rSrg)/MiscTests.test_build_opener.<locals>.BarHandleri;  c                     g r   r\   r   s    r/   bar_open8MiscTests.test_build_opener.<locals>.BarHandler.bar_open<  r  r2   r\   N)r]   r'   r^   r_   r  r`   r\   r2   r/   
BarHandlerr  ;  r  r2   r  c                       \ rS rSrSrg)7MiscTests.test_build_opener.<locals>.MyOtherHTTPHandleriX  r\   NrT  r\   r2   r/   MyOtherHTTPHandlerr  X  rV  r2   r  )r7   r   r  BaseHandlerr  r  )r)   r  r  r  r  r  r  s          r/   test_build_openerMiscTests.test_build_opener3  s   	FNN66 		33 		33 	 ~~220.. Z\2.. '1 N6>>#=#=>3346>>#=#=>33566>>#=#=>	!;!; 	 ;16r2   c                    SnS=n=p4Sn[         R                  R                  X#XU5      nU R                  US5        U R	                  UR
                  S5        U R                  US5        U R	                  UR                  S5        SUR                  < SUR                  < 3nU R	                  [        U5      U5        SUR                  < SUR                  < S	3nU R	                  [        U5      U5        UR                  5         g)
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: 42rU   ri   zHTTP Error z: z<HTTPError >)r7   r   r  assertHasAttrr&   rU   ri   r   r   rX   r  r   )r)   r   rj   r   r   r=  rY   expected_errmsgs           r/   test_HTTPError_interface"MiscTests.test_HTTPError_interface_  s    
 'd#ll$$S2>3)%=>3	*&:;14377CS?325((CGGDcO4		r2   c                     [         R                  R                  SSSS S 5      nU R                  [	        USS5      S5        U R                  UR                  R                  5       [        5        UR                  5         g )Nrj   i  zMETHOD NOT ALLOWED	__notes__r\   )
r7   r   r  r&   r  r  r   rA   r  r   )r)   r  s     r/   test_gh_98778MiscTests.test_gh_98778r  s[    LL""5#/CT4PK4b9addiik51		r2   c                     / SQnU H   u  p#U R                  [        U5      U5        M"     U R                  [        [        S5      4  g )N)r%  )NNNr%  r  )NNNr  r  r  )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.comr  )z&http://user/name:password@localhost:22)r:  	user/namer   localhost:22)z&http://username:pass/word@localhost:22)r:  username	pass/wordr  )z'http://user/name:pass/word@localhost:22)r:  r  r  r  zfile:/ftp.example.com)r&   r   r9   r:   )r)   parse_proxy_test_casestcr  s       r/   test_parse_proxyMiscTests.test_parse_proxyx  sF    $"
N 3LB\"-x8 3 	*l4KLMr2   c                     [        5       nU R                  [        5       nUR                  S5        S S S 5        U R	                  [        WR                  5      S5        g ! , (       d  f       N4= f)Ninvalidz5Unsupported digest authentication algorithm 'invalid')r   r9   r:   get_algorithm_implsr&   rX   r  )r)   r  excs      r/   test_unsupported_algorithm$MiscTests.test_unsupported_algorithm  sS    +-z*c''	2 +C	
 +*s   A  
A.r\   N)r]   r'   r^   r_   r  r  r  r  r  r  r`   r\   r2   r/   r  r  -  s#    7*7X&+NZ
r2   r  c                   ~    \ rS rSr " S S\5      rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rSrg)RequestTestsi  c                       \ rS rSrSrSrg)RequestTests.PutRequesti  PUTr\   N)r]   r'   r^   r_   r  r`   r\   r2   r/   
PutRequestr    s    r2   r  c                     [        S5      U l        [        SSSS0S9U l        [        SSS9U l        U R	                  S5      U l        U R	                  SSS9U l        g )	Nhttp://www.python.org/~jeremy/r   zX-TestrD  rh   r  r  r/  )r
   r  postheadr  put
force_postr   s    r/   setUpRequestTests.setUp  sf    ;<<"%-v$68	 <VL	??#CD//*J * r2   c                    U R                  SU R                  R                  5       5        U R                  SU R                  R                  5       5        U R                  SU R                  R                  5       5        U R                  SU R
                  R                  5       5        U R                  SU R                  R                  5       5        g )Nr/  r.  r  r  )r&   r  r  r  r  r  r  r   s    r/   test_methodRequestTests.test_method  s    !5!5!78 3 3 56!5!5!78 3 3 56!;!;!=>r2   c                 b   U R                  U R                  R                  5        U R                  SU R                  R	                  5       5        SU R                  l        U R                  U R                  R                  5        U R                  SU R                  R	                  5       5        g )Nr.  r   r/  )rv   r  r   r&   r  rq   r   s    r/   	test_dataRequestTests.test_data  sq    ' 3 3 56&!4!4!67r2   c                 H   U R                  SU R                  R                  5        U R                  R                  SS5        U R	                  SU R                  R                  S   5        SU R                  l        U R                  SU R                  R                  5        g )Nr  *   r   )r;  r  r<  rz   r&   r   r   s    r/   .test_setting_data_should_remove_content_length;RequestTests.test_setting_data_should_remove_content_length  sx    )488+E+EF(()92>TXX778HIJ)488+E+EFr2   c                 `   U R                  SU R                  R                  5        SU R                  l        U R                  R	                  SS5        U R                  SU R                  R                  S   5        U R                  ?U R                  SU R                  R                  5        g )Nr  r   rl  )r;  r  r<  r   rz   r&   r   s    r/   /test_deleting_data_should_remove_content_length<RequestTests.test_deleting_data_should_remove_content_length  s    )488+E+EF(()91=DHH667GHIHHM)488+E+EFr2   c                 X    U R                  SU R                  R                  5       5        g )Nr
  )r&   r  r  r   s    r/   test_get_full_urlRequestTests.test_get_full_url  s#    9..0	2r2   c                     U R                  SU R                  R                  5        [        S5      nU R                  SUR                  5        g )Nz	/~jeremy/zhttp://www.python.org/r4   )r&   r  r  r
   rk  s     r/   test_selectorRequestTests.test_selector  s;    dhh&7&78./cll+r2   c                 P    U R                  SU R                  R                  5        g )Nr:  )r&   r  r$  r   s    r/   test_get_typeRequestTests.test_get_type  s    /r2   c                 P    U R                  SU R                  R                  5        g )Nr  )r&   r  r  r   s    r/   test_get_hostRequestTests.test_get_host  s    )488==9r2   c                 R    [        S5      nU R                  SUR                  5        g )Nzhttp://www.%70ython.org/r  r
   r&   r  rk  s     r/   test_get_host_unquote"RequestTests.test_get_host_unquote  s"    01)3884r2   c                 x   U R                  U R                  R                  5       5        U R                  R                  SS5        U R	                  U R                  R                  5       5        U R                  SU R                  R                  5        U R                  SU R                  R                  5        g )Nr&  r:  r  )rv   r  	has_proxyr  rq   r&   r  r  r   s    r/   r!  RequestTests.test_proxy  s}    ++-.>62**,-)488+C+CD7r2   c                 R    [        S5      nU R                  SUR                  5        g )Nz<URL:http://www.python.org>r  r+  rk  s     r/   test_wrapped_urlRequestTests.test_wrapped_url  s"    34)3884r2   c                     [        S5      nU R                  SUR                  5        [        S5      nU R                  SUR                  5        Sn[        U5      nU R                  UR                  5       U5        g )N-http://www.python.org/?qs=query#fragment=truez
/?qs=queryzhttp://www.python.org/#fun=truer4   .http://docs.python.org/library/urllib2.html#OK)r
   r&   r  r  )r)   r{   rj   s      r/   test_url_fragmentRequestTests.test_url_fragment  si    EFs||478cll+ ?cl))+S1r2   c                     / SQnU H8  n[        U5      nU R                  UR                  5       UR                  5        M:     g )N)zhttp://docs.python.orgr6  r5  )r
   r&   r  r  )r)   r&  rj   r{   s       r/   test_url_fullurl_get_full_url*RequestTests.test_url_fullurl_get_full_url  s<    A C#,CS--/> r2   )r  r  r  r  r  N)r]   r'   r^   r_   r
   r  r  r  r  r  r  r  r"  r%  r(  r,  r!  r2  r7  r:  r`   r\   r2   r/   r  r    sV    W ?8GG2,
0:585	2?r2   r  __main__)Er  rD  r   test.supportr   r   r   test.support.testcaser   r   r	   r#   r   r   ro  rX  rI  rZ  urllib.requestr7   r
   r   r   r   r   r   r   r   urllib.parser   r  http.clientr:  requires_working_socketTestCaser   rb   r   r   r  r   r   r   r   r   IOBaser   r  r&  r\  r_  r   r  ra  r  rr  rM  r  HTTPSHandlerr  r  r  r  r  r  r  r  r]   mainr\   r2   r/   <module>rG     s     " , ( 1   	 	   
   7 7 7
 "     t ,1,8$$ 1,hx'x(( x'v, , #$ #
	2;; 	3 3? ?ryy $* *Z38 38lD0fnn00 0Hfnn88 H8 4;;)**	46>>66 	4Qv~~99 Q&
( 
(NA(++ NAbRG8$$o RGj"
!!? 
D^?8$$ ^?B zMMO r2   