U
    h86                     @  s  d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZddl	m
Z
 ddlmZmZmZmZmZ ddlmZmZmZ ddlmZmZ ddlmZ d	d
lmZ edZejejejej f Z!G dd dej"Z#G dd deZ$G dd dZ%G dd de
Z&dS )    )annotationsN   )AsyncNetworkStream)ConnectionNotAvailableLocalProtocolErrorRemoteProtocolError
WriteErrormap_exceptions)OriginRequestResponse)	AsyncLockAsyncShieldCancellation)Trace   )AsyncConnectionInterfacezhttpcore.http11c                   @  s   e Zd ZdZdZdZdZdS )HTTPConnectionStater   r   r      N)__name__
__module____qualname__NEWACTIVEIDLECLOSED r   r   :/tmp/pip-unpacked-wheel-a8helrha/httpcore/_async/http11.pyr   $   s   r   c                   @  sD  e Zd ZdZdZd@dddddd	d
ZdddddZdddddZdddddZdAddddddZ	dddddZ
dddddZdBdddd d!Zdd"d#d$Zdd"d%d&Zdd'd(d)d*Zd'd"d+d,Zd'd"d-d.Zd'd"d/d0Zd'd"d1d2Zd3d"d4d5Zd3d"d6d7Zd d"d8d9ZdCd:d;d<dd=d>d?ZdS )DAsyncHTTP11Connectioni   i  Nr
   r   float | NoneNone)originstreamkeepalive_expiryreturnc                 C  sF   || _ || _|| _d | _tj| _t | _d| _	t
jt
j| jd| _d S )Nr   )Zour_roleZmax_incomplete_event_size)_origin_network_stream_keepalive_expiry
_expire_atr   r   _stater   _state_lock_request_counth11
ConnectionZCLIENTMAX_INCOMPLETE_EVENT_SIZE
_h11_state)selfr    r!   r"   r   r   r   __init__/   s    zAsyncHTTP11Connection.__init__r   r   )requestr#   c                   s@  |  |jjs(td|jj d| j | j4 I d H < | jtjtj	fkrh|  j
d7  _
tj| _d | _nt W 5 Q I d H R X zLd|i}zxtdt||4 I d H }| jf |I d H  W 5 Q I d H R X tdt||4 I d H }| jf |I d H  W 5 Q I d H R X W n tk
r   Y nX tdt||4 I d H 0}| jf |I d H \}}}}}||||f|_W 5 Q I d H R X | j}	|dks|jd	krd
|  krdk rn n
t|	|}	t||t| ||||	ddW S  tk
r: }
 zNt : tdt|4 I d H }|  I d H  W 5 Q I d H R X W 5 Q R X |
W 5 d }
~
X Y nX d S )NzAttempted to send request to z on connection to r   r1   Zsend_request_headersZsend_request_bodyZreceive_response_headerse   s   CONNECT   i,  )http_versionreason_phrasenetwork_stream)statusheaderscontent
extensionsresponse_closed)can_handle_requesturlr    RuntimeErrorr$   r)   r(   r   r   r   r*   r   r'   r   r   logger_send_request_headers_send_request_bodyr   _receive_response_headersZreturn_valuer%   methodAsyncHTTP11UpgradeStreamr   HTTP11ConnectionByteStreamBaseExceptionr   _response_closed)r/   r1   kwargstracer4   r7   r5   r8   trailing_datar6   excr   r   r   handle_async_requestA   s       "&   
 


(z*AsyncHTTP11Connection.handle_async_requestc              	     sd   |j di }|dd }ttjti tj|j|jj|j	d}W 5 Q R X | j
||dI d H  d S )Ntimeoutwrite)rC   targetr8   rM   )r:   getr	   r+   r   r   rC   r=   rO   r8   _send_eventr/   r1   timeoutsrM   eventr   r   r   r@      s    z+AsyncHTTP11Connection._send_request_headersc                   s~   |j di }|dd }t|jtjs,t|j2 z,3 d H W }tj|d}| j	||dI d H  q26 | j	t
 |dI d H  d S )NrM   rN   )datarP   )r:   rQ   
isinstancer!   typingAsyncIterableAssertionErrorr+   DatarR   EndOfMessage)r/   r1   rT   rM   chunkrU   r   r   r   rA      s    z(AsyncHTTP11Connection._send_request_bodyz	h11.Event)rU   rM   r#   c                   s.   | j |}|d k	r*| jj||dI d H  d S )NrP   )r.   sendr%   rN   )r/   rU   rM   Zbytes_to_sendr   r   r   rR      s    z!AsyncHTTP11Connection._send_eventz:tuple[bytes, int, bytes, list[tuple[bytes, bytes]], bytes]c           	        s   |j di }|dd }| j|dI d H }t|tjr:qTt|tjr|jdkrqTqd|j }|j	
 }| jj\}}||j|j||fS )NrM   readrP   r2   s   HTTP/)r:   rQ   _receive_eventrW   r+   r   ZInformationalResponsestatus_coder4   r8   	raw_itemsr.   rJ   reason)	r/   r1   rT   rM   rU   r4   r8   rJ   _r   r   r   rB      s    


z/AsyncHTTP11Connection._receive_response_headerstyping.AsyncIterator[bytes]c                 C s`   |j di }|dd }| j|dI d H }t|tjrFt|jV  qt|tjtj	frq\qd S )NrM   r_   rP   )
r:   rQ   r`   rW   r+   r[   bytesrV   r\   ZPAUSEDrS   r   r   r   _receive_response_body   s    z,AsyncHTTP11Connection._receive_response_bodyzh11.Event | type[h11.PAUSED])rM   r#   c              	     s   t tjti | j }W 5 Q R X |tjkrv| jj| j|dI d H }|dkrh| jj	tj
krhd}t|| j| q |S q d S )NrP       z/Server disconnected without sending a response.)r	   r+   r   r.   Z
next_eventZ	NEED_DATAr%   r_   READ_NUM_BYTEStheir_stateZSEND_RESPONSEZreceive_data)r/   rM   rU   rV   msgr   r   r   r`      s    
 z$AsyncHTTP11Connection._receive_eventr#   c              
     s   | j 4 I d H b | jjtjkr^| jjtjkr^tj| _| j	  | j
d k	rlt }|| j
 | _n|  I d H  W 5 Q I d H R X d S N)r)   r.   Z	our_stater+   ZDONErj   r   r   r(   Zstart_next_cycler&   time	monotonicr'   aclose)r/   nowr   r   r   rG      s    

z&AsyncHTTP11Connection._response_closedc                   s   t j| _| j I d H  d S rm   )r   r   r(   r%   rp   r/   r   r   r   rp      s    zAsyncHTTP11Connection.aclosebool)r    r#   c                 C  s
   || j kS rm   )r$   r/   r    r   r   r   r<     s    z(AsyncHTTP11Connection.can_handle_requestc                 C  s   | j tjkS rm   r(   r   r   rr   r   r   r   is_available  s    z"AsyncHTTP11Connection.is_availablec                 C  s<   t  }| jd k	o|| jk}| jtjko2| jd}|p:|S )NZis_readable)rn   ro   r'   r(   r   r   r%   get_extra_info)r/   rq   Zkeepalive_expiredZserver_disconnectedr   r   r   has_expired  s    
z!AsyncHTTP11Connection.has_expiredc                 C  s   | j tjkS rm   ru   rr   r   r   r   is_idle   s    zAsyncHTTP11Connection.is_idlec                 C  s   | j tjkS rm   )r(   r   r   rr   r   r   r   	is_closed#  s    zAsyncHTTP11Connection.is_closedstrc                 C  s$   t | j}|d| jj d| j S )Nz, HTTP/1.1, , Request Count: )r{   r$   r(   namer*   rt   r   r   r   info&  s    
zAsyncHTTP11Connection.infoc              	   C  s6   | j j}t| j}d| d|d| jj d| j d	S )N<z [z, r|   z]>)	__class__r   r{   r$   r(   r}   r*   )r/   
class_namer    r   r   r   __repr__-  s    
"zAsyncHTTP11Connection.__repr__c                   s   | S rm   r   rr   r   r   r   
__aenter__8  s    z AsyncHTTP11Connection.__aenter__ztype[BaseException] | NonezBaseException | Noneztypes.TracebackType | None)exc_type	exc_value	tracebackr#   c                   s   |   I d H  d S rm   )rp   )r/   r   r   r   r   r   r   	__aexit__;  s    zAsyncHTTP11Connection.__aexit__)N)N)N)NNN)r   r   r   ri   r-   r0   rL   r@   rA   rR   rB   rg   r`   rG   rp   r<   rv   rx   ry   rz   r~   r   r   r   r   r   r   r   r   +   s4    K 
   r   c                   @  s:   e Zd ZddddddZddd	d
ZddddZdS )rE   r   r   r   )
connectionr1   r#   c                 C  s   || _ || _d| _d S )NF)_connection_request_closed)r/   r   r1   r   r   r   r0   E  s    z#HTTP11ConnectionByteStream.__init__re   rl   c                 C s   d| j i}zRtdt| j |4 I d H * | jjf |2 z3 d H W }|V  q46 W 5 Q I d H R X W nF tk
r } z(t  |  I d H  W 5 Q R X |W 5 d }~X Y nX d S )Nr1   Zreceive_response_body)r   r   r?   r   rg   rF   r   rp   )r/   rH   r]   rK   r   r   r   	__aiter__J  s    
z$HTTP11ConnectionByteStream.__aiter__c              
     sH   | j sDd| _ tdt| j4 I d H  | j I d H  W 5 Q I d H R X d S )NTr;   )r   r   r?   r   r   rG   rr   r   r   r   rp   X  s    z!HTTP11ConnectionByteStream.acloseN)r   r   r   r0   r   rp   r   r   r   r   rE   D  s   rE   c                   @  sz   e Zd ZddddddZddd	dd
ddZddd	ddddZddddZdddd	ddddZdddddZdS ) rD   r   rf   r   )r!   leading_datar#   c                 C  s   || _ || _d S rm   )_stream_leading_data)r/   r!   r   r   r   r   r0   `  s    z!AsyncHTTP11UpgradeStream.__init__Nintr   )	max_bytesrM   r#   c                   s@   | j r(| j d | }| j |d  | _ |S | j||I d H S d S rm   )r   r   r_   )r/   r   rM   bufferr   r   r   r_   d  s
    zAsyncHTTP11UpgradeStream.read)r   rM   r#   c                   s   | j ||I d H  d S rm   )r   rN   )r/   r   rM   r   r   r   rN   l  s    zAsyncHTTP11UpgradeStream.writerl   c                   s   | j  I d H  d S rm   )r   rp   rr   r   r   r   rp   o  s    zAsyncHTTP11UpgradeStream.aclosezssl.SSLContextz
str | None)ssl_contextserver_hostnamerM   r#   c                   s   | j |||I d H S rm   )r   	start_tls)r/   r   r   rM   r   r   r   r   r  s    z"AsyncHTTP11UpgradeStream.start_tlsr{   z
typing.Any)r~   r#   c                 C  s   | j |S rm   )r   rw   )r/   r~   r   r   r   rw   z  s    z'AsyncHTTP11UpgradeStream.get_extra_info)N)N)NN)	r   r   r   r0   r_   rN   rp   r   rw   r   r   r   r   rD   _  s     rD   )'
__future__r   enumloggingsslrn   typesrX   r+   Z_backends.baser   _exceptionsr   r   r   r   r	   Z_modelsr
   r   r   Z_synchronizationr   r   Z_tracer   Z
interfacesr   	getLoggerr?   Unionr[   r\   ZH11SendEventIntEnumr   r   rE   rD   r   r   r   r   <module>   s4   
  