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rt }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
		Nc   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    ^