o
    n~bX                     @   s0  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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se 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)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   >/usr/local/lib/python3.10/dist-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   sN   || _ |j| _|| _d | _d| _d| _d| _d| _d | _	d | _
|| _|| _d S )NFr   )	_protocol	transport
_transportr   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      | j S N)r"   r,   r   r   r   r!   5      zStreamWriter.transportc                 C   r.   r/   )r    r0   r   r   r   r   9   r1   zStreamWriter.protocolc                 C   s
   d| _ d S )NT)r$   r0   r   r   r   enable_chunking=   s   
zStreamWriter.enable_chunkingdeflateencodingstrategyc                 C   s,   |dkr	dt j nt j}t j||d| _d S )Ngzip   )wbitsr5   )zlib	MAX_WBITScompressobjr(   )r,   r4   r5   	zlib_moder   r   r   enable_compression@   s   zStreamWriter.enable_compressionchunkc                 C   sP   t |}|  j|7  _|  j|7  _| jd u s| j r td| j| d S )Nz!Cannot write to closing transport)lenr%   r&   r"   
is_closingConnectionResetErrorwrite)r,   r>   sizer   r   r   _writeF   s   zStreamWriter._writeTi   )drainLIMITrE   rF   c                   s  | j dur|  |I dH  t|tr|jt|kr|d}| jdur.| j|}|s.dS | jdurQt|}| j|krC| j| | _n|d| j }d| _|sQdS |r}| j	redt| 
d}|| d }| | | j|kr|rd| _|  I dH  dS dS dS 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$   encoderD   r%   rE   )r,   r>   rE   rF   	chunk_lenZchunk_len_prer   r   r   rB   O   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_headersrD   )r,   rQ   rR   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r<|r | j|}|| j  }|r;| jr;dt| d}|| d }n| jrS|rQdt| d}|| d }nd}|rZ| | | 	 I d H  d| _ d | _
d S )NrH   rI   s   
0

s   0

T)r'   r*   r(   rN   flushr$   r?   rO   rD   rE   r"   )r,   r>   rP   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_helperr0   r   r   r   rE      s   zStreamWriter.drain)NN)r   N)rV   )r   r   r   r   asyncioAbstractEventLoop_T_OnChunkSent_T_OnHeadersSentr-   propertyr   	Transportr!   r   r2   r9   Z_DEFAULT_STRATEGYstrr   r=   bytesrD   boolrB   rU   rX   rE   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)rd   r   r   r   _safe_header   s
   rh   rQ   rR   c                 C   s2   dd |  D }| d d| d }|dS )Nc                 s   s(    | ]\}}t |d  t | V  qdS )z: N)rh   ).0kvr   r   r   	<genexpr>   s   & z(_py_serialize_headers.<locals>.<genexpr>z
z

zutf-8)itemsjoinrO   )rQ   rR   Zheaders_genliner   r   r   _py_serialize_headers   s   
rp   )"__doc__rZ   r9   typingr   r   r   r   r   r   Z	multidictr   abcr
   Zbase_protocolr   helpersr   __all__r   r   r   rb   r\   r]   r   ra   rh   rp   rS   Zaiohttp._http_writerZ_http_writerZ_c_serialize_headersImportErrorr   r   r   r   <module>   s8     

 	
