Ë
    êmxi·“  ã                   ó  — 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  ej:                  d«      Z G d„ de«      Z  G d„ d«      Z! G d„ d«      Z" G d„ dejF                  «      Z$ G d„ dejJ                  «      Z& G d„ d«      Z' ej:                  d«      Z( ej:                  d«      Z)de*de+fd„Z,de*de+fd„Z-dej\                  de/fd„Z0y) 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ÚTuples   |
c                   ó   — e Zd Zdd„Zy)Ú_QuietExceptionNc                  ó   — y ©N© ©Úselfs    úN/home/htdocs/ttos/venv/lib/python3.12/site-packages/tornado/http1connection.pyÚ__init__z_QuietException.__init__-   ó   € Øó    ©ÚreturnN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   ,   s   „ ôr   r   c                   ón   — 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y)Ú_ExceptionLoggingContextz°Used 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                 ó   — || _         y r   )r'   )r   r'   s     r   r   z!_ExceptionLoggingContext.__init__7   s	   € Øˆ�r   c                  ó   — y r   r   r   s    r   Ú	__enter__z"_ExceptionLoggingContext.__enter__:   r   r   ÚtypzOptional[Type[BaseException]]ÚvalueÚtbc                 ó’   — |�E|€J ‚t        |t        j                  «      ry | j                  j	                  d|||f¬«       t
        ‚y )NúUncaught exception©Úexc_info)Ú
isinstancer	   ÚHTTPInputErrorr'   Úerrorr   )r   r+   r,   r-   s       r   Ú__exit__z!_ExceptionLoggingContext.__exit__=   sQ   € ð ÐØ�?Ð"�?ä˜%¤×!8Ñ!8Ô9ØØ�K‰K×ÑÐ2¸cÀ5È"Ð=MÐÔNÜ!Ð!ð r   r    )r"   r#   r$   Ú__doc__ÚloggingÚLoggerr   r*   r   ÚBaseExceptionÚtypesÚTracebackTyper5   r   r   r   r&   r&   1   sY   „ ñð
˜wŸ~™~ð °$ó óð"à,ð"ð ˜Ñ&ð"ð ×Ñð	"ð
 
ô"r   r&   c                   óf   — 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y)ÚHTTP1ConnectionParametersz?Parameters for `.HTTP1Connection` and `.HTTP1ServerConnection`.NÚno_keep_aliveÚ
chunk_sizeÚmax_header_sizeÚheader_timeoutÚmax_body_sizeÚbody_timeoutÚ
decompressr!   c                 óv   — || _         |xs d| _        |xs d| _        || _        || _        || _        || _        y)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@   rA   rB   rC   rD   )r   r>   r?   r@   rA   rB   rC   rD   s           r   r   z"HTTP1ConnectionParameters.__init__O   sD   € ð* +ˆÔØ$Ò-¨ˆŒØ.Ò7°%ˆÔØ,ˆÔØ*ˆÔØ(ˆÔØ$ˆ�r   )FNNNNNF)	r"   r#   r$   r6   Úboolr   ÚintÚfloatr   r   r   r   r=   r=   L   sƒ   „ ÙIð $Ø$(Ø)-Ø*.Ø'+Ø(,Ø ñ%àð%ð ˜S‘Mð%ð " #™ð	%ð
 ! ™ð%ð   ‘}ð%ð ˜u‘oð%ð ð%ð 
ô%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j6                  ej8                  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j6                  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,y).ÚHTTP1Connectionz…Implements 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| _        | j!                  «        d| _        d| _        d| _        d| _        d| _        d| _        y)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)rL   rK   r=   rM   rN   r>   rB   Úmax_buffer_sizeÚ_max_body_sizerC   Ú_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   rK   rL   rM   rN   s        r   r   zHTTP1Connection.__init__t   sí   € ð #ˆŒØˆŒØˆ>Ü.Ó0ˆFØˆŒØˆŒØ#×1Ñ1ˆÔð
 �{‰{×(Ñ(Ð4ð �K‰K×%Ò%à—‘×,Ñ,ð 	Ôð
 "Ÿ[™[×5Ñ5ˆÔð  %ˆÔà#ˆÔô %›hˆÔð &+ˆÔ"Ø×ÑÔð $(ˆÔ Ø$(ˆÔ!Ø $ˆÔà %ˆÔð ,0ˆÔ(à"ˆÕr   Údelegatec                 ó�   — | j                   j                  r t        || j                   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.
        )rM   rD   Ú_GzipMessageDelegater?   Ú_read_message)r   r^   s     r   Úread_responsezHTTP1Connection.read_response­   s8   € ð �;‰;×!Ò!Ü+¨H°d·k±k×6LÑ6LÓMˆHØ×!Ñ! (Ó+Ð+r   c              ƒ   ó„  K  — d}	 | j                   j                  d| j                  j                  ¬«      }| j                  j                  €|ƒ d {  –—† }nh	 t        j                  | j                   j                  j                  «       | j                  j                  z   |t        j                  ¬«      ƒ d {  –—† }| j#                  |«      \  }}| j$                  r&t'        j(                  |«      }|| _        |}d| _        n=t'        j.                  |«      }	|	| _        || _        |	}| j5                  |	|«       | _        d}t        t        «      5  |j7                  ||«      }
|
�
|
ƒ d {  –—†  d d d «       | j                   €@d}	 |r(t        t        «      5  |j                  «        d d d «       d }| j!                  «        yd}| j$                  ržt9        |t&        j:                  «      sJ ‚| j0                  �| j0                  j<                  dk(  rd}|j>                  }|dk(  rd}d|cxk  rd	k  rxn nud
|v sd|v rt'        j@                  d|z  «      ‚| jC                  |«      ƒ d {  –—†  n;|jE                  d«      dk(  r'| jF                  s| j                   jI                  d«       |s¢| jK                  | j$                  rj>                  nd||«      }|�u| jL                  €|ƒ d {  –—†  n^	 t        j                  | j                   j                  j                  «       | jL                  z   |t        j                  ¬«      ƒ d {  –—†  d| _*        | jF                  r| j$                  r*d}t        t        «      5  |jW                  «        d d d «       | jX                  j[                  «       s_| j                   �S| j                   j]                  «       s9| j                   j_                  | j`                  «       | jX                  ƒ d {  –—†  | j$                  r| j,                  r| j                  «        | j                   €>	 |r(t        t        «      5  |j                  «        d d d «       d }| j!                  «        y	 |r(t        t        «      5  |j                  «        d d d «       d }| j!                  «        y7 �Œr7 �Œ# t
        j                  $ r\ | j                  «        Y |r5t        t        «      5  |j                  «        d d d «       n# 1 sw Y   nxY wd }| j!                  «        yw xY w7 �ŒÎ# 1 sw Y   �ŒÎxY w# 1 sw Y   �Œ¢xY w7 �Œì7 �Œn7 �Œ# t
        j                  $ r† tO        jP                  d| jR                  «       | j                   j                  «        Y |r5t        t        «      5  |j                  «        d d d «       n# 1 sw Y   nxY wd }| j!                  «        yw xY w# 1 sw Y   �ŒmxY w7 �Œü# 1 sw Y   �Œ¥xY w# t&        j@                  $ r´}tO        jP                  d| jR                  |«       | j$                  s$| j                   jI                  d«      ƒ d {  –—†7   | j                  «        Y d }~|r5t        t        «      5  |j                  «        d d d «       n# 1 sw Y   nxY wd }| j!                  «        yd }~ww xY w# 1 sw Y   �Œ>xY w# |r5t        t        «      5  |j                  «        d d d «       n# 1 sw Y   nxY wd }| j!                  «        w xY w­w)NFs   ?
?
©Ú	max_bytes)Úquiet_exceptionsTÚHEADé0  é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

)1rK   Úread_until_regexrM   r@   rA   r   Úwith_timeoutÚio_loopÚtimer
   ÚStreamClosedErrorÚTimeoutErrorÚcloser&   r   Úon_connection_closerW   Ú_parse_headersrL   r	   Úparse_response_start_linerY   rV   Úparse_request_start_linerX   rZ   Ú_can_keep_aliveÚheaders_receivedr2   ÚResponseStartLineÚmethodÚcoder3   ra   ÚgetrS   ÚwriteÚ
_read_bodyrR   r   ÚinforN   rT   ÚfinishrU   Ú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   ra   zHTTP1Connection._read_message¼   sU  è ø€ Ø#Ððu	$Ø ŸK™K×8Ñ8Ø¨¯©×)DÑ)Dð 9ó ˆMð �{‰{×)Ñ)Ð1Ø$1×1‘ð!Ü(+×(8Ñ(8ØŸ™×+Ñ+×0Ñ0Ó2°T·[±[×5OÑ5OÑOØ%Ü)1×)CÑ)Cô)÷ #�Kð '+×&9Ñ&9¸+Ó&FÑ#ˆN˜GØ�~Š~Ü"*×"DÑ"DÀ^Ó"T�Ø,;�Ô)à#ð ð .3�Õ*ä!)×!BÑ!BÀ>Ó!R�Ø+9�Ô(Ø(/�Ô%Ø+�
Ø15×1EÑ1EØ" Gó2ð .�Ô*ð #'ÐÜ)¬'Ó2ñ -Ø%-×%>Ñ%>¸zÈ7Ó%SÐ"Ø%Ð1Ø,×,Ð,÷-ð �{‰{Ð"à&+Ð#ØñP #Ü-¬gÓ6ñ 3Ø×0Ñ0Ô2÷3à ˆMØ×!Ñ!Õ#ðW ˆIØ�~Š~Ü! *¬h×.HÑ.HÔIÐIÐIà×,Ñ,Ð8Ø×0Ñ0×7Ñ7¸6ÒAà $�IØ!—‘�Ø˜3’;ð !%�IØ˜$Ô$ Õ$ð (¨7Ñ2Ð6IÈWÑ6TÜ&×5Ñ5Ø?À$ÑFóð ð
 ×,Ñ,¨XÓ6×6Ñ6à—;‘;˜xÓ(¨NÒ:À4×CWÒCWØ—K‘K×%Ñ%Ð&HÔIÙØ"Ÿo™oØ,0¯NªN�O×(Ò(ÀÀ7ÈHó�ð Ð*Ø×)Ñ)Ð1Ø)×)Ñ)ð	)Ü"%×"2Ñ"2Ø $§¡× 3Ñ 3× 8Ñ 8Ó :¸T×=OÑ=OÑ OØ +Ü19×1KÑ1Kô#÷ ð ð #'ˆDÔØ×'Ò'¨4¯>ª>Ø&+Ð#Ü-¬gÓ6ñ &Ø—O‘OÔ%÷&ð ×'Ñ'×,Ñ,Ô.Ø—K‘KÐ+ØŸ™×*Ñ*Ô,à—‘×.Ñ.¨t×/HÑ/HÔIØ×)Ñ)×)Ð)Ø�~Š~ $×"<Ò"<Ø—
‘
”Ø�{‰{Ð"Øñ #Ü-¬gÓ6ñ 3Ø×0Ñ0Ô2÷3à ˆMØ×!Ñ!Õ#ð #ñ #Ü-¬gÓ6ñ 3Ø×0Ñ0Ô2÷3à ˆMØ×!Ñ!Ô#Øðc 2ùð#úô
 ×'Ñ'ò !Ø—J‘J”LØ ñD #Ü-¬gÓ6ñ 3Ø×0Ñ0Ô2÷3÷ 3ñ 3úà ˆMØ×!Ñ!Õ#ðQ!úð0 -ù÷-ñ -ú÷`3ñ 3úðc 7ùð *ùðúô
  #×/Ñ/ò )Ü#ŸL™LÐ)GÈÏÉÔVØ ŸK™K×-Ñ-Ô/Ø#(ñ6 #Ü-¬gÓ6ñ 3Ø×0Ñ0Ô2÷3÷ 3ñ 3úà ˆMØ×!Ñ!Õ#ðE)ú÷&ñ &úð *ù÷3ñ 3ûô ×&Ñ&ò 	Ü�L‰LÐ=¸t¿|¹|ÈQÔOØ—>’>Ø—k‘k×'Ñ'Ð(KÓL×LÑLØ�J‰JŒLÛá"Ü-¬gÓ6ñ 3Ø×0Ñ0Ô2÷3÷ 3ñ 3úà ˆMØ×!Ñ!Õ#ûð	ú÷3ñ 3ûñ #Ü-¬gÓ6ñ 3Ø×0Ñ0Ô2÷3÷ 3ñ 3úà ˆMØ×!Ñ!Õ#üs  ‚] †AX ÁSÁX ÁA"S
 Â;SÂ<S
 Ã BX ÅT?Å.T<Å/T?Å3X Æ
] ÆUÆ,] ÇB&X É-UÉ.B X Ë.UË/X Ë5AU" ÍUÍU" Í0X ÎW>ÎA<X ÐXÐ8X Ñ	] ÑXÑ+] Ò] Ò[%Ò)] ÓX ÓS
 Ó
#T9Ó-X Ó.] Ó?TÔ	] ÔT"Ô] Ô8T9Ô9X Ô<T?Ô?U	ÕX ÕUÕ] ÕX ÕX ÕU" Õ"AW;Ö/X Ö0] ×W×	] ×W$× ] ×:W;×;X ×>XØ	X ØXØ] Ø["Ø.A[Ù9Y<Ù:[Ú[2 Ú] Ú$Z>Ú5	] Ú>[Û] Û["Û"[2 Û%[/Û*] Û2\=Ü\Ü	\=Ü\'Ü#\=Ü=] c                 ó~   — d| _         d| _        d| _        | j                  �| j                  j	                  d«       yy)zªClears 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_callbackrK   r…   r   s    r   rW   z HTTP1Connection._clear_callbacks6  s=   € ð  $ˆÔØ!ˆÔØ#ˆÔØ�;‰;Ð"Ø�K‰K×*Ñ*¨4Õ0ð #r   Úcallbackc                 ó   — || _         y)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_callbackB  s   € ð  (ˆÕr   c                 óÐ   — | j                   �| j                   }d | _          |«        | j                  j                  «       st        | j                  d «       | j	                  «        y r   )r–   rU   rƒ   r   rW   r™   s     r   r†   z$HTTP1Connection._on_connection_closeP  sV   € ð ×ÑÐ+Ø×+Ñ+ˆHØ#'ˆDÔ ÙŒJØ×"Ñ"×'Ñ'Ô)Ü.¨t×/BÑ/BÀDÔIØ×ÑÕr   c                 óÒ   — | j                   �| j                   j                  «        | j                  «        | j                  j	                  «       st        | j                  d «       y y r   )rK   rt   rW   rU   rƒ   r   r   s    r   rt   zHTTP1Connection.close\  sO   € Ø�;‰;Ð"Ø�K‰K×ÑÔØ×ÑÔØ×"Ñ"×'Ñ'Ô)Ü.¨t×/BÑ/BÀDÕIð *r   c                 ó¬   — | j                  «        | j                  }d| _        | j                  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)rW   rK   rU   rƒ   r   )r   rK   s     r   ÚdetachzHTTP1Connection.detachc  sG   € ð 	×ÑÔØ—‘ˆØˆŒØ×"Ñ"×'Ñ'Ô)Ü.¨t×/BÑ/BÀDÔIØˆr   Útimeoutc                 ó   — || _         y)ztSets the body timeout for a single request.

        Overrides the value from `.HTTP1ConnectionParameters`.
        N)rR   )r   rž   s     r   Úset_body_timeoutz HTTP1Connection.set_body_timeoutr  s   € ð
 %ˆÕr   rB   c                 ó   — || _         y)zwSets the body size limit for a single request.

        Overrides the value from `.HTTP1ConnectionParameters`.
        N)rQ   )r   rB   s     r   Úset_max_body_sizez!HTTP1Connection.set_max_body_sizey  s   € ð
 ,ˆÕr   r�   r‹   ÚchunkúFuture[None]c                 óò  — g }| j                   rdt        |t        j                  «      sJ ‚|| _        |j                  t        |d   › d|d   › d�«      «       |j                  dv xr d|v| _        �nJt        |t        j                  «      sJ ‚| j                  €J ‚| j                  €J ‚|| _        |j                  t        d|d   |d	   fz  «      «       | j                  j                  d
k(  xrQ | j                  j                  dk7  xr6 |j                  dvxr& |j                  dk  xs |j                  dk\  xr d|v| _        | j                  j                  d
k(  r| j                  rd|d<   | j                  j                  dk(  r2| j                  j                  dd«      j!                  «       dk(  rd|d<   | j                  rd|d<   | j                   sH| j                  j                  dk(  s't#        t        j                  |«      j                  dk(  rd| _        nd|v rt'        |d   «      | _        nd| _        d„ |j)                  «       D «       }|j+                  d„ |D «       «       |D ]%  }t,        j/                  |«      sŒt1        d|z  «      ‚ d}| j2                  j5                  «       rFt7        «       x}| _        |j;                  t=        j>                  «       «       |jA                  «        |S t7        «       x}| _        djC                  |«      dz   }|r|| jE                  |«      z  }| j2                  jG                  |«      | _$        tK        | jH                  | jL                  «       |S )z+Implements `.HTTPConnection.write_headers`.r   ú é   z	 HTTP/1.1)ÚPOSTÚPUTÚPATCHrk   NzHTTP/1.1 %d %sé   úHTTP/1.1rg   )éÌ   rh   ri   rj   rt   Ú
ConnectionzHTTP/1.0Ú ú
keep-alivez
Keep-AliveÚchunkedrl   rh   c              3   óV   K  — | ]!  \  }}t        |«      d z   t        |«      z   –— Œ# y­w)z: N)r   )Ú.0ÚnÚvs      r   ú	<genexpr>z0HTTP1Connection.write_headers.<locals>.<genexpr>Â  s+   è ø€ ò 
Ù59°Q¸ŒJ�q‹M˜DÑ ¤:¨a£=Õ0ñ
ùs   ‚')c              3   ó>   K  — | ]  }|j                  d «      –— Œ y­w)Úlatin1N)Úencode)r³   Úlines     r   r¶   z0HTTP1Connection.write_headers.<locals>.<genexpr>Å  s   è ø€ ÒD¨t�T—[‘[ ×*ÑDùs   ‚z+Illegal characters (CR or LF) in header: %ró   
s   

)'rL   r2   r	   ÚRequestStartLinerX   Úappendr   r|   r[   r{   rZ   rY   Úversionr}   rV   r~   Úlowerr   r\   Ú	parse_intÚget_allÚextendÚCR_OR_LF_REÚsearchÚ
ValueErrorrK   r„   r   r•   Úset_exceptionr
   rr   Ú	exceptionÚjoinÚ_format_chunkr   r]   r   Ú_on_write_complete)	r   r�   r‹   r£   ÚlinesÚheader_linesrº   ÚfutureÚdatas	            r   Úwrite_headerszHTTP1Connection.write_headers€  sW  € ð ˆØ�>Š>Ü˜j¬(×*CÑ*CÔDÐDÐDØ'1ˆDÔ$Ø�L‰Lœ ¨A¡ ¨q°¸A±°¸yÐIÓJÔKð
 ×!Ñ!Ð%=Ð=ò 4Ø$¨GÐ3ð Ö!ô
 ˜j¬(×*DÑ*DÔEÐEÐEØ×+Ñ+Ð7Ð7Ð7Ø×(Ñ(Ð4Ð4Ð4Ø(2ˆDÔ%Ø�L‰LœÐ.°*¸Q±-ÀÈAÁÐ1OÑOÓPÔQð
 ×(Ñ(×0Ñ0°JÑ>ò 	4à×,Ñ,×3Ñ3°vÑ=ò	4ð —O‘O¨:Ð5ò	4ð  —_‘_ sÑ*ÒD¨j¯o©oÀÑ.Dò	4ð %¨GÐ3ð Ô!ð" ×(Ñ(×0Ñ0°JÒ>Ø×.Ò.à(/�˜Ñ%ð ×(Ñ(×0Ñ0°JÒ>Ø×)Ñ)×-Ñ-¨l¸BÓ?×EÑEÓGÈ<ÒWà(4�˜Ñ%Ø× Ò Ø+4ˆGÐ'Ñ(Ø�~Š~Ø×$Ñ$×+Ñ+¨vÒ5Ü”H×.Ñ.°
Ó;×@Ñ@ÀCÒGà/0ˆDÕ,Ø Ñ(Ü/8¸ÐAQÑ9RÓ/SˆDÕ,à/3ˆDÔ,ñ
Ø=D¿_¹_Ó=Nô
ˆð 	�‰ÑD°|ÔDÔDØò 	WˆDÜ×!Ñ! $Õ'Ü Ð!NÐQUÑ!UÓVÐVð	Wð ˆØ�;‰;×ÑÔÜ*0«(Ð2ˆF�TÔ'Ø× Ñ ¤×!;Ñ!;Ó!=Ô>Ø×ÑÔð ˆô +1«(Ð2ˆF�TÔ'Ø—<‘< Ó&¨Ñ4ˆDÙØ˜×*Ñ*¨5Ó1Ñ1�Ø"&§+¡+×"3Ñ"3°DÓ"9ˆDÔÜ$ T×%8Ñ%8¸$×:QÑ:QÔRØˆr   c                 ó2  — | j                   �\| xj                   t        |«      z  c_         | j                   dk  r/| j                  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»   )r\   ÚlenrK   rt   r	   ÚHTTPOutputErrorr[   r   )r   r£   s     r   rÉ   zHTTP1Connection._format_chunk×  sŽ   € Ø×+Ñ+Ð7Ø×,Ò,´°E³
Ñ:Õ,Ø×/Ñ/°!Ò3à—‘×!Ñ!Ô#Ü×.Ñ.ØBóð ð × Ò ¡Uô ˜œs 5›zÑ)Ó*¨WÑ4°uÑ<¸wÑFÐFàˆLr   c                 ó²  — d}| j                   j                  «       rZt        «       x}| _        | j                  j	                  t        j                  «       «       | j                  j                  «        |S t        «       x}| _        | j                   j                  | j                  |«      «      | _
        t        | j                  | j                  «       |S )zÒImplements `.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)rK   r„   r   r•   rÆ   r
   rr   rÇ   r   rÉ   r]   r   rÊ   )r   r£   rÍ   s      r   r   zHTTP1Connection.writeç  s¬   € ð ˆØ�;‰;×ÑÔÜ*0«(Ð2ˆF�TÔ'Ø×Ñ×,Ñ,¬X×-GÑ-GÓ-IÔJØ×Ñ×(Ñ(Ô*ð
 ˆô +1«(Ð2ˆF�TÔ'Ø"&§+¡+×"3Ñ"3°D×4FÑ4FÀuÓ4MÓ"NˆDÔÜ$ T×%8Ñ%8¸$×:QÑ:QÔRØˆr   c                 ó¢  — | j                   �e| j                   dk7  rV| j                  j                  «       s<| j                  j                  «        t	        j
                  d| j                   z  «      ‚| j                  r_| j                  j                  «       sE| j                  j                  d«      | _        | j                  j                  | j                  «       d| _        | j                  sd| _        | j                  j                  d«       | j                  €| j                  d«       yt!        | j                  | j                  «       y)z$Implements `.HTTPConnection.finish`.Nr   z0Tried to write %d bytes less than Content-Lengths   0

T)r\   rK   r„   rt   r	   rÒ   r[   r   r]   Úadd_done_callbackrÊ   rS   rT   rV   Úset_nodelayÚ_finish_requestr   r   s    r   r‚   zHTTP1Connection.finishù  s  € ð ×,Ñ,Ð8Ø×0Ñ0°AÒ5Ø—K‘K×&Ñ&Ô(à�K‰K×ÑÔÜ×*Ñ*ØBØ×2Ñ2ñ3óð ð × Ò Ø—;‘;×%Ñ%Ô'Ø&*§k¡k×&7Ñ&7¸Ó&E�Ô#Ø×#Ñ#×5Ñ5°d×6MÑ6MÔNØ#ˆÔð ×"Ò"Ø)-ˆDÔ&ð 	�‰×Ñ Ô%Ø×ÑÐ&Ø× Ñ  Õ&ä$ T×%8Ñ%8¸$×:NÑ:NÕOr   c                 ó\  — |j                  «       }|�*t        |t        j                  «      s|j	                  «        | j
                  �8| j
                  }d | _        | j                  j                  j                  |«       | j                  � | j                  }d | _	        t        |d «       y y r   )rÇ   r2   r
   rr   Úresultr”   rK   rp   Úadd_callbackr•   r   )r   rÍ   Úexcr—   s       r   rÊ   z"HTTP1Connection._on_write_complete  s’   € Ø×ÑÓ ˆØˆ?¤:¨c´8×3MÑ3MÔ#NØ�M‰MŒOØ×ÑÐ+Ø×+Ñ+ˆHØ#'ˆDÔ Ø�K‰K×Ñ×,Ñ,¨XÔ6Ø×ÑÐ)Ø×'Ñ'ˆFØ!%ˆDÔÜ.¨v°tÕ<ð *r   c                 óæ   — | j                   j                  ry|j                  d«      }|�|j                  «       }|j                  dk(  r|dk7  S d|v st        |«      st        |dd «      dv r|dk(  S y)	NFr®   r¬   rt   rk   r|   )rg   ÚGETr°   )rM   r>   r~   r¿   r¾   Úis_transfer_encoding_chunkedÚgetattr)r   r�   r‹   Úconnection_headers       r   ry   zHTTP1Connection._can_keep_alive&  s‚   € ð �;‰;×$Ò$ØØ#ŸK™K¨Ó5ÐØÐ(Ø 1× 7Ñ 7Ó 9ÐØ×Ñ Ò+Ø$¨Ñ/Ð/à Ñ'Ü+¨GÔ4Ü�z 8¨TÓ2°oÑEð %¨Ñ4Ð4Ør   c                 ó  — | j                  «        | j                  s| j                  r| j                  «        y | j                  j                  d«       | j                  j                  «       st        | j                  d «       y y )NF)	rW   rL   rV   rt   rK   rÖ   rU   rƒ   r   )r   rÍ   s     r   r×   zHTTP1Connection._finish_request:  sd   € Ø×ÑÔØ�~Š~ $×"<Ò"<Ø�J‰JŒLØð 	�‰×Ñ Ô&Ø×"Ñ"×'Ñ'Ô)Ü.¨t×/BÑ/BÀDÕIð *r   rÎ   c                 óê   — t        |j                  d«      «      j                  d«      }|j                  d«      }|d | j	                  d«      }t
        j                  j                  ||d  «      }||fS )Nr¸   z
ú
ú)r   ÚdecodeÚlstripÚfindÚrstripr	   ÚHTTPHeadersÚparse)r   rÎ   Údata_strÚeolr�   r‹   s         r   rv   zHTTP1Connection._parse_headersE  sm   € ô
 ˜dŸk™k¨(Ó3Ó4×;Ñ;¸FÓCˆà�m‰m˜DÓ!ˆØ˜d˜s�^×*Ñ*¨4Ó0ˆ
Ü×&Ñ&×,Ñ,¨X°c°d¨^Ó<ˆØ˜7Ð"Ð"r   r}   c                 óz  ‡— d|v r˜d|d   v rPt        j                  d|d   «      Št        ˆfd„‰D «       «      rt        j                  d|d   z  «      ‚‰d   |d<   	 t        |d   «      }t        t        |«      | j                  kD  rt        j                  d«      ‚d }t        |«      }|d	k(  r |s|d
vrt        j                  d|z  «      ‚d}|r| j                  |«      S |�| j                  ||«      S | j                  r| j                  |«      S y # t        $ r t        j                  d|d   z  «      ‚w xY w)Nrk   ú,z,\s*c              3   ó.   •K  — | ]  }|‰d    k7  –— Œ y­w)r   Nr   )r³   ÚiÚpiecess     €r   r¶   z-HTTP1Connection._read_body.<locals>.<genexpr>]  s   øè ø€ Ò6¨!�q˜F 1™I•~Ñ6ùs   ƒ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 body)ÚreÚsplitÚanyr	   r3   rÀ   rÅ   r   rG   rQ   rÞ   Ú_read_chunked_bodyÚ_read_fixed_bodyrL   Ú_read_body_until_close)r   r}   r‹   r^   Úcontent_lengthÚ
is_chunkedrñ   s         @r   r€   zHTTP1Connection._read_bodyQ  su  ø€ ð ˜wÑ&Ø�gÐ.Ñ/Ñ/ô Ÿ™ '¨7Ð3CÑ+DÓE�ÜÓ6¨vÔ6Ô6Ü"×1Ñ1Ø>Ø!Ð"2Ñ3ñ4óð ð -3°1©I�Ð(Ñ)ðÜ09¸'ÐBRÑ:SÓ0T�ô ”C˜Ó(¨4×+>Ñ+>Ò>Ü×-Ñ-Ð.GÓHÐHà!ˆNä1°'Ó:ˆ
à�3Š;ñ ˜^°9Ñ<Ü×-Ñ-Ø@À4ÑGóð ð ˆNáØ×*Ñ*¨8Ó4Ð4ØÐ%Ø×(Ñ(¨¸ÓBÐBØ�>Š>Ø×.Ñ.¨xÓ8Ð8Øøô= ò ä×-Ñ-Ø@ØÐ.Ñ/ñ0óð ðús   ÁD Ä%D:rø   c              ƒ   ó€  K  — |dkD  r¥| j                   j                  t        | j                  j                  |«      d¬«      ƒ d {  –—† }|t        |«      z  }| j                  r| j                  r5t        t        «      5  |j                  |«      }|�
|ƒ d {  –—†  d d d «       |dkD  rŒ¤y y 7 Œg7 Œ# 1 sw Y   ŒxY w­w)Nr   T©Úpartial)rK   Ú
read_bytesÚminrM   r?   rÑ   rS   rL   r&   r   Údata_received)r   rø   r^   ÚbodyÚrets        r   rö   z HTTP1Connection._read_fixed_body†  s±   è ø€ ð ˜qÒ ØŸ™×/Ñ/Ü�D—K‘K×*Ñ*¨NÓ;ÀTð 0ó ÷ ˆDð œc $›iÑ'ˆNØ×'Ò'¨4¯>ª>Ü-¬gÓ6ñ "Ø"×0Ñ0°Ó6�CØ�Ø!Ÿ	˜	÷"ð ˜qÕ ðøð "ø÷"ð "üsB   ‚AB>ÁB.Á9B>Â B2ÂB0ÂB2ÂB>Â,B>Â0B2Â2B;Â7B>c              ƒ   óx  K  — d}	 | j                   j                  dd¬«      ƒ d {  –—† }	 t        t        |d d «      «      }|dk(  r>| j                   j                  d«      ƒ d {  –—† }|dk7  rt        j                  d	«      ‚y ||z  }|| j                  kD  rt        j                  d
«      ‚|}|r¡| j                   j                  t        || j                  j                  «      d¬«      ƒ d {  –—† }|t        |«      z  }| j                  r| j                  r5t        t         «      5  |j#                  |«      }|�
|ƒ d {  –—†  d d d «       |rŒ¡| j                   j                  d«      ƒ d {  –—† }|dk(  sJ ‚�Œz7 �ŒZ# t        $ r t        j                  d«      ‚w xY w7 �Œ?7 Œ¶7 Œe# 1 sw Y   ŒdxY w7 ŒE­w)Nr   Tr»   é@   rd   éþÿÿÿzinvalid chunk sizer«   z%improperly terminated chunked requestzchunked body too largerû   )rK   Ú
read_untilÚparse_hex_intr   rÅ   r	   r3   rý   rQ   rþ   rM   r?   rÑ   rS   rL   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ˆMðDÜ)¬*°]À3ÀBÐ5GÓ*HÓI�	ð ˜AŠ~Ø!Ÿ[™[×3Ñ3°AÓ6×6�Ø˜7’?Ü"×1Ñ1Ø?óð ð Ø˜)Ñ#ˆJØ˜D×/Ñ/Ò/Ü×-Ñ-Ð.FÓGÐGØ%ˆMÙØ"Ÿk™k×4Ñ4Ü˜ t§{¡{×'=Ñ'=Ó>Èð 5ó ÷ �ð ¤ U£Ñ+�Ø×+Ò+¨t¯~ª~Ü1´'Ó:ñ &Ø&×4Ñ4°UÓ;˜Ø˜?Ø"%ŸI˜I÷&ò  ð Ÿ™×/Ñ/°Ó2×2ˆDØ˜7’?Ð"�?ñ; ØOúô ò DÜ×-Ñ-Ð.BÓCÐCðDúð 7ùðøð &ø÷&ð &úð
 3ús�   ‚$F:¦F §F:¬F Á#F:Á&F%Á'B
F:Ã1F(Ã29F:Ä+F,ÅF*ÅF,Å	
F:ÅF:Å2F8Å3F:ÆF"Æ"F:Æ(F:Æ*F,Æ,F5Æ1F:c              ƒ   ó  K  — | j                   j                  «       ƒ d {  –—† }| j                  r| j                  r6t	        t
        «      5  |j                  |«      }|�
|ƒ d {  –—†  d d d «       y y 7 ŒS7 Œ# 1 sw Y   y xY w­wr   )rK   Úread_until_closerS   rL   r&   r   rÿ   )r   r^   r   r  s       r   r÷   z&HTTP1Connection._read_body_until_close¶  sz   è ø€ ð —[‘[×1Ñ1Ó3×3ˆØ×#Ò# t§~¢~Ü)¬'Ó2ñ Ø×,Ñ,¨TÓ2�Ø�?Ø—I�I÷ð ð (6ð 4øð
 ø÷ð üs9   ‚B A4¡+BÁA8Á%A6Á&A8Á*BÁ6A8Á8BÁ=B©NNr    r   )rÍ   r¤   r!   N)rÍ   zOptional[Future[None]]r!   N)-r"   r#   r$   r6   r
   ÚIOStreamrF   r   r=   Úobjectr   r	   ÚHTTPMessageDelegater   rb   ra   rW   r   r…   r†   rt   r�   rH   r    rG   r¢   r   r¼   r{   ré   ÚbytesrÏ   rÉ   r   r‚   rÊ   ry   r×   r   Ústrrv   r€   rö   rõ   r÷   r   r   r   rJ   rJ   m   sn  „ ñð 7;Ø$(ñ7#à×!Ñ!ð7#ð ð7#ð Ð2Ñ3ð	7#ð
 ˜&Ñ!ð7#ð 
ó7#ðr, h×&BÑ&Bð ,ÀyÐQUÁó ,ðx¨H×,HÑ,Hð xÈTó xót
1ð(¨8°H¸RÀ¸XÑ4FÑ+Gð (ÈDó (ó
 óJð˜×)Ñ)ó ð%¨ð %°$ó %ð,¨sð ,°tó ,ð "&ñ	Uà˜(×3Ñ3°X×5OÑ5OÐOÑPðUð ×%Ñ%ðUð ˜‰ð	Uð
 
óUðn 5ð ¨Uó ð ˜5ð  ^ó ó$Pó@=ðØ"×3Ñ3ðØ>F×>RÑ>Rðà	óó(	Jð
# 5ð 
#¨U°3¸×8LÑ8LÐ3LÑ-Mó 
#ð3àð3ð ×%Ñ%ð3ð ×.Ñ.ð	3ð
 
�)˜D‘/Ñ	"ó3ðj"Ø!ð"Ø-5×-IÑ-Ið"à	ó"ð #°×1MÑ1Mð  #ÐRVó  #ðDØ ×4Ñ4ðà	ôr   rJ   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y)r`   zDWraps an `HTTPMessageDelegate` to decode ``Content-Encoding: gzip``.r^   r?   r!   Nc                 ó.   — || _         || _        d | _        y r   )Ú	_delegateÚ_chunk_sizeÚ_decompressor)r   r^   r?   s      r   r   z_GzipMessageDelegate.__init__Ä  s   € Ø!ˆŒØ%ˆÔØ!ˆÕr   r�   r‹   c                 óÎ   — |j                  dd«      j                  «       dk(  r't        «       | _        |j	                  d|d   «       |d= | j
                  j                  ||«      S )NzContent-Encodingr¯   ÚgzipzX-Consumed-Content-Encoding)r~   r¿   r   r  Úaddr  rz   )r   r�   r‹   s      r   rz   z%_GzipMessageDelegate.headers_receivedÉ  sc   € ð
 �;‰;Ð)¨2Ó.×4Ñ4Ó6¸&Ò@Ü!1Ó!3ˆDÔð �K‰KÐ5°wÐ?QÑ7RÔSØÐ*Ð+Ø�~‰~×.Ñ.¨z¸7ÓCÐCr   r£   c              ƒ   óŠ  K  — | j                   r‡|}|r‚| j                   j                  || j                  «      }|r'| j                  j	                  |«      }|�
|ƒ d {  –—†  | j                   j
                  }|r|st        j                  d«      ‚|rŒ�y y | j                  j	                  |«      }|�|ƒ d {  –—†  y y 7 Œa7 Œ­w)Nz8encountered unconsumed gzip data without making progress)r  rD   r  r  rÿ   Úunconsumed_tailr	   r3   )r   r£   Úcompressed_dataÚdecompressedr  s        r   rÿ   z"_GzipMessageDelegate.data_received×  sÀ   è ø€ Ø×ÒØ#ˆOÙ!Ø#×1Ñ1×<Ñ<Ø# T×%5Ñ%5ó �ñ  ØŸ.™.×6Ñ6°|ÓD�CØ�Ø!Ÿ	˜	Ø"&×"4Ñ"4×"DÑ"D�Ù"©<Ü"×1Ñ1ØRóð ô "ð —.‘.×.Ñ.¨uÓ5ˆCØˆØ—	‘	ð ð "øð ús*   ‚ACÁB?Á5CÂ$CÂ8CÂ9CÃCc                 óœ   — | j                   �'| j                   j                  «       }|rt        d«      ‚| j                  j	                  «       S )Nz:decompressor.flush returned data; possible truncated input)r  ÚflushrÅ   r  r‚   )r   Útails     r   r‚   z_GzipMessageDelegate.finishì  sL   € Ø×ÑÐ)Ø×%Ñ%×+Ñ+Ó-ˆDÙô !ØPóð ð �~‰~×$Ñ$Ó&Ð&r   c                 ó6   — | j                   j                  «       S r   )r  ru   r   s    r   ru   z(_GzipMessageDelegate.on_connection_closeû  s   € Ø�~‰~×1Ñ1Ó3Ð3r   r    )r"   r#   r$   r6   r	   r  rG   r   r   r¼   r{   ré   r   r   rz   r  rÿ   r‚   ru   r   r   r   r`   r`   Á  s�   „ ÙNð" ×!=Ñ!=ð "È3ð "ÐSWó "ð
Dà˜(×3Ñ3°X×5OÑ5OÐOÑPðDð ×%Ñ%ðDð 
�)˜D‘/Ñ	"ó	Dð¨ð °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y)ÚHTTP1ServerConnectionzAn HTTP/1.x server.NrK   rM   rN   r!   c                 óT   — || _         |€
t        «       }|| _        || _        d| _        y)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)rK   r=   rM   rN   Ú_serving_future)r   rK   rM   rN   s       r   r   zHTTP1ServerConnection.__init__  s.   € ð ˆŒØˆ>Ü.Ó0ˆFØˆŒØˆŒØ#ˆÕr   c              ƒ   ó¨   K  — | j                   j                  «        | j                  €J ‚	 | j                  ƒ d{  –—†  y7 Œ# t        $ r Y yw xY w­w)zmCloses the connection.

        Returns a `.Future` that resolves after the serving loop has exited.
        N)rK   rt   r'  Ú	Exceptionr   s    r   rt   zHTTP1ServerConnection.close  sQ   è ø€ ð
 	�‰×ÑÔð ×#Ñ#Ð/Ð/Ð/ð	Ø×&Ñ&×&Ò&ùÜò 	Ùð	üs8   ‚)A¬A »A¼A Á AÁA Á	AÁAÁAÁAr^   c                 óà   — t        |t        j                  «      sJ ‚t        j                  | j                  |«      «      }|| _        | j                  j                  j                  |d„ «       y)znStarts serving requests on this connection.

        :arg delegate: a `.HTTPServerConnectionDelegate`
        c                 ó"   — | j                  «       S r   )rÙ   )Úfs    r   ú<lambda>z5HTTP1ServerConnection.start_serving.<locals>.<lambda>,  s   € °a·h±h³j€ r   N)
r2   r	   ÚHTTPServerConnectionDelegater   Úconvert_yieldedÚ_server_request_loopr'  rK   rp   Ú
add_future)r   r^   Úfuts      r   Ústart_servingz#HTTP1ServerConnection.start_serving#  sX   € ô
 ˜(¤H×$IÑ$IÔJÐJÐJÜ×!Ñ! $×";Ñ";¸HÓ"EÓFˆØ"ˆÔà�‰×Ñ×&Ñ& sÑ,@ÕAr   c              ƒ   óÄ  K  — 	 	 t        | j                  d| j                  | j                  «      }|j	                  | |«      }	 |j                  |«      ƒ d {  –—† }|s	 |j                  | «       y t        j"                  d«      ƒ d {  –—†  Œ‹7 Œ7# t        j                  t        j                  t        j                  f$ r Y |j                  | «       y t        $ r$ |j                  «        Y |j                  | «       y t        $ r; t        j                   dd¬«       |j                  «        Y |j                  | «       y w xY w7 Œ½# |j                  | «       w xY w­w)NTFr/   r0   r   )rJ   rK   rM   rN   Ústart_requestrb   r
   rr   ÚUnsatisfiableReadErrorÚasyncioÚCancelledErrorÚon_closer   rt   r)  r   r4   Úsleep)r   r^   ÚconnÚrequest_delegater  s        r   r0  z*HTTP1ServerConnection._server_request_loop.  s=  è ø€ ð	$ØÜ& t§{¡{°E¸4¿;¹;ÈÏÉÓU�Ø#+×#9Ñ#9¸$ÀÓ#EÐ ðØ $× 2Ñ 2Ð3CÓ D×D�Cñ Øð ×Ñ˜dÕ#ô —m‘m AÓ&×&Ð&ð+ ð Eùä×.Ñ.Ü×3Ñ3Ü×*Ñ*ðò ð
 ð ×Ñ˜dÕ#ô 'ò à—J‘J”LØð ×Ñ˜dÕ#ô !ò Ü—M‘MÐ"6ÀÕFØ—J‘J”LØð
 ×Ñ˜dÕ#ðúð 'ùà×Ñ˜dÕ#üsŽ   ‚E „?E
 ÁB ÁBÁB ÁE
 Á E Á2E
 Â
EÂE
 ÂB Â2EÃE
 ÃE ÃEÃ/E
 Ã0E Ä/EÄ1E
 Ä2E ÅEÅE
 Å
EÅE r  r    )r"   r#   r$   r6   r
   r  r   r=   r  r   rt   r	   r.  r3  r0  r   r   r   r%  r%  ÿ  s†   „ Ùð
 7;Ø$(ñ	$à×!Ñ!ð$ð Ð2Ñ3ð$ð ˜&Ñ!ð	$ð
 
ó$ó&ð	B h×&KÑ&Kð 	BÐPTó 	Bð$Ø ×=Ñ=ð$à	ô$r   r%  z[0-9]+z[0-9a-fA-F]+Úsr!   c                 ó^   — t         j                  | «      €t        d| z  «      ‚t        | «      S )z+Parse a non-negative integer from a string.znot an integer: %r)ÚDIGITSÚ	fullmatchrÅ   rG   ©r=  s    r   rÀ   rÀ   P  s-   € ä×Ñ˜ÓÐ"ÜÐ-°Ñ1Ó2Ð2Üˆq‹6€Mr   c                 ó`   — t         j                  | «      €t        d| z  «      ‚t        | d«      S )z7Parse a non-negative hexadecimal integer from a string.znot a hexadecimal integer: %ré   )Ú	HEXDIGITSr@  rÅ   rG   rA  s    r   r  r  W  s0   € ä×Ñ˜1ÓÐ%ÜÐ8¸1Ñ<Ó=Ð=Üˆq�"‹:Ðr   r‹   c                 ó¢   — d| vryd| v rt        j                  d«      ‚| d   j                  «       dk(  ryt        j                  d| d   z  «      ‚)z�Returns true if the headers specify Transfer-Encoding: chunked.

    Raise httputil.HTTPInputError if any other transfer encoding is used.
    rl   Frk   z6Message with both Transfer-Encoding and Content-Lengthr±   Tz Unsupported Transfer-Encoding %s)r	   r3   r¿   )r‹   s    r   rÞ   rÞ   ^  sn   € ð  'Ñ)ØØ˜7Ñ"ô ×%Ñ%ØDó
ð 	
ð Ð"Ñ#×)Ñ)Ó+¨yÒ8Øô ×
!Ñ
!Ø*¨WÐ5HÑ-IÑIóð r   )1r6   r7  r7   rò   r:   Útornado.concurrentr   r   r   Útornado.escaper   r   Útornador   r	   r
   Útornado.logr   r   Útornado.utilr   Útypingr   r   r   r   r   r   r   ÚcompilerÃ   r)  r   r&   r=   ÚHTTPConnectionrJ   r  r`   r%  r?  rD  r  rG   rÀ   r  ré   rF   rÞ   r   r   r   ú<module>rN     s	  ðñ ó
 Û Û 	Û ÷ñ ÷
 ,Ý Ý Ý ß (Ý )÷ K× JÑ Jàˆb�j‰j˜Ó"€ô�iô ÷
"ñ "÷6%ñ %ôBQ	�h×-Ñ-ô Q	ôh;4˜8×7Ñ7ô ;4÷|J$ñ J$ðZ 
ˆ�‰�IÓ	€ØˆB�J‰J�Ó'€	ð�ð ˜ó ð�Sð ˜Só ð¨(×*>Ñ*>ð À4ô r   