o
    çûõj"2  ã                   @   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#   úF/opt/steambot/venv/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 | _d S )NF)Ú	_protocolr+   Ú_on_chunk_sentÚ_on_headers_sentÚ_headers_bufÚ_headers_writtenÚon_body_write)Úselfr*   r+   r,   r-   r#   r#   r$   Ú__init__B   s   
zStreamWriter.__init__c                 C   s   | j jS ©N)r/   Ú	transport©r5   r#   r#   r$   r8   Q   s   zStreamWriter.transportc                 C   s   | j S r7   )r/   r9   r#   r#   r$   r*   U   s   zStreamWriter.protocolc                 C   s
   d| _ d S )NT)r'   r9   r#   r#   r$   Úenable_chunkingY   s   
zStreamWriter.enable_chunkingÚdeflateÚencodingÚstrategyc                 C   s   t ||d�| _d S )N)r<   r=   )r   r)   )r5   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/   r8   Ú
is_closingr   Úwrite)r5   r?   Úsizer8   r#   r#   r$   Ú_writea   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@   ó    )rA   rB   rC   r/   r8   rD   r   ÚSKIP_WRITELINESÚMIN_PAYLOAD_FOR_WRITELINESrE   ÚjoinÚ
writelines)r5   rH   rF   r?   r8   r#   r#   r$   Ú_writelinesj   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)rA   ÚencoderN   )r5   r?   Úchunk_len_prer#   r#   r$   Ú_write_chunked_payloadx   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.TNrO   rP   rQ   ó   
0

rR   ó   0

)r3   r2   r   r'   rN   rG   rA   rS   )r5   r?   rV   Úheaders_bufrT   r#   r#   r$   Ú_send_headers_with_payload}   s&   
ÿz'StreamWriter._send_headers_with_payloadTi   )ÚdrainÚLIMITr[   r\   c                Ã   sl  �| j dur|   |¡I dH  | j}t|tƒr%|j}|t|ƒkr$| d¡}n
|dur-t|ƒnd}| jdurM| j |¡I dH }|sM|durK|rK||| j	ƒ dS | j
durst|ƒ}| j
|krb| j
| | _
n| j
}|d| j
… }d| _
|ssdS | jr€| js€|  |d¡ n|r‘| jr‹|  |¡ n|  |¡ ndS |durŸ|rŸ||| j	ƒ |r²| j|kr´d| _|  ¡ I dH  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   r4   Ú
isinstanceÚ
memoryviewÚnbytesrA   Úcastr)   ÚcompressrC   r&   r2   r3   rZ   r'   rU   rG   rB   r[   )r5   r?   r[   r\   ÚnotifyÚ	body_sizeÚ	chunk_lenr#   r#   r$   rE   �   sL   €



€


þ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   )r5   rf   rg   Ú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   rG   ©r5   rY   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.NTrX   )r(   r2   r3   r   r'   rN   rG   rk   r#   r#   r$   Úset_eofñ   s   

zStreamWriter.set_eofrI   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rx| jsxd| _| j}d | _| j	rn|d›d� 
d¡}|  ||g|¢d‘R ¡ nm|  |g|¢R ¡ nc| j	r�|d›d� 
d¡}|  |g|¢d‘R ¡ nKt|ƒdkrœ|  |¡ n?|  |d ¡ n7| jr±| js±|  |d¡ n*| j	rÎ|rÈ|  t|ƒd›d� 
d¡|df¡ n|  d¡ n|rÖ|  |¡ nd| _ d S |rì| j }d urì|t|ƒ| jƒ |  ¡ I d H  d| _ d S )	Nr   TrO   rP   rQ   rW   r   rX   )r(   r0   r)   rb   rA   ÚappendÚflushr2   r3   r'   rS   rN   rG   rZ   r4   rC   r[   )	r5   r?   rH   Ú
chunks_lenÚcompressed_chunkÚflush_chunkrY   rT   rc   r#   r#   r$   Ú	write_eof  s^   €


ÿÿ
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/   r8   Ú_pausedÚ_drain_helper)r5   r*   r#   r#   r$   r[   O  s
   €ÿzStreamWriter.drain)NN)r.   N)r;   N)rI   )%r   r   r    r&   r!   r"   r'   Úboolr(   r)   r   r   ÚasyncioÚAbstractEventLoopÚ_T_OnChunkSentÚ_T_OnHeadersSentr6   ÚpropertyÚ	Transportr8   r*   r:   Ústrr>   r   rG   r   rN   rU   rZ   rE   rj   rl   rm   Úbytesrs   r[   r#   r#   r#   r$   r   ;   sp   
 ûþýüû
ú
ÿÿÿ
þ	!ÿÿÿÿ
þ:ÿÿ
þ

Cr   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_headera  s
   ÿrƒ   rf   rg   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>l  s   €& z(_py_serialize_headers.<locals>.<genexpr>rP   z

zutf-8)rƒ   ÚitemsrL   rS   )rf   rg   Úheaders_genÚliner#   r#   r$   Ú_py_serialize_headersj  s   
r‹   )4Ú__doc__rw   Ú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~   Ú	bytearrayrK   ÚIS_PY313_BEFORE_313_2ÚIS_PY_BEFORE_312_9rJ   r   r   r   ry   rz   r   Úcompiler€   r}   rƒ   r‹   rh   Úaiohttp._http_writerÚ_http_writerÚ_c_serialize_headersÚImportErrorr#   r#   r#   r$   Ú<module>   sR    (



  
%	
ÿÿ