o
    f>h0                     @   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	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dZdej  koRdk n  Zejdk Zep]e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)	TYPE_CHECKINGAny	AwaitableCallableIterableList
NamedTupleOptionalUnion)CIMultiDict   )AbstractStreamWriter)BaseProtocol)ClientConnectionResetError)ZLibCompressor)NO_EXTENSIONS)StreamWriterHttpVersionHttpVersion10HttpVersion11i   )      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"   F/var/www/html/venv/lib/python3.10/site-packages/aiohttp/http_writer.pyr   '   s   
 r   CIMultiDict[str]c                   @   s  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;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=dedee ddfddZdeeeef ddfddZdee ddfddZdeeedd f ddfd!d"Z deeedd f d#eddfd$d%Z!d&d'd(deeeef d)ed*eddfd+d,Z"d-ed.d/ddfd0d1Z#d<d2d3Z$d<d4d5Z%d>deddfd7d8Z&d<d9d: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__;   s   
zStreamWriter.__init__c                 C   s   | j jS N)r.   	transportr3   r"   r"   r#   r6   I   s   zStreamWriter.transportc                 C   s   | j S r5   )r.   r7   r"   r"   r#   r)   M   s   zStreamWriter.protocolc                 C   s
   d| _ d S )NT)r&   r7   r"   r"   r#   enable_chunkingQ   s   
zStreamWriter.enable_chunkingdeflateencodingstrategyc                 C   s   t ||d| _d S )N)r:   r;   )r   r(   )r3   r:   r;   r"   r"   r#   enable_compressionT   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.   r6   
is_closingr   write)r3   r=   sizer6   r"   r"   r#   _writeY   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?   r@   rA   r.   r6   rB   r   SKIP_WRITELINESMIN_PAYLOAD_FOR_WRITELINESrC   join
writelines)r3   rF   rD   r=   r6   r"   r"   r#   _writelinesb   s   zStreamWriter._writelineszmemoryview[int]zmemoryview[bytes]c                 C   s*   t |ddd}| ||df dS )z+Write a chunk with proper chunked encoding.x
ascii   
N)r?   encoderL   )r3   r=   chunk_len_prer"   r"   r#   _write_chunked_payloadp   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.TNrM   rN   rO      
0

rP      0

)r2   r1   r   r&   rL   rE   r?   rQ   )r3   r=   rT   headers_bufrR   r"   r"   r#   _send_headers_with_payloadw   s&   
z'StreamWriter._send_headers_with_payloadTi   )drainLIMITrY   rZ   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)r/   
isinstance
memoryviewnbytesr?   castr(   compressr%   r1   r2   rX   r@   rY   r&   rS   rE   )r3   r=   rY   rZ   	chunk_lenr"   r"   r#   rC      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)r0   _serialize_headersr2   r1   )r3   rb   rc   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)r1   r2   r   rE   r3   rW   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.NTrV   )r'   r1   r2   r   r&   rL   rE   rg   r"   r"   r#   set_eof   s   

zStreamWriter.set_eofrG   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   TrM   rN   rO   rU   r   rV   )r'   r/   r(   r`   r?   appendflushr1   r2   r&   rQ   rL   rY   rE   rX   )r3   r=   rF   
chunks_lencompressed_chunkflush_chunkrW   rR   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.   r6   _paused_drain_helper)r3   r)   r"   r"   r#   rY   U  s
   zStreamWriter.drain)NN)r-   N)r9   N)rG   )(r   r   r   r%   r	   r    r!   r&   boolr'   r(   r   r   asyncioAbstractEventLoop_T_OnChunkSent_T_OnHeadersSentr4   property	Transportr6   r)   r8   strr<   r
   bytes	bytearrayr]   rE   r   rL   rS   rX   rC   rf   rh   ri   ro   rY   r"   r"   r"   r#   r   4   s   
 


	

(
7


Nr   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_headerb  s
   r   rb   rc   c                 C   s2   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>l  s   & z(_py_serialize_headers.<locals>.<genexpr>rN   z

zutf-8)itemsrJ   rQ   )rb   rc   headers_genliner"   r"   r#   _py_serialize_headersk  s   
r   ).__doc__rs   systypingr   r   r   r   r   r   r   r	   r
   	multidictr   abcr   base_protocolr   client_exceptionsr   compression_utilsr   helpersr   __all__rI   version_infoIS_PY313_BEFORE_313_2IS_PY_BEFORE_312_9rH   r   r   r   rz   ru   rv   r   ry   r   r   rd   aiohttp._http_writer_http_writer_c_serialize_headersImportErrorr"   r"   r"   r#   <module>   sF    ,


  0	
