o
    RÊÆh-  ã                   @   s<  d Z ddlZddlZddl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
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dedefdd„Zdedddefdd„ZeZzddl m!Z! e!jZ"es‘e"ZW dS W dS  e#y�   Y dS w )z"Http related parsers and protocol.é    N)ÚAnyÚ	AwaitableÚCallableÚ
NamedTupleÚOptionalÚUnion)ÚCIMultiDicté   )ÚAbstractStreamWriter)ÚBaseProtocol)ÚZLibCompressor)ÚNO_EXTENSIONS)ÚStreamWriterÚHttpVersionÚHttpVersion10ÚHttpVersion11c                   @   s   e Zd ZU eed< eed< dS )r   ÚmajorÚminorN)Ú__name__Ú
__module__Ú__qualname__ÚintÚ__annotations__© r   r   ú`/var/www/html/HyperOracle/crypto_trader/venv/lib/python3.10/site-packages/aiohttp/http_writer.pyr      s   
 r   úCIMultiDict[str]c                   @   sì   e Zd Z		d(dedejdededdf
dd„Ze	de
ej fd	d
„ƒZe	defdd„ƒZd)dd„Zdejfdededdfdd„Z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*deddfd$d%„Zd)d&d'„ZdS )+r   NÚprotocolÚloopÚon_chunk_sentÚon_headers_sentÚreturnc                 C   sF   || _ || _d | _d| _d| _d| _d| _d | _d | _|| _	|| _
d S )NFr   )Ú	_protocolr   ÚlengthÚchunkedÚbuffer_sizeÚoutput_sizeÚ_eofÚ	_compressÚ_drain_waiterÚ_on_chunk_sentÚ_on_headers_sent)Úselfr   r   r   r   r   r   r   Ú__init__   s   
zStreamWriter.__init__c                 C   s   | j jS ©N)r!   Ú	transport©r+   r   r   r   r.   5   s   zStreamWriter.transportc                 C   s   | j S r-   )r!   r/   r   r   r   r   9   s   zStreamWriter.protocolc                 C   s
   d| _ d S )NT)r#   r/   r   r   r   Úenable_chunking=   s   
zStreamWriter.enable_chunkingÚdeflateÚencodingÚstrategyc                 C   s   t ||d�| _d S )N)r2   r3   )r   r'   )r+   r2   r3   r   r   r   Úenable_compression@   s   zStreamWriter.enable_compressionÚchunkc                 C   sX   t |ƒ}|  j|7  _|  j|7  _| j}| jjr!|d u s!| ¡ r%tdƒ‚| |¡ d S )Nz!Cannot write to closing transport)	Úlenr$   r%   r.   r!   Ú	connectedÚ
is_closingÚConnectionResetErrorÚwrite)r+   r5   Úsizer.   r   r   r   Ú_writeE   s   zStreamWriter._writeTi   )ÚdrainÚLIMITr=   r>   c                Ã   s  �| 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 |r€| j	rhdt|ƒ  
d¡}|| d }|  |¡ | j|kr‚|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   ú%x
Úasciis   
)r)   Ú
isinstanceÚ
memoryviewÚnbytesr6   Úcastr'   Úcompressr"   r#   Úencoder<   r$   r=   )r+   r5   r=   r>   Ú	chunk_lenÚchunk_len_prer   r   r   r:   N   s8   €
	





÷zStreamWriter.writeÚstatus_lineÚheadersr   c                 Ã   s4   �| j dur|   |¡I dH  t||ƒ}|  |¡ dS )z*Write request/response status and headers.N)r*   Ú_serialize_headersr<   )r+   rJ   rK   Úbufr   r   r   Úwrite_headersy   s
   €

zStreamWriter.write_headersó    c                 Ã   sÒ   �| j rd S |r| jd ur|  |¡I d H  | jr?|r#| j |¡I d H }|| j ¡ 7 }|r>| jr>dt|ƒ  d¡}|| d }n| jrV|rTdt|ƒ  d¡}|| d }nd}|r]|  |¡ |  	¡ I d H  d| _ d S )Nr@   rA   s   
0

s   0

T)
r&   r)   r'   rF   Úflushr#   r6   rG   r<   r=   )r+   r5   rH   r   r   r   Ú	write_eof„   s,   €
€

zStreamWriter.write_eofc                 Ã   s&   �| j jdur| j  ¡ I dH  dS dS )zFlush the write buffer.

        The intended use is to write

          await w.write(data)
          await w.drain()
        N)r!   r.   Ú_drain_helperr/   r   r   r   r=   ¢   s   €ÿzStreamWriter.drain)NN)r    N)rO   )r   r   r   r   ÚasyncioÚAbstractEventLoopÚ_T_OnChunkSentÚ_T_OnHeadersSentr,   Úpropertyr   Ú	Transportr.   r   r0   ÚzlibÚZ_DEFAULT_STRATEGYÚstrr   r4   Úbytesr<   Úboolr:   rN   rQ   r=   r   r   r   r   r      s^    ûþýüû
ú
ÿÿÿ
þ
ÿÿÿÿ
þ+ÿÿ
þr   Ústringr    c                 C   s   d| v sd| v rt dƒ‚| S )NúÚ
zRNewline or carriage return detected in headers. Potential header injection attack.)Ú
ValueError)r^   r   r   r   Ú_safe_header®   s
   ÿrb   rJ   rK   c                 C   s2   dd„ |  ¡ D ƒ}| d d |¡ d }| d¡S )Nc                 s   s(   � | ]\}}t |ƒd  t |ƒ V  qdS )z: N)rb   )Ú.0ÚkÚvr   r   r   Ú	<genexpr>¸   s   €& z(_py_serialize_headers.<locals>.<genexpr>z
z

zutf-8)ÚitemsÚjoinrG   )rJ   rK   Úheaders_genÚliner   r   r   Ú_py_serialize_headers·   s   
rk   )$Ú__doc__rS   rY   Útypingr   r   r   r   r   r   Ú	multidictr   Úabcr
   Úbase_protocolr   Úcompression_utilsr   Úhelpersr   Ú__all__r   r   r   r\   rU   rV   r   r[   rb   rk   rL   Úaiohttp._http_writerÚ_http_writerÚ_c_serialize_headersÚImportErrorr   r   r   r   Ú<module>   s:     

 	
ÿÿ