a
    e	gw                     @   sH  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	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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'yB   Y n0 dS )z"Http related parsers and protocol.    N)Any	AwaitableCallableIterableList
NamedTupleOptionalUnion)CIMultiDict   )AbstractStreamWriter)BaseProtocol)ClientConnectionResetError)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   V/var/www/html/llm_bihealth/app/venv/lib/python3.9/site-packages/aiohttp/http_writer.pyr      s   
r   CIMultiDict[str]c                   @   sF  e Zd ZU dZee ed< dZeed< dZ	eed< dZ
ee ed< 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eeef ddddZe e ddddZ!dddeeeef eedddd Z"ed!dd"d#d$Z#dd
d%d&Z$d-eddd(d)Z%dd
d*d+Z&dS ).r   NlengthFchunked_eof	_compress)protocolloopon_chunk_senton_headers_sentreturnc                 C   s   || _ || _|| _|| _d S N)	_protocolr$   _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 r(   )r)   	transportr,   r   r   r   r.   ;   s    zStreamWriter.transportc                 C   s   | j S r(   )r)   r/   r   r   r   r#   ?   s    zStreamWriter.protocolc                 C   s
   d| _ d S )NT)r    r/   r   r   r   enable_chunkingC   s    zStreamWriter.enable_chunkingdeflate)encodingstrategyr'   c                 C   s   t ||d| _d S )N)r2   r3   )r   r"   )r,   r2   r3   r   r   r   enable_compressionF   s    zStreamWriter.enable_compression)chunkr'   c                 C   sR   t |}|  j|7  _|  j|7  _| jj}|d u s<| rDtd|| d S )N!Cannot write to closing transport)lenbuffer_sizeoutput_sizer)   r.   
is_closingr   write)r,   r5   sizer.   r   r   r   _writeK   s    zStreamWriter._write)chunksr'   c                 C   sj   d}|D ]}|t |7 }q|  j|7  _|  j|7  _| jj}|d u sN| rVtd|d| d S )Nr   r6       )	r7   r8   r9   r)   r.   r:   r   r;   join)r,   r>   r<   r5   r.   r   r   r   _writelinesT   s    zStreamWriter._writelinesTi   )drainLIMIT)r5   rB   rC   r'   c                   s
  | j dur|  |I dH  t|tr<|jt|kr<|d}| jdur`| j|I dH }|s`dS | jdurt|}| j|kr| j| | _n|d| j }d| _|sdS |r| j	r| 
t|ddd|df n
| | | j|kr|rd| _|  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nbytesr7   castr"   compressr   r    rA   encoder=   r8   rB   )r,   r5   rB   rC   Z	chunk_lenr   r   r   r;   _   s4    






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,   rO   rP   bufr   r   r   write_headers   s    

zStreamWriter.write_headersc                 C   s
   d| _ dS )z&Indicate that the message is complete.TN)r!   r/   r   r   r   set_eof   s    zStreamWriter.set_eofr?   c                    sL  | j r
d S |r(| jd ur(| |I d H  | jrg }d}|rb| j|I d H  }rbt|}|| | j }|t|7 }|| |sJ | jr|ddd}| 	|g|dR  n&t|dkr| 	| n| 
|d  nR| jr$|rt|ddd}| 	||df n
| 
d n|r4| 
| |  I d H  d| _ d S )	Nr   rE   rF   rG   s   
0

r   s   0

T)r!   r*   r"   rL   r7   appendflushr    rM   rA   r=   rB   )r,   r5   r>   Z
chunks_lenZcompressed_chunkZflush_chunkZchunk_len_prer   r   r   	write_eof   s:    



zStreamWriter.write_eofc                    s(   | j }|jdur$|jr$| 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_pausedZ_drain_helper)r,   r#   r   r   r   rB      s    zStreamWriter.drain)NN)r?   )'r   r   r   r   r   r   r   r    boolr!   r"   r   r   asyncioZAbstractEventLoop_T_OnChunkSent_T_OnHeadersSentr-   property	Transportr.   r#   r0   zlibZ_DEFAULT_STRATEGYstrr4   r	   bytes	bytearrayrI   r=   r   rA   r;   rS   rT   rW   rB   r   r   r   r   r   (   sN   
  	1'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)rc   r   r   r   _safe_header   s
    rg   rN   c                 C   s2   dd |  D }| d d| d }|dS )Nc                 s   s&   | ]\}}t |d  t | V  qdS )z: N)rg   ).0kvr   r   r   	<genexpr>   r?   z(_py_serialize_headers.<locals>.<genexpr>rF   z

zutf-8)itemsr@   rM   )rO   rP   Zheaders_genliner   r   r   _py_serialize_headers   s    rn   )(__doc__rY   r^   typingr   r   r   r   r   r   r   r	   Z	multidictr
   abcr   Zbase_protocolr   Zclient_exceptionsr   Zcompression_utilsr   Zhelpersr   __all__r   r   r   ra   rZ   r[   r   r`   rg   rn   rQ   Zaiohttp._http_writerZ_http_writerZ_c_serialize_headersImportErrorr   r   r   r   <module>   s6   (

 +	