o
    Rh-                     @   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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)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   U/home/air/sanwanet/backup_V2/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|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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:     

 	
