a
    }3e-                     @   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	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edddZededddZeZz ddlmZ ejZ ese ZW n e!y"   Y n0 dS )z"Http related parsers and protocol.    N)Any	AwaitableCallable
NamedTupleOptionalUnion)CIMultiDict   )AbstractStreamWriter)BaseProtocol)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   F/home/pi/bot/my_env/lib/python3.9/site-packages/aiohttp/http_writer.pyr      s   
r   CIMultiDict[str]c                   @   s   e Zd Zd"eejeeddddZe	e
ej dddZe	eddd	Zddd
dZdejfeeddddZeddddZdddeeeddddZedddddZd#eddddZd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	_compressZ_drain_waiter_on_chunk_sent_on_headers_sent)selfr   r   r   r   r   r   r   __init__   s    zStreamWriter.__init__)r   c                 C   s   | j jS N)r    	transportr)   r   r   r   r,   4   s    zStreamWriter.transportc                 C   s   | j S r+   )r    r-   r   r   r   r   8   s    zStreamWriter.protocolc                 C   s
   d| _ d S )NT)r"   r-   r   r   r   enable_chunking<   s    zStreamWriter.enable_chunkingdeflate)encodingstrategyr   c                 C   s,   |dkrdt j nt j}t j||d| _d S )Ngzip   )wbitsr1   )zlib	MAX_WBITScompressobjr&   )r)   r0   r1   	zlib_moder   r   r   enable_compression?   s    zStreamWriter.enable_compression)chunkr   c                 C   sX   t |}|  j|7  _|  j|7  _| j}| jjrB|d u sB| rJtd|| d S )Nz!Cannot write to closing transport)	lenr#   r$   r,   r    	connectedZ
is_closingConnectionResetErrorwrite)r)   r:   sizer,   r   r   r   _writeE   s    zStreamWriter._writeTi   )drainLIMIT)r:   rA   rB   r   c                   s   | j dur|  |I dH  t|tr<|jt|kr<|d}| jdurZ| j|}|sZdS | jdurt|}| j|kr| j| | _n|d| j }d| _|sdS |r| j	rdt| 
d}|| d }| | | j|kr|rd| _|  I dH  dS )zWrites 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nbytesr;   castr&   compressr!   r"   encoder@   r#   rA   )r)   r:   rA   rB   	chunk_lenZchunk_len_prer   r   r   r>   N   s2    	






zStreamWriter.writer   status_lineheadersr   c                    s2   | j dur|  |I dH  t||}| | dS )z*Write request/response status and headers.N)r(   _serialize_headersr@   )r)   rN   rO   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rv|r>| j|}|| j  }|r| jrdt| d}|| d }n.| jr|rdt| d}|| d }nd}|r| | | 	 I d H  d| _ d S )NrD   rE   s   
0

s   0

T)
r%   r'   r&   rJ   flushr"   r;   rK   r@   rA   )r)   r:   rL   r   r   r   	write_eof   s(    

zStreamWriter.write_eofc                    s    | j jdur| j  I dH  dS )zFlush the write buffer.

        The intended use is to write

          await w.write(data)
          await w.drain()
        N)r    r,   Z_drain_helperr-   r   r   r   rA      s    zStreamWriter.drain)NN)rS   )r   r   r   r   asyncioZAbstractEventLoop_T_OnChunkSent_T_OnHeadersSentr*   propertyr   	Transportr,   r   r.   r5   Z_DEFAULT_STRATEGYstrr   r9   bytesr@   boolr>   rR   rU   rA   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
    rc   rM   c                 C   s2   dd |  D }| d d| d }|dS )Nc                 s   s&   | ]\}}t |d  t | V  qdS )z: N)rc   ).0kvr   r   r   	<genexpr>   rS   z(_py_serialize_headers.<locals>.<genexpr>z
z

zutf-8)itemsjoinrK   )rN   rO   Zheaders_genliner   r   r   _py_serialize_headers   s    rk   )"__doc__rV   r5   typingr   r   r   r   r   r   Z	multidictr   abcr
   Zbase_protocolr   Zhelpersr   __all__r   r   r   r]   rW   rX   r   r\   rc   rk   rP   Zaiohttp._http_writerZ_http_writerZ_c_serialize_headersImportErrorr   r   r   r   <module>   s2    

 	