
    0hh                       S SK r S SKrS SKJr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  \R                  rS SKJr  S SKJr  S SKJr  S SKJr  \R,                  " SS	9  \R.                  R1                  \5      r\R.                  R7                  \S
S5      r\R.                  R7                  \S
S5      r\R.                  R7                  \S
S5      rSrSr Sr!Sr"S\!-   S-   r#Sr$Sr%\RL                  r& " S S5      r' " S S\'5      r( " S S\RR                  5      r* " S S\RV                  5      r, " S S\\5      r- " S S \5      r. " S! S"\5      r/ " S# S$\\5      r0 " S% S&\\5      r1 " S' S(\15      r2 " S) S*\15      r3 " S+ S,5      r4 " S- S.\\5      r5 " S/ S0\5      r6 " S1 S2\5      r7 " S3 S4\5      r8 " S5 S6\5      r9 " S7 S8\5      r: " S9 S:\5      r; " S; S<\\5      r<\=S=:X  a  \R|                  " S>S?9  gg)@    N)client
HTTPStatus)mock)support)	os_helper)socket_helper)ExtraAssertionsT)modulecertdatazkeycert.pemzkeycert2.pemzselfsigned_pythontestdotnet.pemz{HTTP/1.1 200 OK
Transfer-Encoding: chunked

a
hello worl
3
d! 
8
and now 
22
for something completely different
s7   hello world! and now for something completely differentz;foo=barz0
0
zX-Dummy: foo
X-Dumm2: bar
c                   Z    \ rS rSr\R
                  SS4S jrS rS
S jrS r	S r
S rS	rg)
FakeSocket7   Nc                     [        U[        5      (       a  UR                  S5      nXl        X l        SU l        SU l        SU l        X0l        X@l	        g )Nascii    r   F)

isinstancestrencodetext	fileclassdatasendall_callsfile_closedhostport)selfr   r   r   r   s        :/opt/python-3.13.8/usr/lib/python3.13/test/test_httplib.py__init__FakeSocket.__init__8   sH    dC  ;;w'D	"	 		r   c                 X    U =R                   S-  sl         U =R                  U-  sl        g )N   )r   r   r   r   s     r   sendallFakeSocket.sendallC   s!    a		T	r   c                     US:w  a  US:w  a  [         R                  " 5       eU R                  U R                  5      U l        U R
                  U R                  l        U R                  $ )Nrrb)r   UnimplementedFileModer   r   file
file_closeclose)r   modebufsizes      r   makefileFakeSocket.makefileG   sK    3;44<..00NN499-	//		yyr   c                     SU l         g )NT)r   r   s    r   r,   FakeSocket.file_closeO   s
    r   c                     g N r3   s    r   r-   FakeSocket.closeR       r   c                     g r6   r7   )r   leveloptnamevalues       r   
setsockoptFakeSocket.setsockoptU   r9   r   )r   r+   r   r   r   r   r   r   r6   )__name__
__module____qualname____firstlineno__ioBytesIOr    r%   r0   r,   r-   r>   __static_attributes__r7   r   r   r   r   7   s+    ')zz4 	 r   r   c                   &    \ rS rSrS rS rS rSrg)EPipeSocketX   c                 :    [         R                  X5        X l        g r6   )r   r    pipe_trigger)r   r   rK   s      r   r    EPipeSocket.__init__Z   s    D'(r   c                     U R                   U;   a  [        [        R                  S5      eU =R                  U-  sl        g )Ngotcha)rK   OSErrorerrnoEPIPEr   r$   s     r   r%   EPipeSocket.sendall_   s/    $%++x00		T	r   c                     g r6   r7   r3   s    r   r-   EPipeSocket.closed   r9   r   )rK   N)r@   rA   rB   rC   r    r%   r-   rF   r7   r   r   rH   rH   X   s    )

r   rH   c                   ,    \ rS rSrSrSS jrSS jrSrg)	NoEOFBytesIOg   zLike BytesIO, but raises AssertionError on EOF.

This is used below to test that http.client doesn't try to read
more from the underlying file than it should.
c                 f    [         R                  R                  X5      nUS:X  a  [        S5      eU$ Nr   zcaller tried to read past EOF)rD   rE   readAssertionError)r   nr   s      r   rZ   NoEOFBytesIO.readm   s,    zzt'3; !@AAr   Nc                 f    [         R                  R                  X5      nUS:X  a  [        S5      eU$ rY   )rD   rE   readliner[   )r   lengthr   s      r   r_   NoEOFBytesIO.readlines   s.    zz""403; !@AAr   r7   r6   )r@   rA   rB   rC   __doc__rZ   r_   rF   r7   r   r   rV   rV   g   s    
r   rV   c                   >   ^  \ rS rSrSrU 4S jrU 4S jrS rSrU =r	$ )FakeSocketHTTPConnectiony   z@HTTPConnection subclass using FakeSocket; counts connect() callsc                 `   > SU l         [        TU ]	  S5        Xl        U R                  U l        g )Nr   example.com)connectionssuperr    fake_socket_argscreate_connection_create_connection)r   args	__class__s     r   r    !FakeSocketHTTPConnection.__init__|   s,    ' $"&"8"8r   c                 J   > U =R                   S-  sl         [        TU ]	  5       $ )z.Count the number of times connect() is invokedr#   )rj   rk   connect)r   rp   s    r   rs    FakeSocketHTTPConnection.connect   s!    Aw  r   c                 &    [        U R                  6 $ r6   )r   rl   )r   poskws      r   rm   *FakeSocketHTTPConnection.create_connection   s    40011r   )rn   rj   rl   )
r@   rA   rB   rC   rd   r    rs   rm   rF   __classcell__)rp   s   @r   rf   rf   y   s    J9!
2 2r   rf   c                   D    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
rg)HeaderTests   c                     " S S[         5      nS H  nS H  n[        R                  " S5      n[        S5      Ul        U" 5       Ul        Sn0 nU(       a  [        [        U5      5      Xc'   UR                  SS	XV5        U R                  UR
                  R                  UR                  5          S
5        M     M     g )Nc                        \ rS rSrS rS rSrg);HeaderTests.test_auto_headers.<locals>.HeaderCountingBuffer   c                     0 U l         g r6   countr3   s    r   r    DHeaderTests.test_auto_headers.<locals>.HeaderCountingBuffer.__init__   s	    
r   c                    UR                  S5      n[        U5      S:  aU  US   R                  S5      R                  5       nU R                  R                  US5        U R                  U==   S-  ss'   [        R                  X5        g )N   :r#   r   r   )splitlendecodelowerr   
setdefaultlistappend)r   itemkvlcKeys       r   r   BHeaderTests.test_auto_headers.<locals>.HeaderCountingBuffer.append   sj    ZZ%r7Q;qELL1779EJJ))%3JJu%*%D'r   r   Nr@   rA   rB   rC   r    r   rF   r7   r   r   HeaderCountingBufferr      s     (r   r   )TF)Content-lengthHostzAccept-encodingri   blahblahblahspamspamspamPOST/r#   )r   r   HTTPConnectionr   sock_bufferr   r   requestassertEqualr   r   )r   r   explicit_headerheaderconnbodyheaderss          r   test_auto_headersHeaderTests.test_auto_headers   s    
	(4 
	(  +OE,,];&~6	35%"&)#d)nGOVS$8  !3!3FLLN!CQG F  +r   c                     " S S[         5      nSnSn[        R                  " X25       H  u  pE[        R                  " S5      n[        S 5      Ul        U" 5       Ul        UR                  USU5        U R                  UR                  R                  SSR                  U5      5        M     S	nU H~  n[        R                  " S5      n[        S 5      Ul        U" 5       Ul        UR                  USS 5        U R                  UR                  R                  S S
R                  U5      5        M     U H~  n[        R                  " S5      n[        S 5      Ul        U" 5       Ul        UR                  USS5        U R                  UR                  R                  SSR                  U5      5        M     [        R                  " Xs5       H~  n[        R                  " S5      n[        S 5      Ul        U" 5       Ul        UR                  USS5        U R                  UR                  R                  SSR                  U5      5        M     g )Nc                        \ rS rSrS rS rSrg)?HeaderTests.test_content_length_0.<locals>.ContentLengthChecker   c                 <    [         R                  U 5        S U l        g r6   )r   r    content_lengthr3   s    r   r    HHeaderTests.test_content_length_0.<locals>.ContentLengthChecker.__init__   s    d#&*#r   c                     UR                  SS5      n[        U5      S:  a/  US   R                  5       S:X  a  US   R                  5       U l        [
        R                  X5        g )Nr   r#   r   s   content-length)r   r   r   stripr   r   r   )r   r   r   s      r   r   FHeaderTests.test_content_length_0.<locals>.ContentLengthChecker.append   sM    ZZa(r7Q;2a5;;=4E#E*,Q%++-D'D'r   )r   Nr   r7   r   r   ContentLengthCheckerr      s    +(r   r   )N )PUTr   PATCHri   r      0z%Header Content-Length incorrect on {})GETCONNECTDELETEHEADOPTIONSTRACEz.Header Content-Length set for empty body on {}r       1)r   	itertoolsproductr   r   r   r   r   r   r   r   formatchain)r   r   bodiesmethods_with_bodymethodr   r   methods_without_bodys           r   test_content_length_0!HeaderTests.test_content_length_0   s   	(4 	( 4%--.?HLF((7D"4(DI/1DLLLd+++T7>>vF I 
 +F((7D"4(DI/1DLLLd+++T@GGO + +F((7D"4(DI/1DLLLb)++T7>>vF +  oo&:NF((7D"4(DI/1DLLLc*++T7>>vF Or   c                 ~   [         R                  " S5      n[        S 5      Ul        UR	                  SS5        UR                  SS5        U R                  SUR                  5        UR                  SS5        U R                  S	UR                  5        UR                  S
S5        U R                  SUR                  5        UR                  SS5        U R                  SUR                  5        UR                  SSS5        U R                  SUR                  5        UR                  SS5        U R                  SUR                  5        UR                  SS5        U R                  SUR                  5        UR                  SS5        U R                  SUR                  5        UR                  SS5        U R                  SUR                  5        UR                  S S!5        U R                  S"UR                  5        UR                  S#S$5        U R                  S%UR                  5        UR                  S&S$5        U R                  S'UR                  5        UR                  S(S$5        U R                  S)UR                  5        UR                  S*S$5        U R                  S+UR                  5        g ),Nri   r   r   r   *   s   Content-length: 42Fooz bar s
   Foo:  bar Barz	baz	s
   Bar: 	baz	AuthorizationzBearer mytokens   Authorization: Bearer mytoken
IterHeaderIterAIterBs   IterHeader: IterA
	IterBLatinHeader   s   LatinHeader: 
Utf8Headers   Às   Utf8Header: Àz
C1-Controls	   nextlines   C1-Control: nextlinezEmbedded-Fold-Spacezis
 alloweds!   Embedded-Fold-Space: is
 allowedzEmbedded-Fold-Tabzis
	alloweds   Embedded-Fold-Tab: is
	allowedz	Key Spacer=   s   Key Space: valuez	KeySpace s   KeySpace : values   NonbreakSpaces   NonbreakSpace: values   NonbreakSpaces   NonbreakSpace: value)r   r   r   r   
putrequest	putheaderassertInr   r   r   s     r   test_putheaderHeaderTests.test_putheader   s   $$]3t$	c"',+T\\:ug&mT\\2ui(ot||4(896E|Wg65t||D}g.*DLL9|[1-t||<|_514<<@,.>?<dllK*,=>;T\\J{G,)4<<8{G,)4<<8+W514<<@+W514<<@r   c                    Sn[         R                  " S5      n[        S5      nX2l        UR	                  SS5        U R                  UR                  U5        Sn[         R                  " S5      n[        S5      nX2l        UR	                  SS5        U R                  UR                  U5        Sn[         R                  " S	5      n[        S5      nX2l        UR	                  SS5        U R                  UR                  U5        S
n[         R                  " S5      n[        S5      nX2l        UR	                  SS5        U R                  UR                  U5        g )NsC   GET /foo HTTP/1.1
Host: [2001::]:81
Accept-Encoding: identity

z[2001::]:81r   r   /foosE   GET /foo HTTP/1.1
Host: [2001:102A::]
Accept-Encoding: identity

z[2001:102A::]s@   GET /foo HTTP/1.1
Host: [fe80::]
Accept-Encoding: identity

z
[fe80::%2]sC   GET /foo HTTP/1.1
Host: [fe80::]:81
Accept-Encoding: identity

z[fe80::%2]:81)r   r   r   r   r   assertStartsWithr   r   expectedr   r   s       r   test_ipv6host_header HeaderTests.test_ipv6host_header  s   8$$]3"~	UF#dii28$$_5"~	UF#dii28$$\2"~	UF#dii28$$_5"~	UF#dii2r   c                     Sn[        U5      n[        R                  " U5      nUR                  5         U R	                  UR                  S5      S5        U R	                  UR                  S5      S5        g )Nz4HTTP/1.1 200 OK
First: val
: nval
Second: val

FirstvalSecond)r   r   HTTPResponsebeginr   	getheaderr   r   r   resps       r   !test_malformed_headers_coped_with-HeaderTests.test_malformed_headers_coped_with/  s\    O$""4(

0%8159r   c           	         S[        [        SS5      5      -   S-   [        [        SS5      5      -   S-   n[        U5      n[        R                  " U5      nUR                  5         U R                  UR                  S5      S	5        U R                  UR                  S   S	5        U R                  UR                  S
5      S5        U R                  UR                  S
   S5        SR                  [        [        [        SS5      5      5      nU R                  UR                  S5      U5        U R                  UR                  S   U5        U R                  UR                  S5      5        U R                  SUR                  5        UR                  S5      UR                  S   4 H9  nU R                  US5        U R                  SU5        U R                  US5        M;     g )Ns0   HTTP/1.1 200 OK
!#$%&'*+-.^_`|~: value
VCHAR: !      s   
obs-text:       sM   
obs-fold: text
 folded with space
	folded with tab
Content-Length: 0

Content-Lengthr   z!#$%&'*+-.^_`|~r=   r   VCHARzobs-textzobs-foldr   z folded with spacezfolded with tab)bytesranger   r   r   r   r   r   msgjoinmapchrassertIsNotNoner   r   assertEndsWith)r   r   r   r   vcharfoldeds         r   test_parse_all_octets!HeaderTests.test_parse_all_octets9  s   uT84569 "%h"789< 	 $""4(

(893?"23S9(9:GD"34g>CtX!6780%8'*E2T^^J78j$((+~~j1488J3GHF!!&&1MM.7(9: Ir   c                 j   [         R                  " S5      n[        S5      Ul        UR	                  SS5        SnU HP  u  p4U R                  X445         U R                  [        S5         UR                  X45        S S S 5        S S S 5        MR     g ! , (       d  f       N= f! , (       d  f       Mu  = f)Nri   r   r   r   ))s   Invalid
Name
   ValidValue)s   InvalidNamer   )s   Invalid
Namer   )s   
InvalidNamer   )s   InvalidNamer   )s   
InvalidNamer   )s    InvalidNamer   )s   	InvalidNamer   )s   Invalid:Namer   )s   :InvalidNamer   )	   ValidNames   Invalid
Value)r   s   InvalidValue)r   s   Invalid
Value)r   s   InvalidValue
)r   s   InvalidValue)r   s   InvalidValue
zInvalid header)	r   r   r   r   r   subTestassertRaisesRegex
ValueErrorr   )r   r   casesnamer=   s        r   test_invalid_headers HeaderTests.test_invalid_headersW  s    $$]3rN	s#
$ !KDtm,++J8HINN4/ J -, !II -,s$   B#+B=B#
B B##
B2	c                    Sn[        U5      n[        R                  " USS9n[        R                  " 5        nUR                  5         S S S 5        WR                  5       R                  5       nU R                  US   S5        U R                  US   S5        U R                  US   S5        U R                  US	   S
5        g ! , (       d  f       N= f)Ns9   HTTP/1.1 200 OK
First: val
Second: val1
Second: val2
r#   )
debuglevelr   zreply: 'HTTP/1.1 200 OK\r\n'zheader: First: val   zheader: Second: val1   zheader: Second: val2)	r   r   r   r   captured_stdoutr   getvalue
splitlinesr   )r   r   r   r   outputliness         r   test_headers_debuglevel#HeaderTests.test_headers_debuglevelu  s      	 $""4A6$$&&JJL '!,,.q#CDq#78q#9:q#9: '&s   C
Cr7   N)r@   rA   rB   rC   r   r   r   r   r   r   r  r  rF   r7   r   r   r{   r{      s0    H:@D AD!3F:;<0<;r   r{   c                       \ rS rSrS rSrg)HttpMethodTestsi  c                     SnU HX  nU R                  [        S5         [        R                  " S5      n[	        S 5      Ul        UR                  USS9  S S S 5        MZ     g ! , (       d  f       Ml  = f)N)	zGETzPOST
zPUT
z
POST
ValuezPOST
HOST:abczGET
rHost:abc
zPOSTRemainder:z
GETHOST:
z
PUTz'method can't contain control charactersri   r   )r   url)r  r  r   r   r   r   r   )r   methodsr   r   s       r   test_invalid_method_names)HttpMethodTests.test_invalid_method_names  so    

 F'' IK,,];&t,	F4	K K K Ks   7A""
A1	r7   N)r@   rA   rB   rC   r  rF   r7   r   r   r  r    s    5r   r  c                   F    \ rS rSrSrS rS rS rS rSS jr	S r
S	 rS
rg)TransferEncodingTest  s   It's just a flesh woundc                 X   [         R                  " S5      n[        S5      Ul        UR	                  SS5        UR                  U R                  5       SS9  U R                  UR                  R                  5      u    p#U R                  U5      nU R                  X0R                  5        g )Nri   r   r   r   T)encode_chunked)r   r   r   r   r   
endheaders
_make_body_parse_requestr   _parse_chunkedr   expected_body)r   r   _r   s       r   test_endheaders_chunked,TransferEncodingTest.test_endheaders_chunked  s    $$]3sO	$)$?((8
1""4(112r   c                 z   [         R                  " S5      n[        S5      Ul        UR	                  SSU R                  5       SS05        U R                  UR                  R                  5      u  p#nU R                  SUR                  5        Vs/ s H  oUR                  5       PM     sn5        U R                  US   S5        U R                  X@R                  5        [         R                  " S5      n[        S5      Ul        UR	                  SSU R                  R                  S5      SS05        U R                  UR                  R                  5      u  p#nU R                  SUR                  5        Vs/ s H  oUR                  5       PM     sn5        U R                  US   S5        U R                  X@R                  5        [         R                  " S5      n[        S5      Ul        UR	                  SSSS	0S
U R                  5       S9  U R                  UR                  R                  5      u  p#nU R                  SU Vs/ s H  oUR                  5       PM     sn5        U R                  US   S	5        U R                  U R                  U5      U R                  5        g s  snf s  snf s  snf )Nri   r   r   r   Transfer-Encodingchunkedcontent-lengthlatin-1zgzip, chunkedT)r   r  r   )r   r   r   r   r   r  r   r   assertNotInkeysr   r   r"  r   r!  r   r   r#  r   r   ks         r   test_explicit_headers*TransferEncodingTest.test_explicit_headers  sD   $$]3sO	 	C*-@),L	N  ..tyy~~>D)w||~+N~!GGI~+NO!45yA112 $$]3sO	C++229= ),	.  ..tyy~~>D)w||~+N~!GGI~+NO!45yA112 $$]3sO	VS(/:" 	 	$  ..tyy~~>D)w+Gw!GGIw+GH!45G,,T2D4F4FG5 ,O ,O ,Hs   J.
<J3
J8
c           	         S H  n[         R                  " S5      n[        S5      Ul        UR	                  SSU R                  US95        U R                  UR                  R                  5      u  p4nU R                  U5      nU R                  XPR                  5        U R                  US   S5        U R                  S	U Vs/ s H  ofR                  5       PM     sn5        M     g s  snf )
N)FTri   r   r   r   )empty_linesr'  r(  r)  )r   r   r   r   r   r  r   r   r!  r   r"  r+  r   )r   r2  r   r#  r   r   r.  s          r   test_request!TransferEncodingTest.test_request  s    )K((7D"3DILLT___EG  $22499>>BA&&t,DT#5#56W%899E -7/K7a	7/KL * 0Ls   C*c                 ~   [         R                  " S5      n[        S5      Ul        UR	                  SSS5        U R                  UR                  R                  5      u  p#nU R                  US   S5        U R                  SU Vs/ s H  oUR                  5       PM     sn5        U R                  US	5        g s  snf )
Nri   r   r   r   r7   r'  r(  r)  s   0

)
r   r   r   r   r   r   r   r   r+  r   r-  s         r   test_empty_body$TransferEncodingTest.test_empty_body  s    $$]3sO	VS"%..tyy~~>D!45yA)w+Gw!GGIw+GH|, ,Hs   B:
c              #      #    U R                   R                  S5      n[        U5       H9  u  p4U(       a  US-  (       a  Sv   U[        U5      S-
  :  a	  US-   v   M5  Uv   M;     g 7f)N    r	  r   r#   )r"  r   	enumerater   )r   r2  r  idxlines        r   r  TransferEncodingTest._make_body  sY     ""((."5)ICsQw	SZ!^#Tk!
 *s   A%A'c                    UR                  S5      nUS   n0 nSnU[        U5      :  a  [        X%   5      S:  a|  X%   R                  S5      u  pgUR                  S5      R                  5       nUR                  S5      R                  5       XF'   US-  nU[        U5      :  a  [        X%   5      S:  a  M|  X4SR	                  X%S-   S  5      4$ )N   
r   r#   r   r*  )r   r   r   r   r   )r   r   r  r   r   r\   keyr   s           r   r   #TransferEncodingTest._parse_request  s    

7#(#e*nUX!2x~~d+HC**Y'--/C::i0668GLFA	 #e*nUX!2 eEFm!<<<r   c                    / n0 nSnUR                  S5      n XTUS-    u  pg[        US5      nUS:X  a  US-  nOCU R                  U[        U5      5        UR	                  U5        US-  nU[        U5      :  a  OMd  SR                  U5      $ )Nr   r?  r	     r#   r   )r   intr   r   r   r   )r   r   r   trailersr\   r  sizechunks           r   r!  #TransferEncodingTest._parse_chunked  s    

7#!A#,KDtR=DqyQT3u:.KKFA 3u:~! $ xx~r   r7   N)F)r@   rA   rB   rC   r"  r$  r/  r3  r6  r  r   r!  rF   r7   r   r   r  r    s-    .M3$HLM -	=r   r  c                   R   \ 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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%S$ r&S% r'S& r(S' r)S( r*S) r+S* r,S+ r-S, r.S- r/S. r0S/ r1S0 r2S1 r3S2 r4S3 r5S4 r6S5 r7S6 r8S7r9g8)9	BasicTesti  c           
      f    U R                  1 Sk[        [        [        S5      5      5      :*  5        g )N>   r  r=   phrasedescription  )
assertTruesetdirr   r3   s    r   &test_dir_with_added_behavior_on_status0BasicTest.test_dir_with_added_behavior_on_status  s#    Bc#jY\oJ^F__`r   c                 l     " S S[         R                  5      n[         R                  " U[        5        g )Nc                   z   \ rS rSrSrSIS jr\S 5       r\S 5       r\S 5       r	\S 5       r
\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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/\/r0S-r1\1r2S.r3S/r4\4r5S0r6S1r7S2r8S3r9\9r:S4r;S5r<S6r=S7r>S8r?S9r@S:rAS;rBS<rCS=rDS>rES?rFS@rGSArHSBrISCrJSDrKSErLSFrMSGrNgH)J;BasicTest.test_simple_httpstatus.<locals>.CheckedHTTPStatusi#  a  HTTP status codes and reason phrases

Status codes from the following RFCs are all observed:

    * RFC 7231: Hypertext Transfer Protocol (HTTP/1.1), obsoletes 2616
    * RFC 6585: Additional HTTP Status Codes
    * RFC 3229: Delta encoding in HTTP
    * RFC 4918: HTTP Extensions for WebDAV, obsoletes 2518
    * RFC 5842: Binding Extensions to WebDAV
    * RFC 7238: Permanent Redirect
    * RFC 2295: Transparent Content Negotiation in HTTP
    * RFC 2774: An HTTP Extension Framework
    * RFC 7725: An HTTP Status Code to Report Legal Obstacles
    * RFC 7540: Hypertext Transfer Protocol Version 2 (HTTP/2)
    * RFC 2324: Hyper Text Coffee Pot Control Protocol (HTCPCP/1.0)
    * RFC 8297: An HTTP Status Code for Indicating Hints
    * RFC 8470: Using Early Data in HTTP
c                 T    [         R                  X5      nXl        X$l        X4l        U$ r6   )rD  __new___value_rL  rM  )clsr=   rL  rM  objs        r   rX  CBasicTest.test_simple_httpstatus.<locals>.CheckedHTTPStatus.__new__6  s$    kk#-##
"-
r   c                 ,    SU s=:*  =(       a    S:*  $ s  $ )Nd      r7   r3   s    r   is_informationalLBasicTest.test_simple_httpstatus.<locals>.CheckedHTTPStatus.is_informational>      d))c))))r   c                 ,    SU s=:*  =(       a    S:*  $ s  $ )N   +  r7   r3   s    r   
is_successFBasicTest.test_simple_httpstatus.<locals>.CheckedHTTPStatus.is_successB  rb  r   c                 ,    SU s=:*  =(       a    S:*  $ s  $ )N,    r7   r3   s    r   is_redirectionJBasicTest.test_simple_httpstatus.<locals>.CheckedHTTPStatus.is_redirectionF  rb  r   c                 ,    SU s=:*  =(       a    S:*  $ s  $ )N    r7   r3   s    r   is_client_errorKBasicTest.test_simple_httpstatus.<locals>.CheckedHTTPStatus.is_client_errorJ  rb  r   c                 ,    SU s=:*  =(       a    S:*  $ s  $ )N  W  r7   r3   s    r   is_server_errorKBasicTest.test_simple_httpstatus.<locals>.CheckedHTTPStatus.is_server_errorN  rb  r   )r^  Continuez!Request received, please continue)e   zSwitching Protocolsz.Switching to new protocol; obey Upgrade header)f   
Processing)rW   zEarly Hints)rd  OKz#Request fulfilled, document follows)   CreatedzDocument created, URL follows)   Acceptedz/Request accepted, processing continues off-line)   zNon-Authoritative InformationzRequest fulfilled from cache)   z
No Contentz"Request fulfilled, nothing follows)   zReset Contentz"Clear input form for further input)   zPartial ContentzPartial content follows)   zMulti-Status)   zAlready Reported)   zIM Used)ri  zMultiple Choicesz,Object has several resources -- see URI list)i-  zMoved Permanently(Object moved permanently -- see URI list)i.  Found(Object moved temporarily -- see URI list)i/  z	See Otherz'Object moved -- see Method and URL list)i0  zNot Modifiedz)Document has not changed since given time)i1  z	Use Proxyz@You must use proxy specified in Location to access this resource)i3  zTemporary Redirectr  )i4  zPermanent Redirectr  )rn  zBad Requestz(Bad request syntax or unsupported method)  Unauthorizedz*No permission -- see authorization schemes)i  zPayment Requiredz"No payment -- see charging schemes)i  	Forbiddenz0Request forbidden -- authorization will not help)rN  	Not FoundzNothing matches the given URI)i  zMethod Not Allowedz-Specified method is invalid for this resource)i  zNot Acceptablez%URI not available in preferred format)i  zProxy Authentication Requiredz7You must authenticate with this proxy before proceeding)i  zRequest Timeoutz"Request timed out; try again later)i  ConflictzRequest conflict)i  Gonez5URI no longer exists and has been permanently removed)i  zLength Requiredz"Client must specify Content-Length)i  zPrecondition Failedz Precondition in headers is false)r  zContent Too LargezContent is too large)i  zURI Too LongzURI is too long)i  zUnsupported Media Typez!Entity body in unsupported format)i  zRange Not SatisfiablezCannot satisfy request range)i  zExpectation Failedz'Expect condition could not be satisfied)i  zI'm a Teapotz5Server refuses to brew coffee because it is a teapot.)i  zMisdirected Requestz(Server is not able to produce a response)i  zUnprocessable Content)i  Locked)i  zFailed Dependency)i  z	Too Early)i  zUpgrade Required)i  zPrecondition Requiredz8The origin server requires the request to be conditional)i  zToo Many RequestszOThe user has sent too many requests in a given amount of time ("rate limiting"))i  zRequest Header Fields Too LargezVThe server is unwilling to process the request because its header fields are too large)i  zUnavailable For Legal ReasonszOThe server is denying access to the resource as a consequence of a legal demand)rs  zInternal Server ErrorzServer got itself in trouble)i  zNot Implementedz&Server does not support this operation)i  zBad Gatewayz+Invalid responses from another server/proxy)i  zService Unavailablez8The server cannot process the request due to a high load)i  zGateway Timeoutz4The gateway server did not receive a timely response)i  zHTTP Version Not SupportedzCannot fulfill request)i  zVariant Also Negotiates)i  zInsufficient Storage)i  zLoop Detected)i  zNot Extended)i  zNetwork Authentication Requiredz7The client needs to authenticate to gain network accessr7   N)r   )Or@   rA   rB   rC   rd   rX  propertyr`  rf  rk  rp  ru  CONTINUESWITCHING_PROTOCOLS
PROCESSINGEARLY_HINTSr{  CREATEDACCEPTEDNON_AUTHORITATIVE_INFORMATION
NO_CONTENTRESET_CONTENTPARTIAL_CONTENTMULTI_STATUSALREADY_REPORTEDIM_USEDMULTIPLE_CHOICESMOVED_PERMANENTLYFOUND	SEE_OTHERNOT_MODIFIED	USE_PROXYTEMPORARY_REDIRECTPERMANENT_REDIRECTBAD_REQUESTUNAUTHORIZEDPAYMENT_REQUIRED	FORBIDDEN	NOT_FOUNDMETHOD_NOT_ALLOWEDNOT_ACCEPTABLEPROXY_AUTHENTICATION_REQUIREDREQUEST_TIMEOUTCONFLICTGONELENGTH_REQUIREDPRECONDITION_FAILEDCONTENT_TOO_LARGEREQUEST_ENTITY_TOO_LARGEURI_TOO_LONGREQUEST_URI_TOO_LONGUNSUPPORTED_MEDIA_TYPERANGE_NOT_SATISFIABLEREQUESTED_RANGE_NOT_SATISFIABLEEXPECTATION_FAILEDIM_A_TEAPOTMISDIRECTED_REQUESTUNPROCESSABLE_CONTENTUNPROCESSABLE_ENTITYLOCKEDFAILED_DEPENDENCY	TOO_EARLYUPGRADE_REQUIREDPRECONDITION_REQUIREDTOO_MANY_REQUESTSREQUEST_HEADER_FIELDS_TOO_LARGEUNAVAILABLE_FOR_LEGAL_REASONSINTERNAL_SERVER_ERRORNOT_IMPLEMENTEDBAD_GATEWAYSERVICE_UNAVAILABLEGATEWAY_TIMEOUTHTTP_VERSION_NOT_SUPPORTEDVARIANT_ALSO_NEGOTIATESINSUFFICIENT_STORAGELOOP_DETECTEDNOT_EXTENDEDNETWORK_AUTHENTICATION_REQUIREDrF   r7   r   r   CheckedHTTPStatusrV  #  s;   $ * * * * * * * * * * LH#F*J,KABEGCH-Q)PJVMOO.L6$G @!<LESI=LTI"<"<<K>L 6DI1I"A9N-K)6O:HID6O#4!('8$CL#/ &5"%0! /D+";IK#<$@!#8 "F 8(I6%L!!</(+-?)
%0!:O?K#LHO**&&D##> 0M.L/K+r   r  )enumIntEnum_test_simple_enumr   )r   r  s     r   test_simple_httpstatus BasicTest.test_simple_httpstatus"  s*    c	K c	KH 	0*=r   c                     [         R                  R                  5        H'  nU R                  US5        U R	                  US5        M)     g)z1Checks that the statuses are in the 100-599 ranger^  rt  N)r   __members__valuesassertGreaterEqualassertLessEqual)r   members     r   test_httpstatus_rangeBasicTest.test_httpstatus_range  s=     !,,335F##FC0  - 6r   c                     Sn[         R                  R                  5        HO  nU HF  u  u  p4n[        X%5      nX2s=::  a  U::  a  O  OU R	                  U5        M5  U R                  U5        MH     MQ     g)z:Checks that the statuses belong to the standard categories)))r^  r_  r`  ))rd  re  rf  ))ri  rj  rk  ))rn  ro  rp  ))rs  rt  ru  N)r   r  r  getattrrO  assertFalse)r   
categoriesr  r   uppercategorycategory_indicators          r   test_httpstatus_category"BasicTest.test_httpstatus_category  sg    

 !,,335F,6(%,V%>"+e+OO$67$$%78 -7 6r   c                    Sn[        U5      n[        R                  " U5      nUR                  5         U R	                  UR                  S5      S5        U R                  UR                  5       5        U R                  UR                  5        U R	                  UR                  5       S5        U R                  UR                  5       5        U R                  UR                  5        UR                  5         U R                  UR                  5        Sn[        U5      n[        R                  " U5      nU R                  [        R                  UR                  5        g )NHTTP/1.1 200 Ok

Textr   r      TextzHTTP/1.1 400.100 Not Ok

Text)r   r   r   r   r   rZ   r  isclosedclosedrO  r-   assertRaisesBadStatusLiner   s       r   test_status_linesBasicTest.test_status_lines  s     -$""4(

1s+)%g.(%

$4$""4(&..

;r   c                 f    [         R                  " S5      nU R                  [        U5      S5        g )Nr   zBadStatusLine("''"))r   r  r   repr)r   excs     r   test_bad_status_reprBasicTest.test_bad_status_repr  s'    ""2&c$=>r   c                    Sn[        U5      n[        R                  " U5      nUR                  5         U R	                  UR                  S5      S5        U R                  UR                  5       5        U R	                  UR                  S5      S5        U R                  UR                  5       5        U R                  UR                  5        UR                  5         U R                  UR                  5        g N*HTTP/1.1 200 Ok
Content-Length: 4

Textr	     Te   xtr   r   r   r   r   rZ   r  r  rO  r  r-   r   s       r   test_partial_readsBasicTest.test_partial_reads  s     B$""4(

1u-)1u-(%

$r   c                    Sn[        U5      n[        R                  " U5      nUR                  5         U R	                  UR                  5       S5        U R                  UR                  5       5        U R	                  UR                  5       S5        U R                  UR                  5       5        U R                  UR                  5        UR                  5         U R                  UR                  5        g )Nz4HTTP/1.1 200 Ok
Content-Length: 13

Text
Anothers   Text
s   Another)r   r   r   r   r   r_   r  r  rZ   rO  r  r-   r   s       r   test_mixed_readsBasicTest.test_mixed_reads
  s     N$""4(

+6)j1(%

$r   c                    Sn[        U5      n[        R                  " U5      nUR                  5         [	        S5      nUR                  U5      nU R                  US5        U R                  [        U5      S5        U R                  UR                  5       5        UR                  U5      nU R                  US5        U R                  [        U5      S5        U R                  UR                  5       5        U R                  UR                  5        UR                  5         U R                  UR                  5        g r  r   r   r   r   	bytearrayreadintor   r   r  r  rO  r  r-   r   r   r   r   br\   s         r   test_partial_readintos BasicTest.test_partial_readintos  s     B$""4(

aLMM!Aq5))MM!Aq5)(%

$r   c                 v   Sn[        U5      n[        R                  " U5      nUR                  5         U R	                  UR                  S5      S5        U R                  UR                  5       5        U R                  UR                  5        UR                  5         U R                  UR                  5        g )Nr  
   r  r   r   r   r   r   rZ   rO  r  r  r  r-   r   s       r   test_partial_reads_past_end%BasicTest.test_partial_reads_past_end-  s    A$""4(

20(%

$r   c                    Sn[        U5      n[        R                  " U5      nUR                  5         [	        S5      nUR                  U5      nU R                  US5        U R                  [        U5      S S S5        U R                  UR                  5       5        U R                  UR                  5        UR                  5         U R                  UR                  5        g )Nr  r     r  )r   r   r   r   r  r  r   r   rO  r  r  r  r-   r  s         r   test_partial_readintos_past_end)BasicTest.test_partial_readintos_past_end9  s    A$""4(

bMMM!Aq"1w/(%

$r   c                 8   Sn[        U5      n[        R                  " U5      nUR                  5         U R	                  UR                  S5      S5        U R                  UR                  5       5        U R	                  UR                  S5      S5        U R	                  UR                  S5      S5        U R                  UR                  5       5        U R                  UR                  5        UR                  5         U R                  UR                  5        g )Nr  r	  r  r  r#   r   r  r   s       r   $test_partial_reads_no_content_length.BasicTest.test_partial_reads_no_content_lengthH  s     -$""4(

1u-)1u-1s+(%

$r   c                 :   Sn[        U5      n[        R                  " U5      nUR                  5         [	        S5      nUR                  U5      nU R                  US5        U R                  [        U5      S5        U R                  UR                  5       5        UR                  U5      nU R                  US5        U R                  [        U5      S5        UR                  U5      nU R                  US5        U R                  UR                  5       5        g )Nr  r	  r  r  r   )r   r   r   r   r  r  r   r   r  r  rO  r  s         r   (test_partial_readintos_no_content_length2BasicTest.test_partial_readintos_no_content_lengthX  s     -$""4(

aLMM!Aq5))MM!Aq5)MM!A(r   c                    Sn[        U5      n[        R                  " U5      nUR                  5         U R	                  UR                  S5      S5        U R                  UR                  5       5        U R	                  UR                  S5      S5        U R	                  UR                  S5      S5        U R                  UR                  5       5        g )N+HTTP/1.1 200 Ok
Content-Length: 10

Textr	  r  r  r#   r   )	r   r   r   r   r   rZ   r  r  rO  r   s       r   "test_partial_reads_incomplete_body,BasicTest.test_partial_reads_incomplete_bodyk  s     C$""4(

1u-)1u-1s+(r   c                    Sn[        U5      n[        R                  " U5      nUR                  5         [	        S5      nUR                  U5      nU R                  US5        U R                  [        U5      S5        U R                  UR                  5       5        UR                  U5      nU R                  US5        U R                  [        U5      S5        UR                  U5      nU R                  US5        U R                  UR                  5       5        U R                  UR                  5        UR                  5         U R                  UR                  5        g )Nr  r	  r  r  r   r  r  s         r   &test_partial_readintos_incomplete_body0BasicTest.test_partial_readintos_incomplete_bodyx  s	    C$""4(

aLMM!Aq5))MM!Aq5)MM!A(%

$r   c                 $   S H2  nU R                  [        R                  [        R                  U5        M4     S HR  u  pn[        R                  " U5      nU R	                  X$R
                  5        U R	                  X4R                  5        MT     g )Nzwww.python.org:abczuser:password@www.python.org)z[fe80::207:e9ff:fe9b]:8000fe80::207:e9ff:fe9bi@  )zwww.python.org:80www.python.orgP   )www.python.org:r%  r&  )r%  r%  r&  )[fe80::207:e9ff:fe9b]r$  r&  )[fe80::207:e9ff:fe9b]:r$  r&  )r  r   
InvalidURLr   r   r   r   r   hphpcs        r   test_host_portBasicTest.test_host_port  sv     IBf//1F1FK IPHB1 %%b)AQ'Q'Pr   c                     SnSn[        U5      n[        R                  " U5      nUR                  5         UR	                  S5      nU R                  XR5        g )NzHTTP/1.1 200 OK
Set-Cookie: Customer="WILE_E_COYOTE"; Version="1"; Path="/acme"
Set-Cookie: Part_Number="Rocket_Launcher_0001"; Version="1"; Path="/acme"

No body
zrCustomer="WILE_E_COYOTE"; Version="1"; Path="/acme", Part_Number="Rocket_Launcher_0001"; Version="1"; Path="/acme"z
Set-Cookie)r   r   r   r   r   r   )r   r   hdrsr(   cookiess         r   test_response_headersBasicTest.test_response_headers  sR    O t"		++l+&r   c                     [        S[        5      n[        R                  " USS9nUR	                  5         UR                  5       (       a  U R                  S5        g g )N*HTTP/1.1 200 OK
Content-Length: 14432

r   r   )Did not expect response from HEAD request)r   rV   r   r   r   rZ   failr   r   r   s      r   test_read_headBasicTest.test_read_head  sR      	
 ""47

99;;IIAB r   c                    [        S[        5      n[        R                  " USS9nUR	                  5         [        S5      nUR                  U5      S:w  a  U R                  S5        U R                  [        U5      S5        g )Nr9  r   r:     r   r;          )
r   rV   r   r   r   r  r  r<  r   r   )r   r   r   r  s       r   test_readinto_headBasicTest.test_readinto_head  sp      	
 ""47

aL==q IIABq9-r   c                    SR                  S [        [        R                  S-   5       5       5      S-   nSU-   n[	        U5      n[        R
                  " U5      nU R                  [        R                  SUR                  5        g )Nr   c              3   ,   #    U  H
  nS U-  v   M     g7f)zHeader%d: fooNr7   ).0is     r   	<genexpr>2BasicTest.test_too_many_headers.<locals>.<genexpr>  s      F'D! .1'Ds   r#   zHTTP/1.1 200 OK
zgot more than \d+ headers)	r   r   r   _MAXHEADERSr   r   r  HTTPExceptionr   )r   r   r   r4  r(   s        r   test_too_many_headersBasicTest.test_too_many_headers  s}    ++ F',V-?-?!-C'DF FHNO%/t"v33;QWW	Fr   c                    Sn[        [        S5       n[        R                  " S5      n[	        U5      nXCl        UR                  SSU5        U R                  UR                  U5        S S S 5        g ! , (       d  f       g = f)Ns_   GET /foo HTTP/1.1
Host: example.com
Accept-Encoding: identity
Transfer-Encoding: chunked

r)   ri   r   r   )	open__file__r   r   r   r   r   r   r   r   r   r   r   r   s        r   test_send_fileBasicTest.test_send_file  sf    
 (D!T((7Dd#DILL-!!$))X6 "!!s   AA33
Bc                    Sn[         R                  " S5      n[        S 5      nX2l        UR	                  U5        U R                  XR                  5        SUl        UR	                  [        R                  " SU5      5        U R                  XR                  5        SUl        UR	                  [        R                  " U5      5        U R                  XR                  5        g )Ns"   this is a test this is only a testri   r   r  )
r   r   r   r   sendr   r   arrayrD   rE   r   s       r   	test_sendBasicTest.test_send  s    8$$]3$			(99-			%++c8,-99-			"**X&'99-r   c                    ^ S m " U4S jS[         R                  5      nSn[        R                  " S5      n[	        S5      nXCl        UR                  U" 5       5        U R                  UR                  U5        g )Nc               3   $   #    Sv   S v   Sv   g 7f)Nr   data_twor7   r7   r   r   r   /BasicTest.test_send_updating_file.<locals>.data  s     LJ   c                   4   > \ rS rSrSr Y " 5       rSS jrSrg)7BasicTest.test_send_updating_file.<locals>.UpdatingFilei  r(   c                 ,    [        U R                  5      $ r6   )nextd)r   	blocksizes     r   rZ   <BasicTest.test_send_updating_file.<locals>.UpdatingFile.read  s    DFF|#r   r7   Nrb   )r@   rA   rB   rC   r.   rc  rZ   rF   )r   s   r   UpdatingFiler`    s    DA$r   rf  s   datari   r   )	rD   
TextIOBaser   r   r   r   rV  r   r   )r   rf  r   r   r   r   s        @r   test_send_updating_file!BasicTest.test_send_updating_file  s_    	
	$2== 	$ $$]3"~			,.!H-r   c                     SnS n[         R                  " S5      n[        S5      nXCl        UR	                  SSU" 5       SS05        U R                  UR                  U5        g )	Nsb   GET /foo HTTP/1.1
Host: example.com
Accept-Encoding: identity
Content-Length: 11

onetwothreec               3   $   #    Sv   Sv   Sv   g 7f)Ns   ones   twos   threer7   r7   r   r   r   &BasicTest.test_send_iter.<locals>.body  s     LLNr^  ri   r   r   r   r   11)r   r   r   r   r   r   r   rR  s        r   test_send_iterBasicTest.test_send_iter  s\    &	
 $$]3"~	UFDF-=t,DEH-r   c                 P   Sn[         R                  " SUS9n[        S5      nX2l        SU-  S-   nUR	                  SS[
        R                  " U5      S	S
05        U R                  UR                  S5        UR                  R                  SS5      S   nU R                  XT5        g)z8Check that request() respects the configured block size.   ri   rd  N   a   br   r   r   9r
     

r#   )r   r   r   r   r   rD   rE   r   r   r   r   )r   rd  r   r   r   r   s         r   test_blocksize_request BasicTest.test_blocksize_request  s    	$$]iH$	)#d*UCH!58H#7NO++Q/yy{A.q1(r   c                    Sn[         R                  " SUS9n[        S5      nX2l        SU-  S-   nUR	                  [
        R                  " U5      5        U R                  UR                  S5        U R                  UR                  U5        g)z5Check that send() respects the configured block size.rq  ri   rr  Nrs  rt  r	  )
r   r   r   r   rV  rD   rE   r   r   r   )r   rd  r   r   r   s        r   test_blocksize_sendBasicTest.test_blocksize_send"  sv    	$$]iH$	)#d*		"**X&'++Q/H-r   c                     [         R                  " S5      n[        S5      Ul        U R	                  [
        5         UR                  SSU5        S S S 5        g ! , (       d  f       g = f)Nri   r   r   test)r   r   r   r   r  	TypeErrorr   r   s     r   test_send_type_errorBasicTest.test_send_type_error-  sG    $$]3rN	y)LL. *))s   A
A'c                 P   [         n[        [        [        -   [        -   5      n[
        R                  " USS9nUR                  5         U R                  UR                  5       U5        UR                  5         S H  nU R                  SUS9   [        [        [        -   [        -   5      n[
        R                  " USS9nUR                  5         U R                  UR                  5        U R                  UR                  U5      U5        UR                  5         S S S 5        M     U R                  S5         [        [        [        -   [        -   5      n[
        R                  " USS9nUR                  5         U R                  UR                  5        U R                  UR                  S5      S5        UR                  5         S S S 5        [        S	S
5       H  n[        [        [        -   [        -   5      n[
        R                  " USS9nUR                  5         U R                  UR                  U5      UR                  U5      -   UR                  5       -   U5        UR                  5         M     S Hl  n[        [        U-   5      n[
        R                  " USS9nUR                  5          UR                  5         U R!                  S5        UR                  5         Mn     g ! , (       d  f       GM  = f! , (       d  f       GN>= f! [
        R"                   aj  nU R                  UR$                  U5        S['        U5      -  nU R                  [)        U5      U5        U R                  [+        U5      U5         S nANS nAff = f! UR                  5         f = f)Nr   r:  )irc   Nz	full read)r\   z	read1(-1)rc   s
   hello worlr#      r   zfoo
IncompleteRead expectedIncompleteRead(%d bytes read))chunked_expectedr   chunked_start
last_chunkchunked_endr   r   r   r   rZ   r-   r   rO  r(  read1r   r<  IncompleteReadpartialr   r  r   )r   r   r   r   r\   xrH  expected_messages           r   test_chunkedBasicTest.test_chunked4  s   #-*4{BC""46

h/

 "AkQ/!-*"<{"JK**4>

-  1x8

 0/ " \\+&mj8;FGD&&tE:DJJLOODLL)TZZ^];JJL ' q"Amj8;FGD&&tE:DJJLTYYq\DIIaL8499;FQJJL  !Ama/0D&&tE:DJJL
		 		34

 !3 0/ '&, (( ;  H5#BS]#R   a*:;  Q)9::	; 

sK   BK-:BL 7LN-
K=	 
LN&A NNNNN%c                    [         n[        U5      n[        S5      n[        [        [
        -   [        -   5      n[        R                  " USS9nUR                  5         UR                  U5      nU R                  US U U5        U R                  Xb5        UR                  5         [        SS5       H  n[        [        [
        -   [        -   5      n[        R                  " USS9nUR                  5         [        U5      nUR                  USU 5      nXR                  XxXh-    5      -  nXR                  XxS  5      -  nU R                  US U U5        U R                  X5        UR                  5         M     S Hm  n	[        [        U	-   5      n[        R                  " USS9nUR                  5          UR                  U5      nU R                  S5        UR                  5         Mo     g ! [        R                    aj  nU R                  UR"                  U5        S	[        U5      -  n
U R                  [%        U5      U
5        U R                  ['        U5      U
5         S nANS nAff = f! UR                  5         f = f)
Nr   r   r:  r#   r  r   r  r  r  )r  r   r  r   r  r  r  r   r   r   r  r   r-   r   
memoryviewr<  r  r  r  r   )r   r   	nexpectedr  r   r   r\   mrH  r  r  s              r   test_readinto_chunkedBasicTest.test_readinto_chunkedg  s   #M	cN-*4{BC""46

MM!:I1&

 q"Amj8;FGD&&tE:DJJL1Aa!f%Aq15z**Aqu%%AQz	]H5Q*JJL  !Ama/0D&&tE:DJJL
MM!$ 		34

 ! (( ;  H5#BS]#R   a*:;  Q)9::	; 

s1   9G0
I10I.A I)$I1)I..I11Jc                    Sn[        U[        -   [        -   5      n[        R                  " USS9nUR                  5         U R                  UR                  5       S5        U R                  UR                  S5        U R                  UR                  S5        U R                  UR                  5       5        U R                  UR                  5        UR                  5         U R                  UR                  5        g )NEHTTP/1.1 200 OK
Transfer-Encoding: chunked

a
hello world
1
d
r   r:  r   rd  r{  )r   r  r  r   r   r   r   rZ   statusreasonrO  r  r  r  r-   )r   r  r   r   s       r   test_chunked_headBasicTest.test_chunked_head  s     	 -*4{BC""47

c*c*d+(%

$r   c                 P   Sn[        U[        -   [        -   5      n[        R                  " USS9nUR                  5         [        S5      nUR                  U5      nU R                  US5        U R                  [        U5      S5        U R                  UR                  S5        U R                  UR                  S5        U R                  UR                  5       5        U R                  UR                  5        UR!                  5         U R                  UR                  5        g )	Nr  r   r:  rA  r   rB  rd  r{  )r   r  r  r   r   r   r  r  r   r   r  r  rO  r  r  r  r-   )r   r  r   r   r  r\   s         r   test_readinto_chunked_head$BasicTest.test_readinto_chunked_head  s     	 -*4{BC""47

aLMM!Aq9-c*d+(%

$r   c                     [        S5      n[        R                  " USS9nUR                  5         U R	                  UR                  5       S5        U R                  UR                  5       5        g )Nz.HTTP/1.1 200 OK
Content-Length: -1

Hello
r   r:     Hello
)r   r   r   r   r   rZ   rO  r  r=  s      r   test_negative_content_length&BasicTest.test_negative_content_length  sS    DF""46

l3(r   c                    [        S5      n[        R                  " USS9nUR                  5          UR	                  5         U R                  S5        g ! [        R                   a{  nU R                  UR                  S5        U R                  [        U5      S5        U R                  [        U5      S5        U R                  UR                  5       5         S nAg S nAff = f)Nz.HTTP/1.1 200 OK
Content-Length: 10

Hello
r   r:  r  r  z-IncompleteRead(7 bytes read, 3 more expected))r   r   r   r   rZ   r<  r  r   r  r  r   rO  r  )r   r   r   rH  s       r   test_incomplete_readBasicTest.test_incomplete_read  s    RS""46


	1IIK II/0 $$ 	-QYY5T!WLNSVLNOODMMO,,	-s   A C#(A1CC#c                 &  ^ [        SS5      n[        R                  " S5      mUTl        U R	                  [
        U4S j5        TR                  5       nU R                  SUR                  5        U R                  SUR                  S5      5        g )NzgHTTP/1.0 401 Authorization Required
Content-type: text/html
WWW-Authenticate: Basic realm="example"
s   Content-Lengthri   c                  *   > T R                  SSS5      $ )Nr   /urlr   )r   )r   s   r   <lambda>&BasicTest.test_epipe.<locals>.<lambda>  s    $,,uff"Er   r  zBasic realm="example"zwww-authenticate)
rH   r   r   r   r  rO   getresponser   r  r   )r   r   r   r   s      @r   
test_epipeBasicTest.test_epipe  s    < 	
 $$]3	'E	G!dkk*2(:;	=r   c                     SSS-  -   S-   n[         R                  " [        U5      5      nU R                  [         R                  [         R
                  4UR                  5        g )NHTTP/1.1 200 Okr.     r   )r   r   r   r  LineTooLongr  r   r   r   r   s      r   test_overflowing_status_line&BasicTest.test_overflowing_status_line  sO     3;.7"":d#346--v/C/CDdjjQr   c                     SSS-  -   S-   n[         R                  " [        U5      5      nU R                  [         R                  UR
                  5        g )NzHTTP/1.1 200 OK
X-Foo: barr(   r  

)r   r   r   r  r  r   r  s      r   test_overflowing_header_line&BasicTest.test_overflowing_header_line  sQ    ;')34 	 "":d#34&,,djj9r   c                 r   SS-  n[         R                  " [        U5      5      nU R                  [         R                  5       nUR                  5         S S S 5        U R                  S[        WR                  5      5        U R                  S[        UR                  5      5        g ! , (       d  f       NY= f)NzHTTP/1.1 100 OK
r
i   zgot more than r   )	r   r   r   r  rL  r   r   r   	exception)r   r   r   cms       r   'test_overflowing_header_limit_after_1001BasicTest.test_overflowing_header_limit_after_100  s     	 "":d#34v334JJL 5 	&BLL(9:iR\\!23 54s   B((
B6c                     SSS-  -   S-   n[         R                  " [        U5      5      nUR                  5         U R	                  [         R
                  UR                  5        g )Nz/HTTP/1.1 200 OK
Transfer-Encoding: chunked

r   r  za
hello world
0

)r   r   r   r   r  r  rZ   r  s      r   test_overflowing_chunked_line'BasicTest.test_overflowing_chunked_line   s\    1Ek 	 "":d#34

&,,dii8r   c                 t   Sn[        U5      n[        R                  " U5      nUR                  5         U R	                  UR                  5       S5        U R                  UR                  5       5        U R                  UR                  5        UR                  5         U R                  UR                  5        g )Nr  r   r  r   s       r   test_early_eofBasicTest.test_early_eof  s}     $""4(

c*(%

$r   c                   ^ [         R                  " S5      nS m " U4S jS[         R                  5      nX!l        [	        S5      Ul        UR                  SS5        U R                  [         R                  UR                  5        U R                  TR                  5        U R                  UR
                  R                  5        g )Nri   c                   "   > \ rS rSrU 4S jrSrg)+BasicTest.test_error_leak.<locals>.Responsei  c                 R   > U m[         R                  R                  " U /UQ70 UD6  g r6   )r   r   r    )r   rv   rw   responses      r   r    4BasicTest.test_error_leak.<locals>.Response.__init__  s&    ##,,T>C>2>r   r7   N)r@   rA   rB   rC   r    rF   )r  s   r   Responser    s    ? ?r   r  zInvalid status liner   r   )r   r   r   response_classr   r   r   r  r  r  rO  r  r   )r   r   r  r  s      @r   test_error_leakBasicTest.test_error_leak  s    $$]3	?v** 	?
 '45	UC &..0@0@A(		--.r   c                    Sn[         S-   n[        [        U-   [        -   [        -   5      n[
        R                  " USS9nUR                  5         U R                  UR                  5       U5        UR                  5         g )Nz3;foo=bar
abc
s   abcr   r:  )r  r   r  last_chunk_extendedr  r   r   r   r   rZ   r-   )r   extrar   r   r   s        r   test_chunked_extension BasicTest.test_chunked_extension)  se    +#f,-%/2EEST""46

h/

r   c                     [         n[        [        [        -   5      n[        R
                  " USS9nUR                  5         U R                  UR                  5       U5        UR                  5         g)z9some servers may serve up a short chunked encoding streamr   r:  N)
r  r   r  r  r   r   r   r   rZ   r-   r   r   r   r   s       r   test_chunked_missing_end"BasicTest.test_chunked_missing_end3  sP    #-*45""46

h/

r   c                 V   [         n[        [        [        -   [        -   [
        -   5      n[        R                  " USS9nUR                  5         U R                  UR                  5       U5        U R                  UR                  R                  5       S5        UR                  5         g)z&See that trailers are read and ignoredr   r:  r   N)r  r   r  r  rE  r  r   r   r   r   rZ   r+   r-   r  s       r   test_chunked_trailersBasicTest.test_chunked_trailers<  su    #-*4x?+MN""46

h/)3/

r   c                 ~   [         nSn[        [        [        -   [        -   [
        -   U-   5      n[        R                  " USS9nUR                  5         U R                  UR                  5       U5        U R                  UR                  R                  5       UR                  S5      5        UR                  5         g)zDCheck that we don't read past the end of the chunked-encoding stream	extradatar   r:  r   N)r  r   r  r  rE  r  r   r   r   r   rZ   r+   r   r-   )r   r   r  r   r   s        r   test_chunked_syncBasicTest.test_chunked_syncG  s    #	-*4x?+MPYYZ""46

h/)9+;+;G+DE

r   c                 ,   SnSn[        SU-   U-   5      n[        R                  " USS9nUR                  5         U R	                  UR                  5       U5        U R	                  UR                  R                  5       U5        UR                  5         g)zBCheck that we don't read past the end of the Content-Length stream	   extradata
   Hello123
'   HTTP/1.1 200 OK
Content-Length: 10

r   r:  N)r   r   r   r   r   rZ   r+   r-   r   r  r   r   r   s        r   test_content_length_sync"BasicTest.test_content_length_syncS  sw     	"JXUXaab""46

h/)95

r   c                 0   SnSn[        SU-   U-   5      n[        R                  " USS9nUR                  5         U R	                  UR                  S5      U/5        U R	                  UR                  R                  5       U5        UR                  5         g Nr  r  r  r   r:  i  )	r   r   r   r   r   	readlinesr+   rZ   r-   r  s        r   test_readlines_content_length'BasicTest.test_readlines_content_length_  s|     	"JXUXaab""46

-z:)95

r   c                 .   SnSn[        SU-   U-   5      n[        R                  " USS9nUR                  5         U R	                  UR                  S5      U5        U R	                  UR                  R                  5       U5        UR                  5         g r  )	r   r   r   r   r   r  r+   rZ   r-   r  s        r   test_read1_content_length#BasicTest.test_read1_content_lengthj  sz     	"JXUXaab""46

D)84)95

r   c                 p   SnSn[        SU-   U-   5      n[        R                  " USS9nUR                  5         U R	                  UR                  S5      U5        U R	                  UR                  S5      S5        U R	                  UR                  R                  5       U5        UR                  5         g )Nr  r  r  r   r:  r  r   )	r   r   r   r   r   r_   r+   rZ   r-   r  s        r   "test_readline_bound_content_length,BasicTest.test_readline_bound_content_lengthu  s     	"JXUXaab""46

r*H5r*C0)95

r   c                 z   SnSn[        SUS-  -   U-   5      n[        R                  " USS9nUR                  5         U R	                  UR                  S5      US-  5        U R	                  UR                  5       U5        U R	                  UR                  R                  5       U5        UR                  5         g )	Nr  r  s'   HTTP/1.1 200 OK
Content-Length: 30

r
  r   r:     r	  )	r   r   r   r   r   r  rZ   r+   r-   r  s        r   test_read1_bound_content_length)BasicTest.test_read1_bound_content_length  s     	"JXVWZWZccd""46

B!4h/)95

r   c                 x  ^^ [         R                  " [        S45      mU R                  TR                  5        S mUU4S jn[
        R                  " US9nUR                  5         U R                  UR                  [        S5      5        [        R                  " TR                  5       6 nUR                  SS5        UR                  5       n U R                  UR                   [        R"                  5        [         R                   " UR%                  5       S9n UR'                  S5        UR)                  5          UR	                  5         UR	                  5         UR                  5         U R                  TS5        g ! UR)                  5         f = f! UR	                  5         UR	                  5         f = f)	Nr   c                  N  > TR                  5       u  pU    U R                  S5       n UR                  5       nUR                  S5      (       d  OM)  U R	                  S5        UR                  5       mS S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nr)   r?  s'   HTTP/1.1 200 Connection established

)acceptr0   r_   rstripr%   rZ   )r   addressreaderr<  resultservs       r   
run_server2BasicTest.test_response_fileno.<locals>.run_server  su    "kkmOTt}}T*f!??,D;;w//  KL +**s#   BAB4B
B	B
B$)targetr#   r   z
dummy:1234)filenos   proxied data
)socketcreate_serverHOST
addCleanupr-   	threadingThreadstartr   floatr   r   getsocknamer   r  r   r  r{  r   r%   detach)r   r  threadr   r  r4  r  r  s         @@r   test_response_filenoBasicTest.test_response_fileno  s2   ##T1I.

#
	' !!4U1X.$$d&6&6&89Y-##%		X__fii8X__%67A		+,
NNJJL!23 
NNJJLs%   AF F .F FF "F9c                      " S S[         R                  5      nU" S5      n[        S5      Ul        UR	                  SS5        g)z^
It should be possible to override the default validation
behavior in putrequest (bpo-38216).
c                       \ rS rSrS rSrg)RBasicTest.test_putrequest_override_domain_validation.<locals>.UnsafeHTTPConnectioni  c                     g r6   r7   r   r  s     r   _validate_pathaBasicTest.test_putrequest_override_domain_validation.<locals>.UnsafeHTTPConnection._validate_path      r   r7   N)r@   rA   rB   rC   r  rF   r7   r   r   UnsafeHTTPConnectionr        r   r  ri   r   r   z/ Nr   r   r   r   r   r   r  r   s      r   *test_putrequest_override_domain_validation4BasicTest.test_putrequest_override_domain_validation  s9    
	6#8#8 	 $M2rN	w'r   c                      " S S[         R                  5      nU" S5      n[        S5      Ul        UR	                  SSSS9  g )	Nc                       \ rS rSrS rSrg)PBasicTest.test_putrequest_override_host_validation.<locals>.UnsafeHTTPConnectioni  c                     g r6   r7   r  s     r   _validate_host_BasicTest.test_putrequest_override_host_validation.<locals>.UnsafeHTTPConnection._validate_host  r  r   r7   N)r@   rA   rB   rC   r   rF   r7   r   r   r  r    r  r   r  zexample.com
r   r   r   r#   )	skip_hostr  r  s      r   (test_putrequest_override_host_validation2BasicTest.test_putrequest_override_host_validation  s@    	6#8#8 	 $$56rN	 	sa0r   c                      " S S[         R                  5      nU" S5      n[        S5      Ul        UR	                  SS5        g)z{
It should be possible to override the default encoding
to transmit bytes in another encoding even if invalid
(bpo-36274).
c                       \ rS rSrS rSrg)IBasicTest.test_putrequest_override_encoding.<locals>.UnsafeHTTPConnectioni  c                 $    UR                  S5      $ )Nutf-8)r   )r   str_urls     r   _encode_requestYBasicTest.test_putrequest_override_encoding.<locals>.UnsafeHTTPConnection._encode_request  s    ~~g..r   r7   N)r@   rA   rB   rC   r+  rF   r7   r   r   r  r'    s    /r   r  ri   r   r   u   /☃Nr  r  s      r   !test_putrequest_override_encoding+BasicTest.test_putrequest_override_encoding  s9    	/6#8#8 	/ $M2rN	v&r   r7   N):r@   rA   rB   rC   rR  r  r  r  r  r  r  r  r	  r  r  r  r  r  r  r0  r6  r>  rC  rM  rS  rX  rh  rn  rw  rz  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-  rF   r7   r   r   rJ  rJ    s   ae>N.9$<*?%%%(
%%% )&)%,("'$C.F7..*. 
)	./1f)V%(%.)1 ="R
:49
%/ 	

		

#4J(	1'r   rJ  c                       \ rS rSrSrSr\\R                  S5      S R                  S5      rSr	S r
S	 rS
 rS rSS jrS rS rS rS rS rSrg)ExtendedReadTesti  z"
Test peek(), read1(), readline()
zOHTTP/1.1 200 OK

hello world!
and now 
for something completely different
foohelloNr   HTTP/1.1 200 OK
Transfer-Encoding: chunked

a
hello worl
3
d!

9
and now 

23
for something completely different

3
foo
0

c                     [        U R                  5      n[        R                  " USS9nUR	                  5         [
        R                  " UR                  5      Ul        X l        g )Nr   r:  )	r   r  r   r   r   rD   BufferedReaderfpr   r=  s      r   setUpExtendedReadTest.setUp  sF    $**%""46

##DGG,	r   c                   ^ U R                   nUR                  R                  mSU4S jjnX!R                  l        / n UR                  S5      nU(       a  U R                  [	        U5      S5        UR                  5       nU R                  [	        U5      [	        U5      5        U R                  XT5        UR                  [	        U5      5      nU R                  Xe5        O!UR                  5       nU R                  U5        UR                  U5        U(       d  OM  U R                  SR                  U5      U R                  5        g )Nc                 4   > T" U 5      nU S:  a  US U  $ US S $ )Nr   r  r7   )r\   r.  oldpeeks     r   mypeek*ExtendedReadTest.test_peek.<locals>.mypeek  s)    
AAv!uSb6Mr   r
  r   r   rb   )r   r5  peekassertGreaterr   r  r   rZ   r   r  r   r   lines_expected)r   r   r;  allr.  p2rb  r:  s          @r   	test_peekExtendedReadTest.test_peek   s    yy'',,	
 		!A""3q61-YY[''BQ8%%b,yyR)  *yy{  &JJt! " 	#(;(;<r   c                 |    U R                   nU R                  U R                   R                  U R                  5        g r6   )r   _verify_readliner_   r?  )r   r   s     r   test_readlineExtendedReadTest.test_readline  s+    yydii00$2E2EFr   c                 b    U R                  U R                  R                  U R                  SS9  g )Nrc   )limit)rE  r   r_   r?  r3   s    r   test_readline_without_limit,ExtendedReadTest.test_readline_without_limit#  s'    dii00$2E2ERPr   c                 @   / n U" U5      nU(       a'  US:w  a!  [        U5      S:  a  U R                  US5        UR                  U5        U(       d  OMQ  U R                  SR	                  U5      U5        U R                  U R                  R                  5       5        g )N   foorA     
r   )r   r   r   r   r   rO  r   r  )r   r_   r   rI  r@  r<  s         r   rE  !ExtendedReadTest._verify_readline&  s    E?Dt9q=''e4JJt  	#1		**,-r   c                    ^ ^ T R                   mUU 4S jn[        U5      nT R                  UR                  T R                  5        g )Nc                  `   > TR                  S5      n TR                  [        U 5      S5        U $ )Nr  )r  r  r   )resr   r   s    r   r(   &ExtendedReadTest.test_read1.<locals>.r6  s)    **Q-C  S1-Jr   )r   	ReadlinerrE  r_   r?  )r   r(   	readlinerr   s   `  @r   
test_read1ExtendedReadTest.test_read14  s8    yy	 aL	i00$2E2EFr   c                    U R                   n/ n UR                  5       nU(       d  OUR                  U5        M+  U R                  SR	                  U5      U R
                  5        U R                  UR                  5       5        g Nr   )r   r  r   r   r   r?  rO  r  r   r   r@  r   s       r   test_read1_unbounded%ExtendedReadTest.test_read1_unbounded=  sg    yy::<DJJt	 
 	#(;(;<(r   c                 D   U R                   n/ n UR                  S5      nU(       d  O.U R                  [        U5      S5        UR	                  U5        MG  U R                  SR                  U5      U R                  5        U R                  UR                  5       5        g )Nr  r   )
r   r  r  r   r   r   r   r?  rO  r  rZ  s       r   test_read1_bounded#ExtendedReadTest.test_read1_boundedH  s}    yy::b>D  TB/JJt  	#(;(;<(r   c                     U R                  U R                  R                  S5      S5        U R                  U R                  R	                  5       5        g )Nr   r   )r   r   r  r  r  r3   s    r   test_read1_0ExtendedReadTest.test_read1_0T  s:    +S1++-.r   c                 p    U R                   R                  S5      nU R                  S[        U5      5        g Nr   )r   r=  r  r   )r   r.  s     r   test_peek_0ExtendedReadTest.test_peek_0X  s(    IINN1QA'r   r   )rA  )r@   rA   rB   rC   rd   r  findr   r?  lines_chunkedr6  rB  rF  rJ  rE  rV  r[  r^  ra  re  rF   r7   r   r   r0  r0    ss    	 
 5::g./077@N	 "=>GQ.G	)
)/(r   r0  c                   v    \ rS rSr\R
                  R                  SS5      u  rr\S\	" \5       S3-   \-   rSr
g)"ExtendedReadTestContentLengthKnowni]  r  r#   z
Content-Length: r7   N)r@   rA   rB   rC   r0  r  r   _header_bodyr   rF   r7   r   r   rk  rk  ]  s;    %++11*a@NGU,SZLAAEIEr   rk  c                       \ rS rSrSrSrSrg)ExtendedReadTestChunkedib  z2
Test peek(), read1(), readline() in chunked mode
r2  r7   N)r@   rA   rB   rC   rd   r  rF   r7   r   r   ro  ro  b  s    	 
r   ro  c                   $    \ rS rSrSrS rS rSrg)rT  ix  zL
a simple readline class that uses an arbitrary read function and buffering
c                     Xl         SU l        g rY  readfunc	remainder)r   rs  s     r   r    Readliner.__init__|  s     r   c                    / nSnU R                   n  UR                  S5      nUS:w  a  OFU[        U5      -   U:  a  X-
  S-
  nUR                  U5        U R	                  5       nU(       d  SnOM^  US-  nUR                  US U 5        XES  U l         SR                  U5      $ !   SR                  U5      U l         e = f)Nr   rN  rc   r#   r   )rt  rh  r   r   rs  r   )r   rI  r   datalenrZ   r;  s         r   r_   Readliner.readline  s    ~~	ii&"9SY&%//A-CD!}}C  1HCKKTc
#!$ZDN88D>!	 XXd^DNs   BB$ $B=rr  N)r@   rA   rB   rC   rd   r    r_   rF   r7   r   r   rT  rT  x  s    r   rT  c                   &    \ rS rSrS rS rS rSrg)OfflineTesti  c                     S1nSS1n[        [        5       HT  nUR                  S5      (       d  X2;   a  M   [        [        U5      n[        USS 5      S:X  d  MC  UR	                  U5        MV     U R                  [        R                  U5        g )N	responsesHTTPMessageparse_headersr#  rA   zhttp.client)rQ  r   
startswithr  addassertCountEqual__all__)r   r   denylistr  module_objects        r   test_allOfflineTest.test_all  sy    = "?3KDs##t'7#FD1M}lD9]JT"   	fnnh7r   c                 f    U R                  [        R                  [        R                     S5        g )Nr  )r   r   r|  r  r3   s    r   test_responsesOfflineTest.test_responses  s#    ))&*:*:;[Ir   c                     / SQnU H1  nU R                  US9   U R                  [        U5        S S S 5        M3     g ! , (       d  f       ME  = f)N)>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  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  r  r  r  r  )constant)r   assertHasAttrr   )r   r   consts      r   test_client_constants!OfflineTest.test_client_constants  sC    ?
@ Eu-""651 .- --s	   =
A	r7   N)r@   rA   rB   rC   r  r  r  rF   r7   r   r   rz  rz    s    8JD2r   rz  c                   p    \ rS rSrS rS rS r\R                  " \	" \
S5      (       + S5      S 5       rSrg	)
SourceAddressTesti  c                 4   [         R                   " [         R                  [         R                  5      U l        [        R
                  " U R                  5      U l        [        R                  " 5       U l        U R                  R                  5         S U l
        g r6   )r  AF_INETSOCK_STREAMr  r   	bind_portr   find_unused_portsource_portlistenr   r3   s    r   r6  SourceAddressTest.setUp  s\    MM&..&2D2DE	!++DII6	(99;			r   c                     U R                   (       a!  U R                   R                  5         S U l         U R                  R                  5         S U l        g r6   )r   r-   r  r3   s    r   tearDownSourceAddressTest.tearDown  s3    99IIOODI			r   c                 $   [         R                  " [        U R                  SU R                  4S9U l        U R
                  R                  5         U R                  U R
                  R                  R                  5       S   U R                  5        g )Nr   source_addressr#   )
r   r   r  r   r  r   rs   r   r   r	  r3   s    r   testHTTPConnectionSourceAddress1SourceAddressTest.testHTTPConnectionSourceAddress  sf    ))$		 "D$4$457			335a8$:J:JKr   HTTPSConnectionz'http.client.HTTPSConnection not definedc                 n    [         R                  " [        U R                  SU R                  4S9U l        g )Nr   r  )r   r  r  r   r  r   r3   s    r    testHTTPSConnectionSourceAddress2SourceAddressTest.testHTTPSConnectionSourceAddress  s,     **4 "D$4$457	r   )r   r   r  r  N)r@   rA   rB   rC   r6  r  r  unittestskipIfhasattrr   r  rF   r7   r   r   r  r    sA    L __):;;>@7@7r   r  c                   *    \ rS rSrSrS rS rS rSrg)TimeoutTesti  Nc                     [         R                   " [         R                  [         R                  5      U l        [        R
                  " U R                  5      [        l        U R                  R                  5         g r6   )	r  r  r  r  r   r  r  PORTr  r3   s    r   r6  TimeoutTest.setUp  sE    MM&..&2D2DE	(22499=		r   c                 F    U R                   R                  5         S U l         g r6   )r  r-   r3   s    r   r  TimeoutTest.tearDown  s    			r   c                 b   U R                  [        R                  " 5       5        [        R                  " S5         [        R
                  " [        [        R                  5      nUR                  5         [        R                  " S 5        U R                  UR                  R                  5       S5        UR                  5         U R                  [        R                  " 5       5        [        R                  " S5         [        R
                  " [        [        R                  S S9nUR                  5         [        R                  " S 5        U R                  UR                  R                  5       S 5        UR                  5         [        R
                  " [        [        R                  SS9nUR                  5         U R                  UR                  R                  5       S5        UR                  5         g ! [        R                  " S 5        f = f! [        R                  " S 5        f = fN   )timeout)assertIsNoner  getdefaulttimeoutsetdefaulttimeoutr   r   r  r  r  rs   r   r   
gettimeoutr-   )r   httpConns     r   testTimeoutAttribute TimeoutTest.testTimeoutAttribute  s   
 	&2245  $	+,,T;3C3CDH$$T*113R8 	&2245  $	+,,T;3C3C6:<H$$T*113T: (({/?/?L113R8) $$T* $$T*s   9G;  8H ;HH.)r  )	r@   rA   rB   rC   r  r6  r  r  rF   r7   r   r   r  r    s    D
r   r  c                   &    \ rS rSrS rS rS rSrg)PersistenceTesti@  c                    SnU GH*  u  p#nU R                  X#S9   SR                  X#5      n[        U5      nU R                  UR                  5        UR                  SS5        UR                  5        nU R                  UR                  S L U(       + 5        UR                  5         S S S 5        U R                  UR                  S L U(       + 5        U R                  UR                  S5        UR                  SS5        U R                  UR                  U(       a  SOS5        S S S 5        GM-     g ! , (       d  f       N= f! , (       d  f       GMQ  = f)	N))1.0r   F)r  zConnection: keep-alive
T)1.1r   T)r  zConnection: close
F)r  zConnection: keep-ALIVE
T)r  zConnection: cloSE
F)versionr   z4HTTP/{} 200 OK
{}Content-Length: 12

Dummy body
r   z/open-connectionr#   z/subsequent-requestr	  )
r   r   rf   r  r   r   r  r   rZ   rj   )r   testsr  r   reuser   r   r  s           r   test_reuse_reconnect$PersistenceTest.test_reuse_reconnectB  s   
 ',"GUg=%
 &)  04!!$)),U$67%%'8$$TYY$%6E	BMMO (   d!2I>  !1!115U$9:  !1!111E# >= ', (' >=s%   AE54D5)A>E5
E?E
E	c                    S n[         R                  [        R                  4U[        44nU H  u  p4U R                  US9   [        SU5      nUR                  SS5        U R                  XER                  5        U R                  UR                  5        UR                  SS5        U R                  UR                  S5        S S S 5        M     g ! , (       d  f       M  = f)Nc                 v   ^ [         R                  " U 5      mU4S jnUTl        [         R                  " T5      $ )z3Return BufferedReader that raises ECONNRESET at EOFc                 h   > [         R                  R                  TU 5      nUS:X  a
  [        5       eU$ rd  )rD   rE   r  ConnectionResetError)bufferrF  streams     r   r  NPersistenceTest.test_disconnected.<locals>.make_reset_reader.<locals>.readintoe  s.    zz**66:19.00r   )rD   rE   r  r4  )r   r  r  s     @r   make_reset_reader<PersistenceTest.test_disconnected.<locals>.make_reset_readerb  s0    ZZ%F
 'FO$$V,,r   )r  r   r   z/eof-response
/reconnectr	  )rD   rE   r   RemoteDisconnectedr  r   rf   r   r  r  r  r   r   rj   )r   r  r  stream_factoryr  r   s         r   test_disconnected!PersistenceTest.test_disconnected`  s    		- ZZ223 45
 */%N	2/^DUO4!!)-=-=>!!$)),UL1  !1!115 32 */22s   BC
C!	c                 &   [        S5      nUR                  SSSS0S9  U R                  [        R                  UR
                  5        U R                  UR                  5        UR                  SS5        U R                  UR                  S5        g )	Ns   HTTP/1.1 100 Continue

r   r   Expectz100-continuer   r  r	  )
rf   r   r  r   r  r  r  r   r   rj   r   s     r   test_100_closePersistenceTest.test_100_close{  s|    '

 	UC(N)CD&33T5E5EF$))$UL)))1-r   r7   N)r@   rA   rB   rC   r  r  r  rF   r7   r   r   r  r  @  s    F<66
.r   r  c                       \ rS rSrS rS rS rS rS r\	R                  S 5       rS r\	R                  " S	5      S
 5       rS rS rS r\R&                  " \" \S5      (       + S5      S 5       rS rSrg)	HTTPSTesti  c                 R    [        [        S5      (       d  U R                  S5        g g )Nr  zssl support required)r  r   skipTestr3   s    r   r6  HTTPSTest.setUp  s"    v011MM01 2r   c                     SSK Jn  U" XS9$ )Nr   )make_https_server)certfile)test.ssl_serversr  )r   r  r  s      r   make_serverHTTPSTest.make_server  s    6 99r   c                     [         R                  " [        [        R                  SS9nU R                  UR                  S5        g r  )r   r  r  r  r  r   r  )r   r-  s     r   test_attributesHTTPSTest.test_attributes  s0    ""4)9)92FB'r   c                    SS K n[        R                  " S5        [        R                  " S5         [
        R                  " SS5      nU R                  UR                  5       nUR                  SS5        S S S 5        U R                  WR                  R                  S5        S S S 5        g ! , (       d  f       N== f! , (       d  f       g = f)Nr   networkself-signed.pythontest.net  r   r   CERTIFICATE_VERIFY_FAILED)sslr   requiresr   transient_internetr   r  r  SSLErrorr   r   r  r  )r   r  r-  exc_infos       r   test_networkedHTTPSTest.test_networked  s    #--.JK&&'CSIA""3<<0H		%% 1X//668ST	 LK00 LKs#   3B?$B.7.B?.
B<	8B??
Cc                    SS K n[        R                  " S5        [        R                  " S5         UR                  5       n[        R                  " SSUS9nUR                  SS5        UR                  5       nUR                  5         U R                  SUR                  S	5      5        UR                  5         S S S 5        g ! , (       d  f       g = f)
Nr   r  r  r  contextr   r   nginxserver)r  r   r  r   r  _create_unverified_contextr   r  r   r  r-   r   r   )r   r  r  r-  r   s        r   test_networked_noverification'HTTPSTest.test_networked_noverification  s    #--.JK446G&&'CS/68AIIeS!==?DGGIMM'4>>(#;<JJL LKKs   B
C
Cc                    [         R                  " S5        [        R                  " S5         [        R
                  " SS5      nUR                  SS5        UR                  5       nUR                  S5      nUR                  5         UR                  5         U R                  SU5        S S S 5        g ! , (       d  f       g = f)Nr  r%  r  r   r   zcontent-typez	text/html)r   r  r   r  r   r  r   r  r   r-   r   )r   r-  r   content_types       r   &test_networked_trusted_by_default_cert0HTTPSTest.test_networked_trusted_by_default_cert  s     	#--.>?&&'7=AIIeS!==?D>>.9LJJLGGIMM+|4 @??s   A=B33
Cc           	      2   SS K n[        R                  " S5        Sn[        R                  " U5         UR                  UR                  5      nU R                  UR                  UR                  5        U R                  UR                  S5        UR                  [        5         [        R                  " USUS9nUR                  SS5        UR!                  5       nUR/                  S5      nUR1                  5         UR1                  5         U R3                  SU5        S S S 5        g ! UR"                   aJ  n[%        U5      n[&        R(                  " S	U5      (       a  [*        R,                  " S
U SU S35      ee S nAff = f! , (       d  f       g = f)Nr   r  r  Tr  r  r   r   z(?i)key.too.weakzGot z trying to connect to z). See https://bugs.python.org/issue36816.r  r  )r  r   r  r   r  
SSLContextPROTOCOL_TLS_CLIENTr   verify_modeCERT_REQUIREDcheck_hostnameload_verify_locations CERT_selfsigned_pythontestdotnetr   r  r   r  r  r   researchr  SkipTestr   r-   r   )	r   r  selfsigned_pythontestdotnetr  r-  r   ssl_errssl_err_strserver_strings	            r   test_networked_good_cert"HTTPSTest.test_networked_good_cert  sa   #&B#--.IJnnS%<%<=GW00#2C2CDW33T:))*JK**+F3:<		%%}} !NN84MJJLGGIMM'=15 KJ << !'l 990+>>"++{m ,9: ;BBC C  KJs2   A3F'8D+AF+F;AF  FF
Fwalltimec                    SS K n[        R                  " S5        [        R                  " S5         UR                  UR                  5      nUR                  [        5        [        R                  " SSUS9nU R                  UR                  5       nUR                  SS5        S S S 5        U R                  WR                  R                   S5        S S S 5        g ! , (       d  f       N== f! , (       d  f       g = f)	Nr   r  r  r  r  r   r   r  )r  r   r  r   r  r  r   r  CERT_localhostr   r  r  r  r   r   r  r  )r   r  r  r-  r  s        r   test_networked_bad_cert!HTTPSTest.test_networked_bad_cert  s     	#--.JKnnS%<%<=G)).9&&'CSRYZA""3<<0H		%% 1X//668ST LK 10	 LKs$   A"C.C&.C.
C+	'C..
C<c                 R   SS K nU R                  [        5      n[        R                  " SUR
                  5      nU R                  UR                  5       nUR                  SS5        S S S 5        U R                  WR                  R                  S5        g ! , (       d  f       N5= f)Nr   	localhostr   r   r  )r  r  r  r   r  r   r  r  r   r   r  r  )r   r  r  r-  r  s        r   test_local_unknown_cert!HTTPSTest.test_local_unknown_cert  sx    !!.1"";<s||,IIeS! -++224OP -,s   B
B&c                    SS K nU R                  [        5      nUR                  UR                  5      nUR                  [        5        [        R                  " SUR                  US9nU R                  UR                  5        UR                  SS5        UR                  5       nU R                  UR                  5        U R                  UR                  S5        g )Nr   r  r  r   /nonexistentrN  )r  r  r  r  r   r  r   r  r   r  r-   r   r  r   r  r   r  r  r  r-  r   s         r   test_local_good_hostname"HTTPSTest.test_local_good_hostname  s    !!.1..!8!89%%n5"";WM 			%(}}

#c*r   c                 J   SS K nU R                  [        5      nUR                  UR                  5      nUR                  [        5        [        R                  " SUR                  US9nU R                  UR                  5         UR                  SS5        S S S 5        SUl        [        R                  " SUR                  US9nU R                  UR                  5         UR                  SS5        S S S 5        SUl        [        R                  " SUR                  US9nUR                  SS5        UR                  5       nUR                  5         UR                  5         U R                  UR                   S	5        g ! , (       d  f       N= f! , (       d  f       N= f)
Nr   r  r  r   r   TFr  rN  )r  r  CERT_fakehostnamer  r   r  r   r  r   r  CertificateErrorr   r  r  r-   r   r  r  s         r   test_local_bad_hostname!HTTPSTest.test_local_bad_hostname   s4   !!"34..!8!89%%&78"";WMs334IIeS! 5 "&"";WMs334IIeS! 5 "'"";WM			%(}}

		c*! 54 54s   F"F
F
F"r  z)http.client.HTTPSConnection not availablec                 $   S H2  nU R                  [        R                  [        R                  U5        M4     S HR  u  pn[        R                  " U5      nU R	                  X$R
                  5        U R	                  X4R                  5        MT     g )Nr"  )r#  )zwww.python.org:443r%  r  )r'  r%  r  )r%  r%  r  )r(  r$  r  )r)  r$  r  )r  r   r*  r  r   r   r   r+  s        r   r0  HTTPSTest.test_host_port  st    
 IBf//1G1GL I#HB1 &&r*AQ'Q'#r   c                    SS K nUR                  (       d  U R                  S5        [        R                  " SS5      nU R                  UR                  R                  5        UR                  UR                  5      nU R                  UR                  5        [        R                  " SSUS9nU R                  UR                  U5        U R                  UR                  R                  5        UR                  UR                  [        S9nSUl        [        R                  " SSUS9nU R                  UR                  R                  5        g )Nr   zTLS 1.3 support requiredr  r  r  )	cert_fileT)r  HAS_TLSv1_3r  r   r  rO  _contextpost_handshake_authr  r   r  assertIsr  )r   r  r-  r  s       r   test_tls13_phaHTTPSTest.test_tls13_pha-  s    MM45"";4

667..!8!89445"";WEajj'*778..!8!8N.S&*#"";WE

667r   r7   N)r@   rA   rB   rC   r6  r  r  r  r  r   system_must_validate_certr  r  requires_resourcer  r  r  r   r  r  r  r   r0  r*  rF   r7   r   r   r  r    s    2:(
U &&
5 '
52B z*
U +
UQ++2 __):;;@B(B($8r   r  c                   N    \ 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)RequestBodyTestiA  z3Test cases where a request includes a message body.c                     [         R                  " S5      U l        [        S5      =U R                  l        U l        U R                  U R                  l        g )Nri   r   )r   r   r   r   r   r3   s    r   r6  RequestBodyTest.setUpD  s9    ))-8	%/^3				r   c                     [         R                  " U R                  R                  5      nUR	                  5         [
        R                  " U5      nX!4$ r6   )rD   rE   r   r   r_   r   r~  r   fmessages      r   get_headers_and_fp"RequestBodyTest.get_headers_and_fpI  s9    JJtyy~~&	

&&q)zr   c                 "   SS/S4S4nU H  u  p#U R                  U5         [        R                  " S5      U l        [	        S5      =U R                  l        U l        U R                  R                  SSU5        U R                  5       u  pEU R                  S	U5        U R                  S
U5        U R                  UR                  S5      S5        U R                  X5R                  5       5        S S S 5        M     g ! , (       d  f       GM  = f)NrM     bar   3
foo
3
bar
0

))rM  r9  r:  ri   r   r   r  zContent-Typer   r'  r(  )r   r   r   r   r   r   r   r6  r+  r   getrZ   )r   r  r   r   r   r4  s         r   test_list_bodyRequestBodyTest.test_list_bodyO  s    
 fCDD
 $NDd#"11-@	-7^;				!!%6002  5  !137  )<!=yI  6684 $# $##s   CC>>
D	c                     U R                   R                  SSSSS05        U R                  5       u  pU R                  SUR	                  S5      5        U R                  S[        UR                  5       5      5        g )Nr   r  r   r   42r)  r  )r   r   r6  r   r;  r   rZ   r   r5  r4  s      r   test_manual_content_length*RequestBodyTest.test_manual_content_lengthc  sh     			%+T2	4,,.
w{{+;<=CM*r   c                 b   U R                   R                  SSS5        U R                  5       u  pU R                  SUR	                  5       5        U R                  UR                  5       5        U R                  SUR                  S5      5        U R                  SUR                  5       5        g )Nr   r  r   
text/plain4r)  s   body	r   r   r6  r   get_content_typer  get_charsetr;  rZ   r@  s      r   test_ascii_bodyRequestBodyTest.test_ascii_bodyl  s    		%0,,.
w'?'?'AB'--/0gkk*:;<!&&(+r   c                 b   U R                   R                  SSS5        U R                  5       u  pU R                  SUR	                  5       5        U R                  UR                  5       5        U R                  SUR                  S5      5        U R                  SUR                  5       5        g )Nr   r  u   bodyÁrD  5r)     bodyrF  r@  s      r   test_latin1_body RequestBodyTest.test_latin1_bodyt  s    		%4,,.
w'?'?'AB'--/0gkk*:;<affh/r   c                 b   U R                   R                  SSS5        U R                  5       u  pU R                  SUR	                  5       5        U R                  UR                  5       5        U R                  SUR                  S5      5        U R                  SUR                  5       5        g )Nr   r  rM  rD  rL  r)  rF  r@  s      r   test_bytes_bodyRequestBodyTest.test_bytes_body|  s    		%5,,.
w'?'?'AB'--/0gkk*:;<affh/r   c                    U R                  [        R                  [        R                  5        [	        [        R                  SSS9 nUR                  S5        S S S 5        [	        [        R                  SS9 nU R                  R                  SSU5        U R                  5       u  p!U R                  SUR                  5       5        U R                  UR                  5       5        U R                  UR                  S5      5        U R                  S	UR                  S
5      5        U R                  SUR                  5       5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nwr)  )encodingr   r   r  rD  r)  r(  ztransfer-encodings   4
body
0

)r  r   unlinkTESTFNrP  writer   r   r6  r   rG  r  rH  r;  rZ   r3  s      r   test_text_file_body#RequestBodyTest.test_text_file_body  s   	(()*:*:;)""C':aGGFO ;)""W5IIeVQ/002JG\7+C+C+EFg1134 gkk*:;<Y4G(HI6A 65 ;:55s   E:CE$
E!$
E2c                    U R                  [        R                  [        R                  5        [	        [        R                  S5       nUR                  S5        S S S 5        [	        [        R                  S5       nU R                  R                  SSU5        U R                  5       u  p!U R                  SUR                  5       5        U R                  UR                  5       5        U R                  SUR                  S5      5        U R                  S	U5        U R                  S
UR                  5       5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)NwbrM  r)   r   r  rD  r(  r'  r   s   5
body
0

)r  r   rV  rW  rP  rX  r   r   r6  r   rG  r  rH  r;  r+  rZ   r3  s      r   test_binary_file_body%RequestBodyTest.test_binary_file_body  s   	(()*:*:;)""D)QGGK  *)""D)QIIeVQ/002JG\7+C+C+EFg1134Y4G(HI-w7:AFFHE *) *)))s   	E=CE
E
E')r   r   N)r@   rA   rB   rC   rd   r6  r6  r<  rA  rI  rN  rQ  rY  r]  rF   r7   r   r   r/  r/  A  s4    =#
5(+,00BFr   r/  c                   8    \ rS rSrS rS rS rS rS rS r	Sr
g	)
HTTPResponseTesti  c                     Sn[        U5      n[        R                  " U5      U l        U R                  R	                  5         g )NzXHTTP/1.1 200 Ok
My-Header: first-value
My-Header:                 second-value

Text)r   r   r   r   r   )r   r   r   s      r   r6  HTTPResponseTest.setUp  s3    *$''-			r   c                     U R                   R                  S5      nU R                  US5        U R                   R                  SS5      nU R                  US5        g )Nz	My-Headerzfirst-value, second-valuezsome defaultr   r   r   r   r   s     r   test_getting_header$HTTPResponseTest.test_getting_header  sN    $$[1!<=$$[.A!<=r   c                 `    U R                   R                  SS5      nU R                  US5        g )NNo-Such-Headerzdefault-valuerd  re  s     r   3test_getting_nonexistent_header_with_string_defaultDHTTPResponseTest.test_getting_nonexistent_header_with_string_default  s)    $$%5G1r   c                     U R                   R                  SSS/5      nU R                  US5        U R                   R                  SS5      nU R                  US5        g )Nri  defaultr  zdefault, values)rm  r  rd  re  s     r   5test_getting_nonexistent_header_with_iterable_defaultFHTTPResponseTest.test_getting_nonexistent_header_with_iterable_default  sX    $$%5	87LM!23$$%57LM!23r   c                 ^    U R                   R                  S5      nU R                  US 5        g )Nri  rd  re  s     r   /test_getting_nonexistent_header_without_default@HTTPResponseTest.test_getting_nonexistent_header_without_default  s'    $$%56&r   c                 \    U R                   R                  SSS9nU R                  US5        g )Nri  r   )rm  rd  re  s     r   test_getting_header_defaultint/HTTPResponseTest.test_getting_header_defaultint  s,    $$%5b$A$r   rg  N)r@   rA   rB   rC   r6  rf  rj  rn  rq  rt  rF   r7   r   r   r`  r`    s     >24'%r   r`  c                       \ 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S rS rS rS rS rSrg)TunnelTestsi  c                     SnSU l         [        R                  U l        [        R                  " U R                   5      U l        U R                  U5      U R
                  l        g )Nz:HTTP/1.1 200 OK

HTTP/1.1 200 OK
Content-Length: 42

z	proxy.com)r   r   	HTTP_PORTr   r   r   rn   )r   response_texts     r   r6  TunnelTests.setUp  sO    ) 	
  	$$	))$))4	'+'>'>}'M		$r   c                 8    U R                   R                  5         g r6   )r   r-   r3   s    r   r  TunnelTests.tearDown  s    		r   c                    ^ SU4S jjnU$ )Nc                 &   > [        TU S   U S   S9$ )Nr   r#   r   r   r   )r  r  r  rz  s      r   rm   9TunnelTests._create_connection.<locals>.create_connection  s    m'!*71:NNr   NNr7   )r   rz  rm   s    ` r   rn   TunnelTests._create_connection  s    	O  r   c                    SnSnSS0nUR                  5       nSX4-  US'   U R                  R                  XUS9  U R                  R                  SS	S
5        U R	                  U R                  R
                  R                  U R                  5        U R	                  U R                  R
                  R                  U R                  5        U R	                  U R                  R                  U5        U R	                  U R                  R                  U5        U R	                  U R                  R                  U5        g )Ndestination.com"  
User-Agent!Mozilla/5.0 (compatible, MSIE 11)%s:%dr   r   r   r   r   r   )copyr   
set_tunnelr   r   r   r   r   _tunnel_host_tunnel_port_tunnel_headers)r   tunnel_hosttunnel_porttunnel_headerstunnel_headers_afters        r   2test_set_tunnel_host_port_headers_add_host_missing>TunnelTests.test_set_tunnel_host_port_headers_add_host_missing  s    '&(KL-224'.+1K'KV$		[%3 	 	5		&#r*,,dii8,,dii8//=//=224HIr   c                 X   SnSnSSX4-  S.nU R                   R                  XUS9  U R                   R                  SSS	5        U R                  U R                   R                  R
                  U R
                  5        U R                  U R                   R                  R                  U R                  5        U R                  U R                   R                  U5        U R                  U R                   R                  U5        U R                  U R                   R                  U5        g )
Nr  r  r  r  r  r   r  r   r   r   
r   r  r   r   r   r   r   r  r  r  r   r  r  r  s       r   4test_set_tunnel_host_port_headers_set_host_identical@TunnelTests.test_set_tunnel_host_port_headers_set_host_identical  s    '(K")[,F"FH		[%3 	 	5		&#r*,,dii8,,dii8//=//=22NCr   c                 V   SnSnSSS-  S.nU R                   R                  XUS9  U R                   R                  SS	S
5        U R                  U R                   R                  R
                  U R
                  5        U R                  U R                   R                  R                  U R                  5        U R                  U R                   R                  U5        U R                  U R                   R                  U5        U R                  U R                   R                  U5        g )Nr  r  r  r  )ri   ih  r  r  r   r   r   r  r  s       r   4test_set_tunnel_host_port_headers_set_host_different@TunnelTests.test_set_tunnel_host_port_headers_set_host_different  s    '(K"),A"AC		[%3 	 	5		&#r*,,dii8,,dii8//=//=22NCr   c                     U R                   R                  5         U R                  [        U R                   R                  S5        g )Nr  )r   rs   r  RuntimeErrorr  r3   s    r   &test_disallow_set_tunnel_after_connect2TunnelTests.test_disallow_set_tunnel_after_connect	  s1    		,		(<(<+	-r   c                 r   S[         R                  S.nU R                  R                  US   R	                  S5      5        U R                  R                  SSS5        U R                  U R                  R                  R                  U R                  5        U R                  U R                  R                  R                  U R                  5        U R                  SU-  U R                  R                  R                  5        U R                  S	U-  U R                  R                  R                  5        g 
N   destination.com   host   portr  r   r   r   r   ?   CONNECT %(host)s:%(port)d HTTP/1.1
Host: %(host)s:%(port)d

!   HEAD / HTTP/1.1
Host: %(host)s
r   ry  r   r  r   r   r   r   r   r   r   r   r   rc  s     r   test_connect_with_tunnel$TunnelTests.test_connect_with_tunnel		      '%%
 			QwZ..w78		&#r*,,dii8,,dii8 9;<=iinn))	+ 	>Biinn))	+r   c                 v   S[         R                  S.nU R                  R                  US   R	                  S5      US   S9  U R                  R                  SSS	5        U R                  U R                  R                  R                  U R                  5        U R                  U R                  R                  R                  U R                  5        U R                  S
U-  U R                  R                  R                  5        U R                  SU-  U R                  R                  R                  5        g )Nr  r  r  r   r  r   r   r   r   r  r  r  r  s     r   *test_connect_with_tunnel_with_default_port6TunnelTests.test_connect_with_tunnel_with_default_port	  s    '%%
 			QwZ..w7ajI		&#r*,,dii8,,dii8 9;<=iinn))	+ 	>Biinn))	+r   c                 Z   SSS.nU R                   R                  US   R                  S5      US   S9  U R                   R                  SS	S
5        U R	                  U R                   R
                  R                  U R                  5        U R	                  U R                   R
                  R                  U R                  5        U R                  SU-  U R                   R
                  R                  5        U R                  SU-  U R                   R
                  R                  5        g )Nr  r  r  r  r   r  r  r   r   r   r  s*   HEAD / HTTP/1.1
Host: %(host)s:%(port)d
)
r   r  r   r   r   r   r   r   r   r   r  s     r   .test_connect_with_tunnel_with_nonstandard_port:TunnelTests.test_connect_with_tunnel_with_nonstandard_port'	  s    '
 			QwZ..w7ajI		&#r*,,dii8,,dii8 9;<=iinn))	+ 	G!Kiinn))	+r   c                    SS[         R                  S.nU R                  R                  US   R	                  S5      SUS   R	                  S5      0S9  U R                  R                  S	S
S5        U R                  U R                  R                  R                  U R                  5        U R                  U R                  R                  R                  U R                  5        U R                  SU-  U R                  R                  R                  5        U R                  SU-  U R                  R                  R                  5        g )Nr  s   example.com:9876)r     tunnel_host_headerr  r  r   r  r  r  r   r   r   sD   CONNECT %(host)s:%(port)d HTTP/1.1
HOST: %(tunnel_host_header)s

r  r  r  s     r   3test_connect_with_tunnel_with_different_host_header?TunnelTests.test_connect_with_tunnel_with_different_host_header9	  s   '#6%%

 			gJg&Q45<<WEF 	 	H 			&#r*,,dii8,,dii8 >@ABiinn))	+ 	>Biinn))	+r   c                 r   S[         R                  S.nU R                  R                  US   R	                  S5      5        U R                  R                  SSS5        U R                  U R                  R                  R                  U R                  5        U R                  U R                  R                  R                  U R                  5        U R                  SU-  U R                  R                  R                  5        U R                  S	U-  U R                  R                  R                  5        g r  r  r  s     r   'test_connect_with_tunnel_different_host3TunnelTests.test_connect_with_tunnel_different_hostK	  r  r   c                    SnSUR                  S5      [        R                  4-  nSX"4-  nU R                  R	                  U5        U R                  R                  SSS5        U R                  U R                  R                  R                  U R                  5        U R                  U R                  R                  R                  [        R                  5        U R                  X0R                  R                  R                  5        g )Nu	   δπθ.grs   %s:%didnas!   CONNECT %s HTTP/1.1
Host: %s

r   r   r   )r   r   ry  r   r  r   r   r   r   r   r   r   )r   dest	dest_portr   s       r   test_connect_with_tunnel_idna)TunnelTests.test_connect_with_tunnel_idnaZ	  s    &F 3V5E5EFF	=A" "		T"		&#r*,,dii8,,f.>.>?h		 3 34r   c                 (   [         R                  R                  U R                  S5       nU R                  R	                  S5        U R                  R                  5         U R                  R                  SS5        SSS5        WR                  5         U R                  [        UR                  5      SSUR                   3S9  UR                  S	   S   S	   nU R                  S
U5        U R                  USSU< 3S9  g! , (       d  f       N= f)z8Regresstion test for https://bugs.python.org/issue43332.rV  r  r   r   Nr#   z!unexpected number of send calls: )r   r   s   CONNECT destination.comrv  zunexpected proxy data sent )r   patchobjectr   r  rs   r   assert_calledr>  r   
mock_callsr   r   )r   	mock_sendproxy_setup_data_sents      r   0test_tunnel_connect_single_send_connection_setup<TunnelTests.test_tunnel_connect_single_send_connection_setupe	  s    ZZtyy&1YII  !23IIIIeS) 2 	!I(()17	8L8L7MN 	 	P !* 4 4Q 7 :1 =02GH1;12G1JK 	 	M 21s   AD
Dc                 r   S[         R                  S.nU R                  R                  US   R	                  S5      5        U R                  R                  SSS5        U R                  U R                  R                  R                  U R                  5        U R                  U R                  R                  R                  U R                  5        U R                  SU-  U R                  R                  R                  5        U R                  S	U-  U R                  R                  R                  5        g )
Nr  r  r  r   r   r   r   r  s    PUT / HTTP/1.1
Host: %(host)s
r  r  s     r   test_connect_put_request$TunnelTests.test_connect_put_requestu	  s    '%%
 			QwZ..w78		%b),,dii8,,dii8 9;<=iinn))	+ 	=Aiinn))	+r   c                 &   U R                   R                  SS5        U R                   R                  SSS5        U R                  U R                   R                  R
                  U R
                  5        U R                  U R                   R                  R                  [        R                  5        U R                  SU R                   R                  R                  5        U R                  SU R                   R                  R                  5        g )Nz
[1:2:3::4]i  r   r   r      CONNECT [1:2:3::4]:1234   Host: [1:2:3::4]:1234r   r  r   r   r   r   r   r   ry  r   r   r3   s    r   test_connect_put_request_ipv6)TunnelTests.test_connect_put_request_ipv6	  s    		\40		%b),,dii8,,f.>.>?0$))..2E2EF.		0C0CDr   c                 $   U R                   R                  S5        U R                   R                  SSS5        U R                  U R                   R                  R
                  U R
                  5        U R                  U R                   R                  R                  [        R                  5        U R                  SU R                   R                  R                  5        U R                  SU R                   R                  R                  5        g )Nz[1:2:3::4]:1234r   r   r   r  r  r  r3   s    r   "test_connect_put_request_ipv6_port.TunnelTests.test_connect_put_request_ipv6_port	  s    		./		%b),,dii8,,f.>.>?0$))..2E2EF.		0C0CDr   c                    SnSR                  U5      nU R                  R                  S5        U R                  U5      U R                  l        U R                  R	                  S5        [
        R                  " 5        nU R                  R                  SSS5        S S S 5        WR                  5       R                  5       nU R                  SR                  U5      U5        g ! , (       d  f       NN= f)	Nz
X-Dummy: 1zHTTP/1.0 200 OK
{}

r#   r  r   r   r   z
header: {})r   r   set_debuglevelrn   r  r   r  r   r  r  r   )r   expected_headerrz  r  r  s        r   test_tunnel_debuglog TunnelTests.test_tunnel_debuglog	  s    &7>>O		  #'+'>'>}'M		$		./$$&&IIeS"- '!,,.l))/:EB '&s   ?C%%
C3c                 j   SnSR                  SR                  U5      5      nU R                  U5      U R                  l        U R                  R	                  S5        U R                  R                  SSS5        U R                  R                  5       nU R                  XR                  5       5        g )NzX-Dummy1HTTP/1.0 200 OK
{0}

:r  r   r   r   )	r   r   rn   r   r  r   get_proxy_response_headersr   itemsr   r  rz  r   s       r   test_proxy_response_headers'TunnelTests.test_proxy_response_headers	  s    * &/!:; 	
 (,'>'>}'M		$		./		%b)))668o}}7r   c                    SnSR                  SR                  U5      5      nU R                  U5      U R                  l        U R                  R	                  SSS5        U R                  R                  5       nU R                  U5        g )Nr  r  r  r   r   r   )r   r   rn   r   r   r  r  r  s       r   test_no_proxy_response_headers*TunnelTests.test_no_proxy_response_headers	  ss    * &/!:; 	
 (,'>'>}'M		$		%b)))668'"r   c                 :  ^ S mSU4S jjnXR                   l        U R                   R                  S5        S n U R                   R                  SSS5        U R                  U5        U R                  TR                  5        g ! [         a  nUn S nAN>S nAff = f)Nc                 *   > [        SU S   U S   S9mT$ )NzHTTP/1.1 404 NOT FOUND

r   r#   r  r  )r  r  r  r   s      r   rn   8TunnelTests.test_tunnel_leak.<locals>._create_connection	  s%    0QZQZD
 Kr   r  r   r   r   r  )r   rn   r  r   rO   r   rO  r   )r   rn   r  er   s       @r   test_tunnel_leakTunnelTests.test_tunnel_leak	  s    	 (:		$		./	IIfc2. 	S!(()	  	C	s   B 
BBB)r   r   r   N)r@   rA   rB   rC   r6  r  rn   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rF   r7   r   r   rw  rw    ss    	N!
JDD-+++$+$+	5M +EEC8#*r   rw  __main__r	  )	verbosity)?r  rP   httpr   r   rD   r   osrW  r  r  r  r  r   TestCaser}  r   test.supportr   r   test.support.testcaser	   requires_working_socketpathdirnamerQ  herer   r  r  r  r  r  chunk_extensionr  r  rE  r  r  r   rH   rE   rV   r   rf   r{   r  r  rJ  r0  rk  ro  rT  rz  r  r  r  r  r/  r`  rw  r@   mainr7   r   r   <module>r     s*     # 	  	  	      " & 1   t ,	wwx dJ>GGLLz>B #%77<<*7$  	-  N 
O+f4 - B* 2:: $2v44 2"z;(O z;z5h 5,}8 }@y'/ y'xA(x A(HJ)9 J
. , DV2(O V2r7 7>+( +\E.h E.Pv8 v8r]Fh ]F@!%x !%FM*(O M*` zMMA r   