o
    m=8j:1                     @   s  d Z ddl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ejdkrTddlmZ nddlmZ eeeddf ZdZ dej  kondk n  Z!ejdk Z"e!pye"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*dZ+de,de,fddZ-de,d ddefd!d"Z.e.Z/zddl0m1Z1 e1j/Z2ese2Z/W dS W dS  e3y   Y dS w )#z"Http related parsers and protocol.    N)TYPE_CHECKINGAny	AwaitableCallableIterableList
NamedTupleOptional)CIMultiDict   )AbstractStreamWriter)BaseProtocol)ClientConnectionResetError)ZLibCompressor)NO_EXTENSIONS)StreamWriterHttpVersionHttpVersion10HttpVersion11)      )Buffer)Unionzmemoryview[int]zmemoryview[bytes]i   )r      r   )r   r      )r   r   	   c                   @   s   e Zd ZU eed< eed< dS )r   majorminorN)__name__
__module____qualname__int__annotations__ r#   r#   Z/home/nk/hobo-godmode/plappi-mvp/.venv/lib/python3.10/site-packages/aiohttp/http_writer.pyr   .   s   
 r   CIMultiDict[str]c                   @   sx  e Zd ZU dZedB ed< dZeed< dZeed< dZ	e
dB ed< 		d9dedejd	ed
eddf
ddZedejdB fddZedefddZd:ddZ	d;dededB ddfddZdeddfddZdee ddfddZdeddfdd Zde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:d0d1Z d:d2d3Z!d<de"ddfd5d6Z#d:d7d8Z$dS )=r   NlengthFchunked_eof	_compressprotocolloopon_chunk_senton_headers_sentreturnc                 C   s(   || _ || _|| _|| _d | _d| _d S )NF)	_protocolr+   _on_chunk_sent_on_headers_sent_headers_buf_headers_written)selfr*   r+   r,   r-   r#   r#   r$   __init__B   s   
zStreamWriter.__init__c                 C   s   | j jS N)r/   	transportr4   r#   r#   r$   r7   P   s   zStreamWriter.transportc                 C   s   | j S r6   )r/   r8   r#   r#   r$   r*   T   s   zStreamWriter.protocolc                 C   s
   d| _ d S )NT)r'   r8   r#   r#   r$   enable_chunkingX   s   
zStreamWriter.enable_chunkingdeflateencodingstrategyc                 C   s   t ||d| _d S )N)r;   r<   )r   r)   )r4   r;   r<   r#   r#   r$   enable_compression[   s   zStreamWriter.enable_compressionchunkc                 C   sR   t |}|  j|7  _|  j|7  _| jj}|d u s| r"td|| d S )N!Cannot write to closing transport)lenbuffer_sizeoutput_sizer/   r7   
is_closingr   write)r4   r>   sizer7   r#   r#   r$   _write`   s   zStreamWriter._writechunksc                 C   s   d}|D ]}|t |7 }q|  j|7  _|  j|7  _| jj}|d u s'| r+tdts1|tk r;|	d
| d S || d S )Nr   r?       )r@   rA   rB   r/   r7   rC   r   SKIP_WRITELINESMIN_PAYLOAD_FOR_WRITELINESrD   join
writelines)r4   rG   rE   r>   r7   r#   r#   r$   _writelinesi   s   zStreamWriter._writelinesc                 C   s*   t |ddd}| ||df dS )z+Write a chunk with proper chunked encoding.x
ascii   
N)r@   encoderM   )r4   r>   chunk_len_prer#   r#   r$   _write_chunked_payloadw   s   z#StreamWriter._write_chunked_payloadis_eofc                 C   s   d| _ | j}d| _tr|dusJ | js&|r| ||f dS | | dS |rKt|ddd}|r@| |||df dS | |||df dS |rV| |df dS | | dS )	zASend buffered headers with payload, coalescing into single write.TNrN   rO   rP      
0

rQ      0

)r3   r2   r   r'   rM   rF   r@   rR   )r4   r>   rU   headers_bufrS   r#   r#   r$   _send_headers_with_payload|   s&   
z'StreamWriter._send_headers_with_payloadTi   )drainLIMITrZ   r[   c                   s8  | 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 | j	rs| j
ss| |d |rq| j|krqd| _|  I dH  dS |r| jr~| | n| | |r| j|krd| _|  I dH  dS dS dS 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   F)r0   
isinstance
memoryviewnbytesr@   castr)   compressr&   r2   r3   rY   rA   rZ   r'   rT   rF   )r4   r>   rZ   r[   	chunk_lenr#   r#   r$   rD      sB   







zStreamWriter.writestatus_lineheadersr%   c                    s6   | j dur|  |I dH  t||}d| _|| _dS )zWrite headers to the stream.NF)r1   _serialize_headersr3   r2   )r4   rc   rd   bufr#   r#   r$   write_headers   s   


zStreamWriter.write_headersc                 C   s@   | j r| jrdS d| _| j }d| _ tr|dusJ | | dS )z3Force sending buffered headers if not already sent.NT)r2   r3   r   rF   r4   rX   r#   r#   r$   send_headers   s   zStreamWriter.send_headersc                 C   sz   | j rdS | jr-| js-d| _| j}d| _tr|dusJ | jr'| |df n| | n| jr8| jr8| d d| _ dS )z&Indicate that the message is complete.NTrW   )r(   r2   r3   r   r'   rM   rF   rh   r#   r#   r$   set_eof   s   

zStreamWriter.set_eofrH   c                    s  | j rd S |r| jd ur| |I d H  | jrg }d}|r2| j|I d H  }r2t|}|| | j }|t|7 }|| |sFJ | jr| jsd| _| j}d | _| j	rn|dd
d}| ||g|dR  n	| |g|R  |  I d H  d| _ d S | j	r|dd
d}| |g|dR  nt|dkr| | n| |d  |  I d H  d| _ d S | jr| js| |d |  I d H  d| _ d S | j	r|r| t|dd
d|df n| d |  I d H  d| _ d S |r	| | |  I d H  d| _ d S )	Nr   TrN   rO   rP   rV   r   rW   )r(   r0   r)   ra   r@   appendflushr2   r3   r'   rR   rM   rZ   rF   rY   )r4   r>   rG   
chunks_lencompressed_chunkflush_chunkrX   rS   r#   r#   r$   	write_eof  sn   





zStreamWriter.write_eofc                    s2   | j }|jdur|jr| I dH  dS dS dS )zFlush the write buffer.

        The intended use is to write

          await w.write(data)
          await w.drain()
        N)r/   r7   _paused_drain_helper)r4   r*   r#   r#   r$   rZ   R  s
   zStreamWriter.drain)NN)r.   N)r:   N)rH   )%r   r   r    r&   r!   r"   r'   boolr(   r)   r   r   asyncioAbstractEventLoop_T_OnChunkSent_T_OnHeadersSentr5   property	Transportr7   r*   r9   strr=   r   rF   r   rM   rT   rY   rD   rg   ri   rj   bytesrp   rZ   r#   r#   r#   r$   r   ;   sp   
 


	!
3


Nr   z[\x00-\x08\x0a-\x1f\x7f]stringr.   c                 C   s   t | d urtd| S )NzSForbidden control character detected in headers. Potential header injection attack.)_FORBIDDEN_HEADER_CHARS_REsearch
ValueError)r|   r#   r#   r$   _safe_headerd  s
   r   rc   rd   c                 C   s:   t |  dd | D }| d d| d }|dS )Nc                 s   s(    | ]\}}t |d  t | V  qdS )z: N)r   ).0kvr#   r#   r$   	<genexpr>o  s   & z(_py_serialize_headers.<locals>.<genexpr>rO   z

zutf-8)r   itemsrK   rR   )rc   rd   headers_genliner#   r#   r$   _py_serialize_headersm  s   
r   )4__doc__rt   resystypingr   r   r   r   r   r   r   r	   	multidictr
   abcr   base_protocolr   client_exceptionsr   compression_utilsr   helpersr   __all__version_infocollections.abcr   r   r{   	bytearrayrJ   IS_PY313_BEFORE_313_2IS_PY_BEFORE_312_9rI   r   r   r   rv   rw   r   compiler}   rz   r   r   re   aiohttp._http_writer_http_writer_c_serialize_headersImportErrorr#   r#   r#   r$   <module>   sR    (



  
(	
