o
    4˜Žj:1  ã                   @   sÆ  d Z ddlZddlZddlZddlmZmZmZmZm	Z	m
Z
mZmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ dZejdkrTddlmZ nddlmZ eeeddf ZdZ dej  kondk n  Z!ejdk Z"e!pye"Z#G dd„ deƒZ$e$ddƒZ%e$ddƒZ&eeeged f  Z'eedged f  Z(G dd„ deƒZ)e *d¡Z+de,de,fdd„Z-de,d ddefd!d"„Z.e.Z/zddl0m1Z1 e1j/Z2esÖe2Z/W dS W dS  e3yâ   Y dS w )#z"Http related parsers and protocol.é    N)ÚTYPE_CHECKINGÚAnyÚ	AwaitableÚCallableÚIterableÚListÚ
NamedTupleÚOptional)ÚCIMultiDicté   )ÚAbstractStreamWriter)ÚBaseProtocol)ÚClientConnectionResetError)ÚZLibCompressor)ÚNO_EXTENSIONS)ÚStreamWriterÚHttpVersionÚHttpVersion10ÚHttpVersion11)é   é   )ÚBuffer)ÚUnionzmemoryview[int]zmemoryview[bytes]i   )r   é   r   )r   r   é   )r   r   é	   c                   @   s   e Zd ZU eed< eed< dS )r   ÚmajorÚminorN)Ú__name__Ú
__module__Ú__qualname__ÚintÚ__annotations__© r#   r#   úP/var/www/kodo/Anonymous/send/lib/python3.10/site-packages/aiohttp/http_writer.pyr   .   s   
 r   úCIMultiDict[str]c                   @   sx  e Zd ZU dZedB ed< dZeed< dZeed< dZ	e
dB ed< 		d9dedejd	ed
eddf
dd„ZedejdB fdd„ƒZedefdd„ƒZd:dd„Z	d;dededB ddfdd„Zdeddfdd„Zdee ddfdd„Zdeddfdd „Zded!eddfd"d#„Zd$d%d&œded'ed(eddfd)d*„Zd+ed,d-ddfd.d/„Zd:d0d1„Z d:d2d3„Z!d<de"ddfd5d6„Z#d:d7d8„Z$dS )=r   NÚlengthFÚchunkedÚ_eofÚ	_compressÚprotocolÚloopÚon_chunk_sentÚon_headers_sentÚreturnc                 C   s(   || _ || _|| _|| _d | _d| _d S )NF)Ú	_protocolr+   Ú_on_chunk_sentÚ_on_headers_sentÚ_headers_bufÚ_headers_written)Úselfr*   r+   r,   r-   r#   r#   r$   Ú__init__B   s   
zStreamWriter.__init__c                 C   s   | j jS ©N)r/   Ú	transport©r4   r#   r#   r$   r7   P   s   zStreamWriter.transportc                 C   s   | j S r6   )r/   r8   r#   r#   r$   r*   T   s   zStreamWriter.protocolc                 C   s
   d| _ d S )NT)r'   r8   r#   r#   r$   Úenable_chunkingX   s   
zStreamWriter.enable_chunkingÚdeflateÚencodingÚstrategyc                 C   s   t ||d�| _d S )N)r;   r<   )r   r)   )r4   r;   r<   r#   r#   r$   Úenable_compression[   s   zStreamWriter.enable_compressionÚchunkc                 C   sR   t |ƒ}|  j|7  _|  j|7  _| jj}|d u s| ¡ r"tdƒ‚| |¡ d S )Nú!Cannot write to closing transport)ÚlenÚbuffer_sizeÚoutput_sizer/   r7   Ú
is_closingr   Úwrite)r4   r>   Úsizer7   r#   r#   r$   Ú_write`   s   zStreamWriter._writeÚchunksc                 C   s„   d}|D ]}|t |ƒ7 }q|  j|7  _|  j|7  _| jj}|d u s'| ¡ r+tdƒ‚ts1|tk r;| 	d 
|¡¡ d S | |¡ d S )Nr   r?   ó    )r@   rA   rB   r/   r7   rC   r   ÚSKIP_WRITELINESÚMIN_PAYLOAD_FOR_WRITELINESrD   ÚjoinÚ
writelines)r4   rG   rE   r>   r7   r#   r#   r$   Ú_writelinesi   s   zStreamWriter._writelinesc                 C   s*   t |ƒd›d� d¡}|  ||df¡ dS )z+Write a chunk with proper chunked encoding.Úxú
Úasciió   
N)r@   ÚencoderM   )r4   r>   Úchunk_len_prer#   r#   r$   Ú_write_chunked_payloadw   s   z#StreamWriter._write_chunked_payloadÚis_eofc                 C   sº   d| _ | j}d| _tr|dusJ ‚| js&|r|  ||f¡ dS |  |¡ dS |rKt|ƒd›d� d¡}|r@|  |||df¡ dS |  |||df¡ dS |rV|  |df¡ dS |  |¡ dS )	zASend buffered headers with payload, coalescing into single write.TNrN   rO   rP   ó   
0

rQ   ó   0

)r3   r2   r   r'   rM   rF   r@   rR   )r4   r>   rU   Úheaders_bufrS   r#   r#   r$   Ú_send_headers_with_payload|   s&   
ÿz'StreamWriter._send_headers_with_payloadTi   )ÚdrainÚLIMITrZ   r[   c                Ã   s8  �| j dur|   |¡I dH  t|tƒr|jt|ƒkr| d¡}| jdur1| j |¡I dH }|s1dS | jdurTt|ƒ}| j|krF| j| | _n|d| j… }d| _|sTdS | j	rs| j
ss|  |d¡ |rq| j|krqd| _|  ¡ I dH  dS |r–| jr~|  |¡ n|  |¡ |r˜| j|kršd| _|  ¡ I dH  dS dS dS dS )zÊ
        Writes chunk of data to a stream.

        write_eof() indicates end of stream.
        writer can't be used after write_eof() method being called.
        write() return drain future.
        NÚcr   F)r0   Ú
isinstanceÚ
memoryviewÚnbytesr@   Úcastr)   Úcompressr&   r2   r3   rY   rA   rZ   r'   rT   rF   )r4   r>   rZ   r[   Ú	chunk_lenr#   r#   r$   rD   œ   sB   €







øzStreamWriter.writeÚstatus_lineÚheadersr%   c                 Ã   s6   �| j dur|   |¡I dH  t||ƒ}d| _|| _dS )zWrite headers to the stream.NF)r1   Ú_serialize_headersr3   r2   )r4   rc   rd   Úbufr#   r#   r$   Úwrite_headersÏ   s   €


zStreamWriter.write_headersc                 C   s@   | j r| jrdS d| _| j }d| _ tr|dusJ ‚|  |¡ dS )z3Force sending buffered headers if not already sent.NT)r2   r3   r   rF   ©r4   rX   r#   r#   r$   Úsend_headersÚ   s   zStreamWriter.send_headersc                 C   sz   | j rdS | jr-| js-d| _| j}d| _tr|dusJ ‚| jr'|  |df¡ n|  |¡ n| jr8| jr8|  d¡ d| _ dS )z&Indicate that the message is complete.NTrW   )r(   r2   r3   r   r'   rM   rF   rh   r#   r#   r$   Úset_eofé   s   

zStreamWriter.set_eofrH   c                 Ã   s  �| j rd S |r| jd ur|  |¡I d H  | jrºg }d}|r2| j |¡I d H  }r2t|ƒ}| |¡ | j ¡ }|t|ƒ7 }| |¡ |sFJ ‚| jrƒ| jsƒd| _| j}d | _| j	rn|d›d� 
d¡}|  ||g|¢d‘R ¡ n	|  |g|¢R ¡ |  ¡ I d H  d| _ d S | j	r›|d›d� 
d¡}|  |g|¢d‘R ¡ nt|ƒdkr§|  |¡ n|  |d ¡ |  ¡ I d H  d| _ d S | jrÒ| jsÒ|  |d¡ |  ¡ I d H  d| _ d S | j	rú|ré|  t|ƒd›d� 
d¡|df¡ n|  d¡ |  ¡ I d H  d| _ d S |�r	|  |¡ |  ¡ I d H  d| _ d S )	Nr   TrN   rO   rP   rV   r   rW   )r(   r0   r)   ra   r@   ÚappendÚflushr2   r3   r'   rR   rM   rZ   rF   rY   )r4   r>   rG   Ú
chunks_lenÚcompressed_chunkÚflush_chunkrX   rS   r#   r#   r$   Ú	write_eof  sn   €


ÿÿ


zStreamWriter.write_eofc                 Ã   s2   �| j }|jdur|jr| ¡ I dH  dS dS dS )zFlush the write buffer.

        The intended use is to write

          await w.write(data)
          await w.drain()
        N)r/   r7   Ú_pausedÚ_drain_helper)r4   r*   r#   r#   r$   rZ   R  s
   €ÿzStreamWriter.drain)NN)r.   N)r:   N)rH   )%r   r   r    r&   r!   r"   r'   Úboolr(   r)   r   r   ÚasyncioÚAbstractEventLoopÚ_T_OnChunkSentÚ_T_OnHeadersSentr5   ÚpropertyÚ	Transportr7   r*   r9   Ústrr=   r   rF   r   rM   rT   rY   rD   rg   ri   rj   Úbytesrp   rZ   r#   r#   r#   r$   r   ;   sp   
 ûþýüû
ú
ÿÿÿ
þ	!ÿÿÿÿ
þ3ÿÿ
þ

Nr   z[\x00-\x08\x0a-\x1f\x7f]Ústringr.   c                 C   s   t  | ¡d urtdƒ‚| S )NzSForbidden control character detected in headers. Potential header injection attack.)Ú_FORBIDDEN_HEADER_CHARS_REÚsearchÚ
ValueError)r|   r#   r#   r$   Ú_safe_headerd  s
   ÿr€   rc   rd   c                 C   s:   t | ƒ dd„ | ¡ D ƒ}| d d |¡ d }| d¡S )Nc                 s   s(   � | ]\}}t |ƒd  t |ƒ V  qdS )z: N)r€   )Ú.0ÚkÚvr#   r#   r$   Ú	<genexpr>o  s   €& z(_py_serialize_headers.<locals>.<genexpr>rO   z

zutf-8)r€   ÚitemsrK   rR   )rc   rd   Úheaders_genÚliner#   r#   r$   Ú_py_serialize_headersm  s   
rˆ   )4Ú__doc__rt   ÚreÚsysÚtypingr   r   r   r   r   r   r   r	   Ú	multidictr
   Úabcr   Úbase_protocolr   Úclient_exceptionsr   Úcompression_utilsr   Úhelpersr   Ú__all__Úversion_infoÚcollections.abcr   r   r{   Ú	bytearrayrJ   ÚIS_PY313_BEFORE_313_2ÚIS_PY_BEFORE_312_9rI   r   r   r   rv   rw   r   Úcompiler}   rz   r€   rˆ   re   Úaiohttp._http_writerÚ_http_writerÚ_c_serialize_headersÚImportErrorr#   r#   r#   r$   Ú<module>   sR    (



  
(	
ÿÿ