o
    �õ±jÑ  ã                   @   sž   d dl Z d dlZd dlZd dlZd dlmZmZ d dlmZm	Z	 d dl
mZmZ d dlmZ d dlmZmZ G dd„ deƒZG d	d
„ d
ƒZG dd„ deƒZdS )é    N)Ú	UniTargetÚUniProto)ÚUniProxyProtoÚUniProxyTarget)Ú
PacketizerÚStreamPacketizer)ÚPacketizerSSL)Ú	UniServerÚUniConnectionc                   @   s&   e Zd Zddededejfdd„ZdS )ÚHTTPConnectionSettingsNÚserver_settingsÚgssapiÚlog_qc                 C   s   t  | |||¡ d S ©N)ÚRunningServerSettingsÚ__init__)Úselfr   r   r   © r   ú—/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/asysocks/unicomm/protocol/relay/http.pyr      s   zHTTPConnectionSettings.__init__r   )Ú__name__Ú
__module__Ú__qualname__ÚServerSettingsÚSPNEGORelayÚasyncioÚQueuer   r   r   r   r   r      s    r   c                
   @   s>   e Zd Zdedejdejdedef
dd„Z	dd	„ Z
d
d„ ZdS )ÚHTTPServerConnectionÚsettingsÚreaderÚwriterÚ	client_ipÚclient_portc                 C   sn   || _ || _|| _|j| _| jjd | _|| _|| _d| _d| _	d| _
| jjjdu r5d| _d| _	d| _
d S d S )	Nz2NTLMSSP - Microsoft NTLM Security Support Provideri‘  ÚUnauthorizedzWWW-AuthenticateTi—  zProxy Authentication RequiredzProxy-Authenticate)r    r!   r   r   Úauthentication_contextsÚntlmr   r   Úunauthorized_statusÚunauthorized_reasonÚauthorization_keyr   Úisproxy)r   r   r   r   r    r!   r   r   r   r      s   
ýzHTTPServerConnection.__init__c                 Ã   sL   �| j jd urd| j| jf }| j j |||f¡I d H  d S t ||¡ d S )NzHTTPCON-%s:%s)r   r   r    r!   ÚputÚloggerÚlog)r   ÚlevelÚmsgÚsrcr   r   r   Ú	log_async$   s
   €zHTTPServerConnection.log_asyncc           	   
   Ã   s8  �zû	 t j| jdd�I d H \}}|d ur|‚d|jvrZtƒ }d|_| j|_| j|_	dddd	| j
d
ddi|_|  dd| ¡  ¡I d H  | j | ¡ ¡ | j ¡ I d H  | j ¡  W d S |jd }| d
¡du rt|  dd| ¡I d H  W d S t |dd … ¡}| j |¡I d H \}}}|d ur�|‚|du rü|d urÖtƒ }d|_| j|_| j|_	dddd| j
dt |¡ ¡  ddi|_|  dd| ¡  ¡I d H  | j | ¡ ¡ | j ¡ I d H  qtƒ }d|_d|_d|_	ddddœ|_| j | ¡ ¡ | j ¡ I d H  W d S q t�y } z|  dd| ¡I d H  W Y d }~d S d }~ww )NTé
   )ÚtimeoutÚAUTHORIZATIONzHTTP/1.1ÚServerÚngixÚ
ConnectionÚcloseÚNTLMúContent-LengthÚ0é   zSending response: %sFz#Authdata doesnt seem to be NTLM! %sé   z
keep-alivezNTLM %si”  z	Not Found)r3   r5   r8   zClient connection error! %s)ÚHTTPRequestÚfrom_streamreaderr   Úheaders_upperÚHTTPResponseÚversionr%   Ústatusr&   Úreasonr'   Úheadersr/   Úto_bytesr   ÚwriteÚdrainr6   Ú
startswithÚbase64Ú	b64decoder$   Úauthenticate_relay_serverÚ	b64encodeÚdecodeÚ	Exception)	r   ÚreqÚerrÚresponseÚauthdata_rawÚauthdataÚresÚto_continueÚer   r   r   Úrun+   sx   €
ü

üýÄ>$€ÿzHTTPServerConnection.runN)r   r   r   r   r   ÚStreamReaderÚStreamWriterÚstrÚintr   r/   rV   r   r   r   r   r      s    "r   c                   @   sP   e Zd ZdZdedejdejfdd„Zdd„ Zd	d
„ Z	de
fdd„Zdd„ ZdS )ÚHTTPServerSocketz
	r   Úserver_queuer   c                 C   s,   t j| |||dd� |jj| _|jj| _d S )NzHTTP-TCP)Úlog_source_name)Ú
ServerBaser   r   ÚipÚport)r   r   r\   r   r   r   r   r   t   s   
zHTTPServerSocket.__init__c              
   Ã   sˆ   �z$| j  ¡ s#|j d¡I dH }|j |df¡I dH  | j  ¡ rW dS W dS  tyC } z|j d|f¡I dH  W Y d}~dS d}~ww )zN
		Reads data bytes from the socket and dispatches it to the incoming queue
		iÿÿ  N)Úshutdown_evtÚis_setr   ÚreadÚin_queuer)   rM   ©r   ÚclientÚdatarU   r   r   r   Úhandle_incomingz   s   €
þ€þz HTTPServerSocket.handle_incomingc              
   Ã   s¤   �z&| j  ¡ s%|j ¡ I dH }|j |¡ |j ¡ I dH  | j  ¡ rW dS W dS  tjy2   Y dS  t	yQ } z|  
ddt|ƒ ¡I dH  W Y d}~dS d}~ww )zN
		Reads data bytes from the outgoing queue and dispatches it to the socket
		Néc   z[TCP] handle_outgoing %s)ra   rb   Ú	out_queueÚgetr   rE   rF   r   ÚCancelledErrorrM   r/   rY   re   r   r   r   Úhandle_outgoing†   s   €
ý(€ÿz HTTPServerSocket.handle_outgoingÚ
connectionc           	   
   Ã   s  �d }d }zvz=d}d}t  | j¡}| j|_|j | j¡ t||||ƒ}| j d|f¡I d H  | 	¡ I d H  |  
dd||f ¡I d H  W n# tyf } zt ¡  |  
ddt|ƒ ¡I d H  W Y d }~nd }~ww W |d urp| ¡  |d urz| ¡  d S d S |d ur„| ¡  |d ur�| ¡  w w )NÚ r   Úhttpr0   z,Connection terminated, closing client! %s:%sri   z[TCP] handle_client %s)ÚcopyÚdeepcopyr   r   r   Úsetupr   r\   r)   rV   r/   rM   Ú	tracebackÚ	print_excrY   Úcancel)	r   rn   Úout_taskÚin_taskÚraddrÚrportÚconnection_settingsÚserverrU   r   r   r   Úhandle_client–   s:   €&€þ€ÿþ
ÿzHTTPServerSocket.handle_clientc                 Ã   s   �|   ¡ I d H  d S r   )Úlisten)r   r   r   r   rV   ¿   s   €zHTTPServerSocket.runN)r   r   r   Ú__doc__r   r   r   r   rh   rm   r
   r}   rV   r   r   r   r   r[   q   s    )r[   )r   rq   rt   rH   Úasysocks.unicomm.common.targetr   r   Úasysocks.unicomm.common.proxyr   r   Ú#asysocks.unicomm.common.packetizersr   r   Ú'asysocks.unicomm.common.packetizers.sslr   Úasysocks.unicomm.serverr	   r
   r   r   r   r^   r[   r   r   r   r   Ú<module>   s    ^