a
     ÑOc@  ã                   @   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   úJ/var/www/html/gsl.tools/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   sN   || _ |j| _|| _d | _d| _d| _d| _d| _d | _	d | _
|| _|| _d S )NFr   )Ú	_protocolÚ	transportÚ
_transportr   Ú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 S ©N)r"   ©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Ústrategyr   c                 C   s,   |dkrdt j nt j}t j||d�| _d S )NÚgzipé   )Úwbitsr2   )ÚzlibÚ	MAX_WBITSÚcompressobjr(   )r+   r1   r2   Ú	zlib_moder   r   r   Úenable_compression@   s    zStreamWriter.enable_compression)Úchunkr   c                 C   sP   t |ƒ}|  j|7  _|  j|7  _| jd u s8| j ¡ r@tdƒ‚| j |¡ d S )Nz!Cannot write to closing transport)Úlenr%   r&   r"   Z
is_closingÚConnectionResetErrorÚwrite)r+   r;   Úsizer   r   r   Ú_writeF   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r t|ƒ}| j|kr„| j| | _n|d| j… }d| _|s dS |rô| j	rÈdt|ƒ  
d¡}|| d }|  |¡ | j|krô|rôd| _|  ¡ I dH  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Únbytesr<   Úcastr(   Úcompressr#   r$   Úencoder@   r%   rA   )r+   r;   rA   rB   Ú	chunk_lenZchunk_len_prer   r   r   r>   O   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_headersz   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r¤dt|ƒ  d¡}|| d }n.| jr¤|r dt|ƒ  d¡}|| d }nd}|r²|  |¡ |  	¡ I d H  d| _ d | _
d S )NrD   rE   s   
0

s   0

T)r'   r)   r(   rJ   Úflushr$   r<   rK   r@   rA   r"   )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/   r6   ÚZ_DEFAULT_STRATEGYÚstrr   r:   Ú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   r6   Ú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    

 	