o
    �õ±jÍ  ã                   @   s†   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 d dl	m
Z
 d dlmZmZ d dlmZ d dlmZ d dlmZ G dd	„ d	ƒZdS )
é    N)ÚListÚTupleÚAnyÚUnionÚDict)Ú	UniClient)Ú	UniTargetÚUniProto)Ú
Packetizer)ÚHTTPResponse)Ú
HTTPTargetc                   @   s¼   e Zd Zd!defdd„Zdd„ Zdd„ Zed	d
„ ƒZedd„ ƒZ	dd„ Z
dd„ Zdd„ Zd"deeeef  dedefdd„Zdd„ Zdg ddfdededeeeef  dedef
dd „ZdS )#ÚHTTPClientTransportú
keep-aliveÚtargetc                 C   s.   || _ d | _d | _d | _|| _|| _d| _d S ©NF)r   Úconnection_closed_evtÚ
connectionÚhttpconnÚrequest_connection_typeÚresponse_connection_typeÚ*_HTTPClientTransport__disconnect_requested)Úselfr   r   © r   ú¢/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/asysocks/unicomm/protocol/client/http/transport.pyÚ__init__   s   
zHTTPClientTransport.__init__c              
   C  sÀ   �z@| j  ¡ du r8| j ¡ }|tju r!| j ¡ I d H }| j |¡ |tj	u r.|  
¡ I d H  n
|V  | j  ¡ du s	|  ¡ I d H  W d S  ty_ } z|  
¡ I d H  t ¡  W Y d }~d S d }~ww r   )r   Úis_setr   Ú
next_eventÚh11Ú	NEED_DATAr   Úread_oneÚreceive_dataÚConnectionClosedÚ
disconnectÚdisconnect_if_neededÚ	ExceptionÚ	tracebackÚ	print_exc)r   ÚeventÚdataÚer   r   r   Ú__next_event   s$   €


ø	€þz HTTPClientTransport.__next_eventc                 Ã   sH   �| j  |¡}t|ƒtju rd| _d S |dkrd S | j |¡I d H  d S )NTó    )r   ÚsendÚtyper   r!   r   r   Úwrite)r   r'   r(   r   r   r   Ú__send)   s   €zHTTPClientTransport.__sendc                 C   s   | j | j  kodkS   S )Nr   )r   r   ©r   r   r   r   Úsupports_keepalive5   s   z&HTTPClientTransport.supports_keepalivec                 C   s   | j du o| j ¡ du S )NTF)r1   r   r   r0   r   r   r   Ú	can_reuse9   s   zHTTPClientTransport.can_reusec                 Ã   sB   �t jt jd�| _t ¡ | _tƒ }t| j	|ƒ}| 
¡ I d H | _d S )N)Úour_role)r   Ú
ConnectionÚCLIENTr   ÚasyncioÚEventr   r
   r   r   Úconnectr   )r   Ú
packetizerÚclientr   r   r   r8   =   s   €
zHTTPClientTransport.connectc                 Ã   s"   �| j du r|  ¡ I d H  d S d S r   )r2   r"   r0   r   r   r   r#   D   s   €
ÿz(HTTPClientTransport.disconnect_if_neededc                 Ã   s4   �d| _ | j ¡  | jd ur| j ¡ I d H  d S d S )NT)r   r   Úsetr   Úcloser0   r   r   r   r"   H   s   €

ÿzHTTPClientTransport.disconnectr+   FÚheadersr(   Úneed_lengthc                 C   sÎ   d}d}d}|D ])}|d   ¡ dkrd}q|d   ¡ dkr'd}|d   ¡ | _q|d   ¡ dkr1d}q|du r@| d| j ¡ f¡ |du rL| d	| jf¡ |du re|du re|d u rZd
}| dtt|ƒƒf¡ |S )NFr   ÚhostTr   é   zcontent-lengthÚHostr4   r+   zContent-Length)Úlowerr   Úappendr   Úget_hostname_or_ipÚstrÚlen)r   r=   r(   r>   Úhas_hostÚhas_connectionÚ
has_lengthÚentryr   r   r   Ú__correct_headersO   s*   €z%HTTPClientTransport.__correct_headersc                 Ã   sn   �|   ¡ 2 z.3 d H W }t|ƒtju rt || j | |¡  S t|ƒtju r(tdƒ‚t|ƒtju r3tdƒ‚q6 d S )Nz.Response ended without server sending headers!z!Server terminated the connection!)	Ú _HTTPClientTransport__next_eventr-   r   ÚResponser   Úfrom_h11_headerÚEndOfMessager$   r!   )r   Úfullurlr'   r   r   r   Ú__read_headere   s   €ÿûz!HTTPClientTransport.__read_headerú/NÚreq_typec                 Ã   sð   �| j jtj | j jtj   krtjkrn n| j  ¡  |  |||¡}tj|||d�}|  	|¡I d H  |d urNt
|ƒtu rB| ¡ }|  	tj|d�¡I d H  |  	t ¡ ¡I d H  |  |¡I d H }	|	jD ]}
|
 ¡ dkru|	j|
 d  ¡ | _qc|	S )N)Úmethodr   r=   )r(   r   r   )r   Ústatesr   r5   ÚSERVERÚDONEÚstart_next_cycleÚ%_HTTPClientTransport__correct_headersÚRequestÚ_HTTPClientTransport__sendr-   rE   ÚencodeÚDatarO   Ú!_HTTPClientTransport__read_headerr=   rB   r   )r   rP   rS   r   r=   r(   r>   Úrequest_headerÚrequest_eventÚresponseÚheaderr   r   r   Úrequestn   s*   €.
ý
€zHTTPClientTransport.request)r   )r+   F)Ú__name__Ú
__module__Ú__qualname__r   r   rL   r[   Úpropertyr1   r2   r8   r#   r"   r   r   rE   ÚbytesÚboolrY   r^   rc   r   r   r   r   r      s    	

$8	r   )r   r6   r%   Útypingr   r   r   r   r   Úasysocks.unicomm.clientr   Úasysocks.unicomm.common.targetr   r	   Ú#asysocks.unicomm.common.packetizersr
   Ú6asysocks.unicomm.protocol.client.http.commons.messagesr   Ú4asysocks.unicomm.protocol.client.http.commons.targetr   r   r   r   r   r   Ú<module>   s    