
    .Ld_                     n   d Z ddlZddlZddlZddlZddlmZmZmZ ddl	m
Z
mZ ddlmZ ddlmZ ddlmZ ddlmZmZ dd	lmZ dd
lmZmZmZmZmZmZmZ  G d de          Z G d de          Z  G d de          Z! G d dej"                  Z# G d dej$                  Z% G d de          Z&dS )zFClient and server implementations of HTTP/1.x.

.. versionadded:: 4.0
    N)Futurefuture_add_done_callback"future_set_result_unless_cancelled)
native_strutf8)gen)httputil)iostream)gen_logapp_log)GzipDecompressor)castOptionalType	AwaitableCallableUnionTuplec                       e Zd ZddZdS )_QuietExceptionreturnNc                     d S N selfs    7lib/python3.11/site-packages/tornado/http1connection.py__init__z_QuietException.__init__+           r   N)__name__
__module____qualname__r   r   r    r   r   r   *   s(             r    r   c                   b    e Zd ZdZdej        ddfdZddZddd	ee	         d
e
j        ddfdZdS )_ExceptionLoggingContextzUsed with the ``with`` statement when calling delegate methods to
    log any exceptions with the given logger.  Any exceptions caught are
    converted to _QuietException
    loggerr   Nc                     || _         d S r   )r'   )r   r'   s     r   r   z!_ExceptionLoggingContext.__init__5   s    r    c                     d S r   r   r   s    r   	__enter__z"_ExceptionLoggingContext.__enter__8   r   r    typzOptional[Type[BaseException]]valuetbc                 ^    |*|J | j                             d|||f           t          d S )NUncaught exceptionexc_info)r'   errorr   )r   r+   r,   r-   s       r   __exit__z!_ExceptionLoggingContext.__exit__;   sD     ???K2c5"=MNNN!! r    r!   )r"   r#   r$   __doc__loggingLoggerr   r*   r   BaseExceptiontypesTracebackTyper3   r   r    r   r&   r&   /   s         
w~ $       	",	" &	" 		"
 
	" 	" 	" 	" 	" 	"r    r&   c                       e Zd ZdZ	 	 	 	 	 	 	 ddedee         dee         dee         dee         d	ee         d
eddfdZdS )HTTP1ConnectionParametersz?Parameters for `.HTTP1Connection` and `.HTTP1ServerConnection`.FNno_keep_alive
chunk_sizemax_header_sizeheader_timeoutmax_body_sizebody_timeout
decompressr   c                 p    || _         |pd| _        |pd| _        || _        || _        || _        || _        dS )a;  
        :arg bool no_keep_alive: If true, always close the connection after
            one request.
        :arg int chunk_size: how much data to read into memory at once
        :arg int max_header_size:  maximum amount of data for HTTP headers
        :arg float header_timeout: how long to wait for all headers (seconds)
        :arg int max_body_size: maximum amount of data for body
        :arg float body_timeout: how long to wait while reading body (seconds)
        :arg bool decompress: if true, decode incoming
            ``Content-Encoding: gzip``
        i   N)r<   r=   r>   r?   r@   rA   rB   )r   r<   r=   r>   r?   r@   rA   rB   s           r   r   z"HTTP1ConnectionParameters.__init__J   sH    * +$-.7%,*($r    )FNNNNNF)	r"   r#   r$   r4   boolr   intfloatr   r   r    r   r;   r;   G   s        II $$()-*.'+(, % %% SM% "#	%
 !%  }% uo% % 
% % % % % %r    r;   c                      e Zd ZdZ	 	 d+dej        dedee         dee	         ddf
dZ
d	ej        dee         fd
Zd	ej        defdZd,dZdeeg df                  ddfdZd,dZd,dZdej        fdZdeddfdZdeddfdZ	 d-deej        ej        f         dej        dee         ddfdZdedefdZ deddfdZ!d,dZ"d.dZ#dej        dej        defd Z$d/d"Z%d#ede&e'ej        f         fd$Z(d%edej        d	ej        deed                  fd&Z)d'ed	ej        ddfd(Z*d	ej        ddfd)Z+d	ej        ddfd*Z,dS )0HTTP1ConnectionzImplements the HTTP/1.x protocol.

    This class can be on its own for clients, or via `HTTP1ServerConnection`
    for servers.
    Nstream	is_clientparamscontextr   c                    || _         || _        |t                      }|| _        || _        |j        | _        | j        j        | j        j        n| j        j        | _        | j        j	        | _
        d| _        d| _        t                      | _        d| _        |                                  d| _        d| _        d| _        d| _        d| _        d| _        dS )a  
        :arg stream: an `.IOStream`
        :arg bool is_client: client or server
        :arg params: a `.HTTP1ConnectionParameters` instance or ``None``
        :arg context: an opaque application-defined object that can be accessed
            as ``connection.context``.
        NF)rJ   rI   r;   rK   rL   r<   r@   max_buffer_size_max_body_sizerA   _body_timeout_write_finished_read_finishedr   _finish_future_disconnect_on_finish_clear_callbacks_request_start_line_response_start_line_request_headers_chunking_output_expected_content_remaining_pending_write)r   rI   rJ   rK   rL   s        r   r   zHTTP1Connection.__init__o   s     #>.00F#1
 {(4 K%%, 	
 "[5  %# %hh &+" $( $(! $ % ,0("r    delegatec                 x    | j         j        rt          || j         j                  }|                     |          S )az  Read a single HTTP response.

        Typical client-mode usage is to write a request using `write_headers`,
        `write`, and `finish`, and then call ``read_response``.

        :arg delegate: a `.HTTPMessageDelegate`

        Returns a `.Future` that resolves to a bool after the full response has
        been read. The result is true if the stream is still open.
        )rK   rB   _GzipMessageDelegater=   _read_message)r   r\   s     r   read_responsezHTTP1Connection.read_response   s:     ;! 	N+Hdk6LMMH!!(+++r    c                   K   d}	 | j                             d| j        j                  }| j        j        	| d {V }n	 t          j        | j         j                                        | j        j        z   |t          j
                   d {V }n# t
          j        $ rp |                                  Y |r@t          t                    5  |                                 d d d            n# 1 swxY w Y   d }|                                  dS w xY w|                     |          \  }}| j        r%t'          j        |          }|| _        |}d| _        n@t'          j        |          }	|	| _        || _        |	}|                     |	|           | _        d}t          t                    5  |                    ||          }
|
|
 d {V  d d d            n# 1 swxY w Y   | j         ]d}	 |r@t          t                    5  |                                 d d d            n# 1 swxY w Y   d }|                                  dS d}| j        rt9          |t&          j                  sJ | j        | j        j        dk    rd}|j        }|dk    rd}d|cxk    rd	k     r=n nud
|v sd|v rt'          j         d|z            | !                    |           d {V  n:|"                    d          dk    r!| j#        s| j         $                    d           |s%| %                    | j        r|j        nd||          }|| j&        	| d {V  n	 t          j        | j         j                                        | j&        z   |t          j
                   d {V  n# t
          j        $ r tO          j(        d| j)                   | j                                          Y |r@t          t                    5  |                                 d d d            n# 1 swxY w Y   d }|                                  dS w xY wd| _*        | j#        r| j        rBd}t          t                    5  |+                                 d d d            n# 1 swxY w Y   | j,        -                                sL| j         E| j         .                                s,| j         /                    | j0                   | j,         d {V  | j        r| j        r|                                  | j         [	 |r@t          t                    5  |                                 d d d            n# 1 swxY w Y   d }|                                  dS n# t&          j         $ r}tO          j(        d| j)        |           | j        s | j         $                    d           d {V  |                                  Y d }~|r@t          t                    5  |                                 d d d            n# 1 swxY w Y   d }|                                  dS d }~ww xY w	 |r@t          t                    5  |                                 d d d            n# 1 swxY w Y   d }|                                  n]# |r@t          t                    5  |                                 d d d            n# 1 swxY w Y   d }|                                  w xY wdS )NFs   ?
?
	max_bytes)quiet_exceptionsTHEAD0  d      Content-LengthTransfer-Encodingz!Response code %d cannot have bodyExpectz100-continues   HTTP/1.1 100 (Continue)

r   zTimeout reading body from %sz"Malformed HTTP message from %s: %ss   HTTP/1.1 400 Bad Request

)1rI   read_until_regexrK   r>   r?   r   with_timeoutio_looptimer
   StreamClosedErrorTimeoutErrorcloser&   r   on_connection_closerU   _parse_headersrJ   r	   parse_response_start_linerW   rT   parse_request_start_linerV   rX   _can_keep_aliveheaders_received
isinstanceResponseStartLinemethodcodeHTTPInputErrorr_   getrQ   write
_read_bodyrP   r   inforL   rR   finishrS   doneclosedset_close_callback_on_connection_close)r   r\   need_delegate_closeheader_futureheader_datastart_line_strheadersresp_start_line
start_linereq_start_lineheader_recv_future	skip_bodyr|   body_futurees                  r   r_   zHTTP1Connection._read_message   si
     #u	$ K88)D 9  M {)1$1111111!(+(8+0022T[5OO%)1)C) ) ) # # # # # #KK
 ' ! ! !JJLLL D # 3-g66 3 3002223 3 3 3 3 3 3 3 3 3 3 3 3 3 3 M!!#####Q! '+&9&9+&F&F#NG~ "*"D^"T"T,;)#  .3**!)!B>!R!R+9((/%+
151E1E"G2 2 .* #')'22 - -%-%>%>z7%S%S"%1,,,,,,,,- - - - - - - - - - - - - - - {"&+#P # 3-g66 3 3002223 3 3 3 3 3 3 3 3 3 3 3 3 3 3 M!!#####W I~ J!*h.HIIIII,8076AA $I!3;; !%I$$$$$$$$$$ (7226IW6T6T&5?$F  
 ,,X666666666;;x((N::4CW:K%%&HIII )"oo,0NAO((7H  *)1)))))))))	)"%"2 $ 3 8 8 : :T=O O +191K# # #        
  #/ ) ) )#L)GVVV K--///#(6 # 3-g66 3 3002223 3 3 3 3 3 3 3 3 3 3 3 3 3 3 M!!#####E) #'D' &4> &&+#-g66 & &OO%%%& & & & & & & & & & & & & & & ',,..*K+**,, , ..t/HIII))))))))~ $"< 

{" # 3-g66 3 3002223 3 3 3 3 3 3 3 3 3 3 3 3 3 3 M!!##### #& 	 	 	L=t|QOOO> Mk''(KLLLLLLLLLJJLLL555" 3-g66 3 3002223 3 3 3 3 3 3 3 3 3 3 3 3 3 3 M!!#####	 # # 3-g66 3 3002223 3 3 3 3 3 3 3 3 3 3 3 3 3 3 M!!####	 # 3-g66 3 3002223 3 3 3 3 3 3 3 3 3 3 3 3 3 3 M!!####ts\  ;V AB V #D6V C..C25C2DBV /!GV G  V #G $V H((H,/H,DV AN$ #V $AQ&V =PP"%P"Q.V 0RV RV RBV U""U&)U&Z+ YAY	+Z+ X&&X*-X*	YZ+ (Z		ZZ+\[#\#[''\*['+\c                 v    d| _         d| _        d| _        | j        | j                            d           dS dS )zClears the callback attributes.

        This allows the request handler to be garbage collected more
        quickly in CPython by breaking up reference cycles.
        N)_write_callback_write_future_close_callbackrI   r   r   s    r   rU   z HTTP1Connection._clear_callbacks1  sH      $!#;"K**400000 #"r    callbackc                     || _         dS )a$  Sets a callback that will be run when the connection is closed.

        Note that this callback is slightly different from
        `.HTTPMessageDelegate.on_connection_close`: The
        `.HTTPMessageDelegate` method is called when the connection is
        closed while receiving a message. This callback is used when
        there is not an active delegate (for example, on the server
        side this callback is used if the client closes the connection
        after sending its request but before receiving all the
        response.
        N)r   r   r   s     r   r   z"HTTP1Connection.set_close_callback=  s      (r    c                     | j         | j         }d | _          |             | j                                        st          | j        d            |                                  d S r   )r   rS   r   r   rU   r   s     r   r   z$HTTP1Connection._on_connection_closeK  sk     ++H#'D HJJJ"'')) 	J.t/BDIIIr    c                     | j         | j                                          |                                  | j                                        st          | j        d            d S d S r   )rI   rr   rU   rS   r   r   r   s    r   rr   zHTTP1Connection.closeW  sm    ;"K"'')) 	J.t/BDIIIII	J 	Jr    c                     |                                   | j        }d| _        | j                                        st	          | j        d           |S )a>  Take control of the underlying stream.

        Returns the underlying `.IOStream` object and stops all further
        HTTP processing.  May only be called during
        `.HTTPMessageDelegate.headers_received`.  Intended for implementing
        protocols like websockets that tunnel over an HTTP handshake.
        N)rU   rI   rS   r   r   )r   rI   s     r   detachzHTTP1Connection.detach^  sT     	"'')) 	J.t/BDIIIr    timeoutc                     || _         dS )ztSets the body timeout for a single request.

        Overrides the value from `.HTTP1ConnectionParameters`.
        N)rP   )r   r   s     r   set_body_timeoutz HTTP1Connection.set_body_timeoutm  s    
 %r    r@   c                     || _         dS )zwSets the body size limit for a single request.

        Overrides the value from `.HTTP1ConnectionParameters`.
        N)rO   )r   r@   s     r   set_max_body_sizez!HTTP1Connection.set_max_body_sizet  s    
 ,r    r   r   chunkFuture[None]c                    g }| j         r{t          |t          j                  sJ || _        |                    t          |d         d|d         d                     |j        dv od|vod|vp|d         dk    | _        nt          |t          j	                  sJ | j        J | j
        J || _        |                    t          d
|d         |d         fz                       | j        j        dk    o6| j        j        dk    o&|j        dvo|j        dk     p
|j        dk    od|vod|v| _        | j        j        dk    r| j        rd|d<   | j        j        dk    r6| j
                            dd                                          dk    rd|d<   | j        rd|d<   | j         s;| j        j        dk    s#t#          t          j	        |          j        dk    rd| _        n&d|v rt'          |d                   | _        nd	| _        d |                                D             }|                    d |D                        |D ]%}d|v rt-          dt/          |          z             &d	}| j                                        rPt5                      x}| _        |                    t;          j                               |                                 nt5                      x}| _        d                     |          dz   }|r|| !                    |          z  }| j        "                    |          | _#        tI          | j#        | j%                   |S )z+Implements `.HTTPConnection.write_headers`.r       z	 HTTP/1.1)POSTPUTPATCHri   rj   chunkedNzHTTP/1.1 %d %s   HTTP/1.1re   )   rf   rg   rh   rr   
ConnectionzHTTP/1.0 
keep-alivez
Keep-Aliverf   c              3   `   K   | ])\  }}t          |          d z   t          |          z   V  *dS )z: N)r   ).0nvs      r   	<genexpr>z0HTTP1Connection.write_headers.<locals>.<genexpr>  sM       
 
59QJqMMD :a==0
 
 
 
 
 
r    c              3   @   K   | ]}|                     d           V  dS )latin1N)encode)r   lines     r   r   z0HTTP1Connection.write_headers.<locals>.<genexpr>  s.      DDtT[[**DDDDDDr       
zNewline in header:    
s   

)&rJ   ry   r	   RequestStartLinerV   appendr   r{   rY   rz   rX   rW   versionr|   rT   r~   lowerr   rZ   rE   get_allextend
ValueErrorreprrI   r   r   r   set_exceptionr
   rp   	exceptionjoin_format_chunkr   r[   r   _on_write_complete)	r   r   r   r   linesheader_linesr   futuredatas	            r   write_headerszHTTP1Connection.write_headers{  s    > 1	5j(*CDDDDD'1D$LL*Q---AOPPQQQ !%== $G3 (w6 A23y@ !! j(*DEEEEE+777(444(2D%LL.*Q-A1OOPPQQQ
 (0J> 7,3v=7 O:57  _s*Djo.D7 %G37 (w6! !( (0J>>. ? )0% (0J>>)--lB??EEGG<WW(4%  	5+4G'(~ 	4$+v55H.
;;@CGG/0D,,((/27;K3L/M/MD,,/3D,
 
=D__=N=N
 
 
 	DD|DDDDDD 	E 	ED}} !6d!CDDD ; 
	S*0((2FT'  !;!=!=>>>*0((2FT'<<&&4D 2**5111"&+"3"3D"9"9D$T%8$:QRRRr    c                     | j         U| xj         t          |          z  c_         | j         dk     r-| j                                         t	          j        d          | j        r*|r(t          dt          |          z            dz   |z   dz   S |S )Nr   z,Tried to write more data than Content-Lengthz%xr   )rZ   lenrI   rr   r	   HTTPOutputErrorrY   r   )r   r   s     r   r   zHTTP1Connection._format_chunk  s    +7,,E

:,,/!33!!###.B     	U 	 s5zz)**W4u<wFFLr    c                    d}| j                                         rZt                      x}| _        | j                            t          j                               | j                                         nat                      x}| _        | j                             | 	                    |                    | _
        t          | j
        | j                   |S )zImplements `.HTTPConnection.write`.

        For backwards compatibility it is allowed but deprecated to
        skip `write_headers` and instead call `write()` with a
        pre-encoded header block.
        N)rI   r   r   r   r   r
   rp   r   r   r   r[   r   r   )r   r   r   s      r   r   zHTTP1Connection.write  s     ; 	S*0((2FT',,X-G-I-IJJJ((*****0((2FT'"&+"3"3D4F4Fu4M4M"N"ND$T%8$:QRRRr    c                 P   | j         Y| j         dk    rN| j                                        s5| j                                         t	          j        d| j         z            | j        rW| j                                        s>| j                            d          | _        | j        	                    | j
                   d| _        | j        sd| _        | j                            d           | j        |                     d           dS t!          | j        | j                   dS )z$Implements `.HTTPConnection.finish`.Nr   z0Tried to write %d bytes less than Content-Lengths   0

T)rZ   rI   r   rr   r	   r   rY   r   r[   add_done_callbackr   rQ   rR   rT   set_nodelay_finish_requestr   r   s    r   r   zHTTP1Connection.finish  s5    ,80A55K&&(( 6 K*B23     	O;%%'' O&*k&7&7&E&E##55d6MNNN# " 	.)-D& 	%%%&  &&&&&$T%8$:NOOOOOr    r   c                 D   |                                 }|.t          |t          j                  s|                                 | j        -| j        }d | _        | j        j                            |           | j	         | j	        }d | _	        t          |d            d S d S r   )r   ry   r
   rp   resultr   rI   rn   add_callbackr   r   )r   r   excr   s       r   r   z"HTTP1Connection._on_write_complete  s      ?:c83M#N#N?MMOOO++H#'D K,,X666)'F!%D.vt<<<<< *)r    c                 ,   | j         j        rdS |                    d          }||                                }|j        dk    r|dk    S d|v s?|                    dd                                          dk    st          |d	d           d
v r|dk    S dS )NFr   r   rr   ri   rj   r   r   r{   )re   GETr   )rK   r<   r~   r   r   getattr)r   r   r   connection_headers       r   rw   zHTTP1Connection._can_keep_alive'  s     ;$ 	5#KK55( 1 7 7 9 9++$//''{{.3399;;yHHz8T22oEE %44ur    Optional[Future[None]]c                 
   |                                   | j        s| j        r|                                  d S | j                            d           | j                                        st          | j        d            d S d S )NF)	rU   rJ   rT   rr   rI   r   rS   r   r   )r   r   s     r   r   zHTTP1Connection._finish_request;  s    ~ 	$"< 	JJLLLF 	&&&"'')) 	J.t/BDIIIII	J 	Jr    r   c                 &   t          |                    d                                        d          }|                    d          }|d |                             d          }t
          j                            ||d                    }||fS )Nr   z

)r   decodelstripfindrstripr	   HTTPHeadersparse)r   r   data_streolr   r   s         r   rt   zHTTP1Connection._parse_headersF  s    
 dkk(3344;;FCCmmD!!dsd^**400
&,,Xcdd^<<7""r    r|   c                 6   d|v rd|v rt          j        d          d|d         v r^t          j        d|d                   t	          fdD                       rt          j        d|d         z            d         |d<   	 t          |d                   }n+# t          $ r t          j        d	|d         z            w xY wt          t
          |          | j        k    rt          j        d
          nd }|dk    r!d|v s|dvrt          j        d|z            d}|| 	                    ||          S |
                    dd                                          dk    r|                     |          S | j        r|                     |          S d S )Nri   rj   z7Response with both Transfer-Encoding and Content-Length,z,\s*c              3   0   K   | ]}|d          k    V  dS )r   Nr   )r   ipiecess     r   r   z-HTTP1Connection._read_body.<locals>.<genexpr>e  s+      66!qF1I~666666r    z$Multiple unequal Content-Lengths: %rr   z*Only integer Content-Length is allowed: %szContent-Length too longr   )Nr   z*Response with code %d should not have bodyr   r   )r	   r}   resplitanyrE   r   r   rO   _read_fixed_bodyr~   r   _read_chunked_bodyrJ   _read_body_until_close)r   r|   r   r\   content_lengthr   s        @r   r   zHTTP1Connection._read_bodyR  s    w&&"g-- -M   g./// '73C+DEE6666v66666 "1>!"234   -31I()!$W-=%>!?!?   -@./0   C((4+>>>-.GHHH ? "N3;; #g--y1P1P-@4G   N%((BBB;;*B//55779DD**8444> 	9..x888ts   B (Cr   c                 p  K   |dk    r| j                             t          | j        j        |          d           d {V }|t          |          z  }| j        r| j        rKt          t                    5  |
                    |          }|| d {V  d d d            n# 1 swxY w Y   |dk    d S d S )Nr   Tpartial)rI   
read_bytesminrK   r=   r   rQ   rJ   r&   r   data_received)r   r   r\   bodyrets        r   r   z HTTP1Connection._read_fixed_body  s,      q  //DK*N;;T 0        D c$ii'N' "4> "-g66 " ""0066C!							" " " " " " " " " " " " " " " q      s   7 B##B'*B'c                 
  K   d}	 | j                             dd           d {V }t          |                                d          }|dk    r<| j                             d           d {V }|dk    rt          j        d          d S ||z  }|| j        k    rt          j        d	          |}|r| j                             t          || j	        j
                  d
           d {V }|t          |          z  }| j        r| j        rKt          t                    5  |                    |          }|| d {V  d d d            n# 1 swxY w Y   || j                             d           d {V }|dk    sJ )Nr   Tr   @   rb      r   z%improperly terminated chunked requestzchunked body too larger   )rI   
read_untilrE   stripr   r	   r}   rO   r   rK   r=   r   rQ   rJ   r&   r   r   )	r   r\   
total_sizechunk_len_str	chunk_lencrlfbytes_to_readr   r   s	            r   r   z"HTTP1Connection._read_chunked_body  s+     
	#"&+"8"8B"8"O"OOOOOOOMM//11266IA~~![33A666666667??"1?   )#JD///-.FGGG%M 	&"k44t{'=>> 5         U++ &t~ &1':: & &&44U;;?"%IIIIIII& & & & & & & & & & & & & & &   	& //22222222D7????5	#s   " EEEc                    K   | j                                          d {V }| j        r| j        rNt	          t
                    5  |                    |          }|| d {V  d d d            d S # 1 swxY w Y   d S d S r   )rI   read_until_closerQ   rJ   r&   r   r   )r   r\   r   r   s       r   r   z&HTTP1Connection._read_body_until_close  s       [1133333333# 	t~ 	)'22  ,,T22?IIIIIII                 	 	s    A11A58A5NNr!   r   )r   r   r   N)r   r   r   N)-r"   r#   r$   r4   r
   IOStreamrD   r   r;   objectr   r	   HTTPMessageDelegater   r`   r_   rU   r   r   r   rr   r   rF   r   rE   r   r   r   rz   r   bytesr   r   r   r   r   rw   r   r   strrt   r   r   r   r   r   r    r   rH   rH   h   s         7;$(7# 7#!7# 7# 23	7#
 &!7# 
7# 7# 7# 7#r,h&B ,yQU , , , ,xH,H xT x x x xt
1 
1 
1 
1(8HRX4F+G (D ( ( ( (
  
  
  
 J J J J)    % %$ % % % %,s ,t , , , , "&	[ [(3X5OOP[ %[ 	[
 
[ [ [ [z5 U     5 ^    $P P P P@= = = ="3>F>R	   (	J 	J 	J 	J
#5 
#U38L3L-M 
# 
# 
# 
#88 %8 .	8
 
)D/	"8 8 8 8t"!"-5-I"	" " " "#1M #RV # # # #> 4	     r    rH   c                       e Zd ZdZdej        deddfdZdeej	        ej
        f         dej        deed                  fd	Zd
eddfdZddZddZdS )r^   zDWraps an `HTTPMessageDelegate` to decode ``Content-Encoding: gzip``.r\   r=   r   Nc                 0    || _         || _        d | _        d S r   )	_delegate_chunk_size_decompressor)r   r\   r=   s      r   r   z_GzipMessageDelegate.__init__  s    !%!r    r   r   c                     |                     dd                                          dk    r2t                      | _        |                    d|d                    |d= | j                            ||          S )NzContent-Encodingr   gzipzX-Consumed-Content-Encoding)r~   r   r   r  addr  rx   )r   r   r   s      r   rx   z%_GzipMessageDelegate.headers_received  sv    
 ;;)2..4466&@@!1!3!3D KK5w?Q7RSSS*+~..z7CCCr    r   c                 L  K   | j         rt|}|rn| j                             || j                  }|r$| j                            |          }|| d {V  | j         j        }|r|st          j        d          |ld S d S | j                            |          }|
| d {V  d S d S )Nz8encountered unconsumed gzip data without making progress)r  rB   r  r  r   unconsumed_tailr	   r}   )r   r   compressed_datadecompressedr   s        r   r   z"_GzipMessageDelegate.data_received  s       	#O! #1<<#T%5      ".66|DDC!							"&"4"D" < "1R   "      ...u55C									 r    c                     | j         *| j                                         }|rt          d          | j                                        S )Nz:decompressor.flush returned data; possible truncated input)r  flushr   r  r   )r   tails     r   r   z_GzipMessageDelegate.finish  sT    )%++--D 	 !P   ~$$&&&r    c                 4    | j                                         S r   )r  rs   r   s    r   rs   z(_GzipMessageDelegate.on_connection_close  s    ~11333r    r!   )r"   r#   r$   r4   r	   r  rE   r   r   r   rz   r   r   r   rx   r  r   r   rs   r   r    r   r^   r^     s        NN"!= "3 "SW " " " "
D(3X5OOPD %D 
)D/	"	D D D D 4    *' ' ' '4 4 4 4 4 4r    r^   c            	           e Zd ZdZ	 	 ddej        dee         dee         ddfdZ	ddZ
d	ej        ddfd
Zd	ej        ddfdZdS )HTTP1ServerConnectionzAn HTTP/1.x server.NrI   rK   rL   r   c                 ^    || _         |t                      }|| _        || _        d| _        dS )z
        :arg stream: an `.IOStream`
        :arg params: a `.HTTP1ConnectionParameters` or None
        :arg context: an opaque application-defined object that is accessible
            as ``connection.context``
        N)rI   r;   rK   rL   _serving_future)r   rI   rK   rL   s       r   r   zHTTP1ServerConnection.__init__  s7     >.00F#r    c                    K   | j                                          | j        J 	 | j         d{V  dS # t          $ r Y dS w xY w)zmCloses the connection.

        Returns a `.Future` that resolves after the serving loop has exited.
        N)rI   rr   r%  	Exceptionr   s    r   rr   zHTTP1ServerConnection.close  su      
 	 #///	&&&&&&&&&& 	 	 	DD	s   5 
AAr\   c                     t          |t          j                  sJ t          j        |                     |                    }|| _        | j        j        	                    |d            dS )znStarts serving requests on this connection.

        :arg delegate: a `.HTTPServerConnectionDelegate`
        c                 *    |                                  S r   )r   )fs    r   <lambda>z5HTTP1ServerConnection.start_serving.<locals>.<lambda>/  s    ahhjj r    N)
ry   r	   HTTPServerConnectionDelegater   convert_yielded_server_request_loopr%  rI   rn   
add_future)r   r\   futs      r   start_servingz#HTTP1ServerConnection.start_serving&  sh    
 (H$IJJJJJ!$";";H"E"EFF"&&s,@,@AAAAAr    c                   K   	 	 t          | j        d| j        | j                  }|                    | |          }	 |                    |           d {V }n# t          j        t          j        t          j
        f$ r Y |                    |            d S t          $ r- |                                 Y |                    |            d S t          $ rC t          j        dd           |                                 Y |                    |            d S w xY w|s	 |                    |            d S t          j        d           d {V  L# |                    |            w xY w)NTFr/   r0   r   )rH   rI   rK   rL   start_requestr`   r
   rp   UnsatisfiableReadErrorasyncioCancelledErroron_closer   rr   r'  r   r2   sleep)r   r\   connrequest_delegater   s        r   r.  z*HTTP1ServerConnection._server_request_loop1  s     	$'&t{E4;UU#+#9#9$#E#E  $ 2 23C D DDDDDDDCC.3*   
  d##### '   JJLLL d##### !   M"6FFFFJJLLL
 d#####   d##### mA&&&&&&&&&+'. d####sL   8E A E &D?E D4E 3D?E DE 5E E(r  r!   )r"   r#   r$   r4   r
   r  r   r;   r  r   rr   r	   r,  r1  r.  r   r    r   r#  r#    s        
 7;$(	$ $!$ 23$ &!	$
 
$ $ $ $&   	Bh&K 	BPT 	B 	B 	B 	B$ =$	$ $ $ $ $ $r    r#  )'r4   r5  r5   r   r8   tornado.concurrentr   r   r   tornado.escaper   r   tornador   r	   r
   tornado.logr   r   tornado.utilr   typingr   r   r   r   r   r   r   r'  r   r  r&   r;   HTTPConnectionrH   r  r^   r#  r   r    r   <module>rB     s;    
   				          
 , + + + + + + +                   ( ( ( ( ( ( ( ( ) ) ) ) ) ) K J J J J J J J J J J J J J J J J J    i   
" " " " "v " " "0% % % % % % % %BY	 Y	 Y	 Y	 Y	h- Y	 Y	 Y	x;4 ;4 ;4 ;4 ;487 ;4 ;4 ;4|J$ J$ J$ J$ J$F J$ J$ J$ J$ J$r    