o
    ͷ6in6                     @   s  d dl mZ d dlmZ d dlmZmZmZmZ d dl	Z
d dlZ
d dlmZ d dlmZ d dlmZmZ dd	lmZmZmZmZ dd
lmZmZ ddlmZmZmZ ddlm Z  ddl!m"Z"m#Z#m$Z$m%Z% e e&Z'de(de)fddZ*G dd de#Z+G dd dZ,dS )    )
HTTPStatus)
SSLContext)IteratorDictListTupleN)H2Configuration)NoAvailableStreamIDError)SettingCodesSettings   )SyncLockSyncSemaphoreSyncSocketStreamSyncBackend)PoolTimeoutProtocolError)URLHeadersTimeoutDict)
get_logger   )SyncByteStreamSyncHTTPTransportConnectionStateNewConnectionRequiredstatus_codereturnc                 C   s(   z	t | jdW S  ty   Y dS w )Nascii    )r   phraseencode
ValueError)r    r#   Y/var/www/hoanhtaovolam_webdjango/env/lib/python3.10/site-packages/httpcore/_sync/http2.pyget_reason_phrase   s
   r%   c                   @   s  e Zd ZdZeddZ	d9dededefdd	Z	e
d
efddZe
d
efddZe
d
efddZd9deded
dfddZd:ddZ			d;dededededed
eeeeeeeef  ef fddZded
dfddZe
d
efdd Zd
efd!d"Zd:d#d$Zd%eded
efd&d'Z d%eded
e!j"j#fd(d)Z$ded
dfd*d+Z%d%eded,eded
df
d-d.Z&d%ed/eded
dfd0d1Z'd%eded
dfd2d3Z(d%ed4eded
dfd5d6Z)d%ed
dfd7d8Z*dS )<SyncHTTP2Connectioni   F)validate_inbound_headersNsocketbackendssl_contextc                 C   sP   || _ |d u r
t n|| _|| _tjj| jd| _d| _	i | _
i | _tj| _d S )N)configF)r(   r   r*   r)   h2
connectionH2ConnectionCONFIGh2_statesent_connection_initstreamseventsr   ACTIVEstate)selfr(   r)   r*   r#   r#   r$   __init__$   s   zSyncHTTP2Connection.__init__r   c                 C      t | ds| j | _| jS )N_initialization_lock)hasattrr)   create_lockr9   r6   r#   r#   r$   	init_lock6      
zSyncHTTP2Connection.init_lockc                 C   r8   )N
_read_lock)r:   r)   r;   r?   r<   r#   r#   r$   	read_lock>   r>   zSyncHTTP2Connection.read_lockc                 C   s,   t | ds| jjj}| jj|td| _| jS )N_max_streams_semaphore)	exc_class)r:   r0   local_settingsmax_concurrent_streamsr)   create_semaphorer   rA   )r6   max_streamsr#   r#   r$   max_streams_semaphoreF   s   

z)SyncHTTP2Connection.max_streams_semaphorehostnametimeoutc                 C   s   d S Nr#   )r6   rH   rI   r#   r#   r$   	start_tlsQ   s   zSyncHTTP2Connection.start_tlsc                 C   s   | j tjkrtj| _ d S d S rJ   )r5   r   IDLEREADYr<   r#   r#   r$   mark_as_readyT   s   z!SyncHTTP2Connection.mark_as_readymethodurlheadersstreamc                 C   s   |d u ri n|}| j  | jstj| _| | d| _W d    n1 s%w   Y  | j  z4z| j	 }W n t
yE   tj| _t w tj| _t|| d}|| j|< g | j|< ||||||W S  typ   | j   w )NT	stream_idr-   )r=   r1   r   r4   r5   send_connection_initrG   acquirer0   get_next_available_stream_idr	   FULLr   SyncHTTP2Streamr2   r3   request	Exceptionrelease)r6   rO   rP   rQ   rR   rI   rT   	h2_streamr#   r#   r$   rZ   X   s2   




zSyncHTTP2Connection.requestc                 C   sp   t dtjdtjdtjdid| j_| jjtjjj	= t
d|  | j  | jd | j }| j|| dS )	z
        The HTTP/2 connection requires some initial setup before we can start
        using individual request/response streams on it.
        Tr   d   i   )clientinitial_valueszinitiate_connection=%r   N)r   r
   ENABLE_PUSHMAX_CONCURRENT_STREAMSMAX_HEADER_LIST_SIZEr0   rC   r,   settingsENABLE_CONNECT_PROTOCOLloggertraceinitiate_connectionincrement_flow_control_windowdata_to_sendr(   write)r6   rI   rk   r#   r#   r$   rU   {   s   


z(SyncHTTP2Connection.send_connection_initc                 C   s   dS )NFr#   r<   r#   r#   r$   	is_closed   s   zSyncHTTP2Connection.is_closedc                 C   s
   | j  S rJ   )r(   is_connection_droppedr<   r#   r#   r$   rn      s   
z)SyncHTTP2Connection.is_connection_droppedc                 C   s2   t d|  | jtjkrtj| _| j  d S d S )Nzclose_connection=%r)rg   rh   r5   r   CLOSEDr(   closer<   r#   r#   r$   rp      s
   zSyncHTTP2Connection.closerT   c                 C   sZ   | j |}| j j}t||}|dkr+| | | j |}| j j}t||}|dks|S )a  
        Returns the maximum allowable outgoing flow for a given stream.
        If the allowable flow is zero, then waits on the network until
        WindowUpdated frames have increased the flow rate.
        https://tools.ietf.org/html/rfc7540#section-6.9
        r   )r0   local_flow_control_windowmax_outbound_frame_sizeminreceive_events)r6   rT   rI   
local_flowconnection_flowflowr#   r#   r$   wait_for_outgoing_flow   s   


z*SyncHTTP2Connection.wait_for_outgoing_flowc                 C   sT   | j  | j| s| | | j| r	W d   n1 sw   Y  | j| dS )z
        Returns the next event for a given stream.
        If no events are available yet, then waits on the network until
        an event is available.
        Nr   )r@   r3   rt   pop)r6   rT   rI   r#   r#   r$   wait_for_event   s   


z"SyncHTTP2Connection.wait_for_eventc                 C   s   | j | j|}| j|}|D ]%}t|dd}td|| t|dr(t	||| j
v r5| j
| | q| j }| j || dS )zK
        Read some data from the network, and update the H2 state.
        rT   r   z#receive_event stream_id=%r event=%s
error_codeN)r(   readREAD_NUM_BYTESr0   receive_datagetattrrg   rh   r:   r   r3   appendrk   rl   )r6   rI   datar3   eventevent_stream_idrk   r#   r#   r$   rt      s   


z"SyncHTTP2Connection.receive_events
end_streamc                 C   sL   t d|| | jj|||d | jjd|d | j }| j|| d S )Nz$send_headers stream_id=%r headers=%r)r   ra   )rT   )rg   rh   r0   send_headersrj   rk   r(   rl   )r6   rT   rQ   r   rI   rk   r#   r#   r$   r      s
   
z SyncHTTP2Connection.send_headerschunkc                 C   s8   t d|| | j|| | j }| j|| d S )Nzsend_data stream_id=%r chunk=%r)rg   rh   r0   	send_datark   r(   rl   )r6   rT   r   rI   rk   r#   r#   r$   r      s   
zSyncHTTP2Connection.send_datac                 C   s4   t d| | j| | j }| j|| d S )Nzend_stream stream_id=%r)rg   rh   r0   r   rk   r(   rl   )r6   rT   rI   rk   r#   r#   r$   r      s   
zSyncHTTP2Connection.end_streamamountc                 C   s*   | j || | j  }| j|| d S rJ   )r0   acknowledge_received_datark   r(   rl   )r6   rT   r   rI   rk   r#   r#   r$   r      s   
z-SyncHTTP2Connection.acknowledge_received_datac                 C   s   zFt d| | j|= | j|= | js/| jtjkrtj| _n"| jtjkr7| 	  W | j
  d S W | j
  d S W | j
  d S W | j
  d S | j
  w )Nzclose_stream stream_id=%r)rg   rh   r2   r3   r5   r   r4   rL   rX   rp   rG   r\   )r6   rT   r#   r#   r$   close_stream   s    

z SyncHTTP2Connection.close_streamrJ   r   NNNN)+__name__
__module____qualname__r}   r   r/   r   r   r   r7   propertyr   r=   r@   r   rG   bytesr   rK   rN   r   r   r   r   intr   rZ   rU   boolrm   rn   rp   rx   r,   r3   Eventrz   rt   r   r   r   r   r   r#   r#   r#   r$   r&       s    




#!


	

r&   c                   @   s   e Zd ZdededdfddZ			ddeded	ed
e	de
deeeeeeeef  e	f fddZdeded	edede
ddfddZd
e	de
ddfddZde
deeeeeef  f fddZde
dee fddZdddZdS )rY   rT   r-   r   Nc                 C   s   || _ || _d S rJ   rS   )r6   rT   r-   r#   r#   r$   r7   	  s   
zSyncHTTP2Stream.__init__rO   rP   rQ   rR   rI   c           
      C   s   |d u rg ndd |D }|d u rt  n|}|d u ri n|}tdd |D }d|v p.d|v }| ||||| |r@| || | |\}}t|}	t | || jd}d||	||fS )	Nc                 S   s   g | ]
\}}|  |fqS r#   )lower.0kvr#   r#   r$   
<listcomp>  s    z+SyncHTTP2Stream.request.<locals>.<listcomp>c                 s   s    | ]\}}|V  qd S rJ   r#   )r   keyvaluer#   r#   r$   	<genexpr>  s    z*SyncHTTP2Stream.request.<locals>.<genexpr>s   content-length   transfer-encoding)iterator
close_funcs   HTTP/2)r   setr   	send_bodyreceive_responser%   	body_iter_response_closed)
r6   rO   rP   rQ   rR   rI   seen_headershas_bodyr   reason_phraser#   r#   r$   rZ     s   zSyncHTTP2Stream.requestr   c                 C   s   |\}}}}	ddd |}
|d u s||
kr|}nd||f }d|fd|fd|fd|	fgd	d
 |D  }| }| j| j||| d S )NP   i  )s   https   httpss   %s:%ds   :methods
   :authoritys   :schemes   :pathc                 S   s    g | ]\}}|d vr||fqS ))s   hostr   r#   r   r#   r#   r$   r   @  s     z0SyncHTTP2Stream.send_headers.<locals>.<listcomp>)getr-   r   rT   )r6   rO   rP   rQ   r   rI   schemerH   portpathdefault_port	authorityr   r#   r#   r$   r   ,  s   zSyncHTTP2Stream.send_headersc                 C   sp   |D ]+}|r-| j | j|}tt||}|d | ||d  }}| j | j|| |sq| j | j| d S rJ   )r-   rx   rT   rs   lenr   r   )r6   rR   rI   r   max_flow
chunk_sizer   r#   r#   r$   r   E  s   zSyncHTTP2Stream.send_bodyc                 C   sx   	 | j | j|}t|tjjrnqd}g }|jD ]\}}|dkr+t|j	ddd}q|
ds7|||f q||fS )zH
        Read the response status and headers from the network.
        T   s   :statusr   ignore)errors   :)r-   rz   rT   
isinstancer,   r3   ResponseReceivedrQ   r   decode
startswithr   )r6   rI   r   r   rQ   r   r   r#   r#   r$   r   Q  s   
z SyncHTTP2Stream.receive_responsec                 c   s`    	 | j | j|}t|tjjr"|j}| j | j|| |j	V  nt|tjj
tjjfr/d S qrJ   )r-   rz   rT   r   r,   r3   DataReceivedflow_controlled_lengthr   r   StreamEndedStreamReset)r6   rI   r   r   r#   r#   r$   r   f  s   
zSyncHTTP2Stream.body_iterc                 C   s   | j | j d S rJ   )r-   r   rT   r<   r#   r#   r$   r   r  s   z SyncHTTP2Stream._response_closedr   r   )r   r   r   r   r&   r7   r   r   r   r   r   r   r   rZ   r   r   r   r   r   r   r   r#   r#   r#   r$   rY     sN    


rY   )-httpr   sslr   typingr   r   r   r   h2.connectionr,   	h2.events	h2.configr   h2.exceptionsr	   h2.settingsr
   r   _backends.autor   r   r   r   _exceptionsr   r   _typesr   r   r   _utilsr   baser   r   r   r   r   rg   r   r   r%   r&   rY   r#   r#   r#   r$   <module>   s$     i