o
    j(                     @   s   d dl mZmZ d dlmZ d dlmZmZ d dlm	Z	 d dl
Z
d dlZd dlmZ d dlZd dlZd dlZG dd dZG d	d
 d
ZG dd dZdd Zedkr[e
e  dS dS )    )	UniTargetUniProto)UniConnection)StreamPacketizer
Packetizer)	UniServerN)countc                   @   s\   e Zd Ze ZddefddZdd Zdd Zd	d
 Z	dd Z
dd Zdd ZdddZdS )AsysocksHTTPWrapperNstreamc                 C   sV   || _ || _d| _|| _ttj| _ddtj	 tj
gd| _ttj| _d S )Ni    h11-example-asysocks-server/ascii)log_callback	client_idMAX_RECVr
   h11
ConnectionSERVERconnjoin__version__
PRODUCT_IDencodeidentnextr	   _next_id_obj_id)selfr   r
   r    r   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/asysocks/unicomm/protocol/server/http/httpserver.py__init__   s   zAsysocksHTTPWrapper.__init__c                    <   dd |D }d |}| jd ur| |I d H  d S d S )Nc                 S      g | ]}t |qS r   str.0xr   r   r   
<listcomp>        z-AsysocksHTTPWrapper.debug.<locals>.<listcomp>r   r   r   r   argsmsgr   r   r   debug      

zAsysocksHTTPWrapper.debugc                    sT   t |tjus
J | j|}z| j|I d H  W d S  ty)   | j   w N)	typer   ConnectionClosedr   sendr
   writeBaseExceptionsend_failed)r   eventdatar   r   r   r3   %   s   
zAsysocksHTTPWrapper.sendc              
      s   | j jr| dI d H  tjd|  d}| |I d H  z"| d| j I d H  | j	 I d H }| d| j|f I d H  W n t
y] } z| d|I d H  d}W Y d }~nd }~ww | j | d S )NzSending 100 Continued   status_codeheadersz[%s] Reading from peer...z[%s] DATA: %szError reading from peer:    )r   !they_are_waiting_for_100_continuer.   r   InformationalResponsebasic_headersr3   r   r
   read_one	Exceptionreceive_data)r   go_aheadr8   excr   r   r   _read_from_peer3   s"   z#AsysocksHTTPWrapper._read_from_peerc                    sF   	 | j  }| d| j|f I d H  |tju r!|  I d H  q|S )NTz[%s] Event: %s)r   
next_eventr.   r   r   	NEED_DATArF   )r   r7   r   r   r   rG   E   s   

zAsysocksHTTPWrapper.next_eventc              
      s@   z| j  I d H  W d S  ty } zW Y d }~d S d }~ww r0   )r
   closerB   )r   rE   r   r   r   shutdown_and_clean_upN   s   z)AsysocksHTTPWrapper.shutdown_and_clean_upc                 C   s   d|   dfd| jfgS NDater   Server)format_date_timer   r   r   r   r   r   r@   V      z!AsysocksHTTPWrapper.basic_headersc                 C   s(   |du rt j t jj}tjj|ddS z1Generate a RFC 7231 / RFC 9110 IMF-fixdate stringNT)usegmtdatetimenowtimezoneutcemailutilsformat_datetime)r   dtr   r   r   rN   ^   s   z$AsysocksHTTPWrapper.format_date_timer0   )__name__
__module____qualname__r   r   r   r    r.   r3   rF   rG   rJ   r@   rN   r   r   r   r   r	      s    	r	   c                   @   sF   e Zd Zdd ZedddZdd Zded	ej	fd
dZ
dd ZdS )HTTPServerHandlerc                 C   s*   d | _ ddtj tjgd| _d S )Nr   r   r   )_wrapperr   r   r   r   r   r   rO   r   r   r   r    e   s   zHTTPServerHandler.__init__Nc                 C   s(   | du rt j t jj} tjj| ddS rQ   rS   )r[   r   r   r   rN   k   s   z"HTTPServerHandler.format_date_timec                 C   s   dt  dfd| jfgS rK   )r_   rN   r   r   rO   r   r   r   r@   r   rP   zHTTPServerHandler.basic_headerswrapperrequestc                    sx   || _ |jd}t| d| d }|d u r+tjd| d}d|_||I d H S ||I d H }||I d H  d S )Nr   do_i  r:   s   Method Not Allowed)	r`   methoddecodegetattrr   Responser@   bodyr3   )r   ra   rb   rd   funcresponser   r   r   _process_requestz   s   z"HTTPServerHandler._process_requestc                    s   d d}d}|  }|d |dtt|f tj||d}| j|I d H  | jtj	|dI d H  | jt
 I d H  d S )NzHello, world!r      )zContent-Typez	text/htmlzContent-Lengthr:   )r8   )r   r@   appendr$   lenr   rg   r`   r3   DataEndOfMessage)r   r7   rh   r;   r<   resr   r   r   do_GET   s   

zHTTPServerHandler.do_GETr0   )r\   r]   r^   r    staticmethodrN   r@   r	   r   Eventrk   rr   r   r   r   r   r_   d   s    r_   c                   @   sP   e Zd ZddedefddZdd Zdd	 Zd
d Zdd Z	dd Z
dd ZdS )
HTTPServerNclient_handlertargetc                 C   s8   || _ || _|| _|| _g | _d| _d | _t | _	d S )Nr   )
r   rw   rv   ssl_ctxclients
id_counter_HTTPServer__main_taskasynciort   started_evt)r   rv   rw   rx   r   r   r   r   r       s   zHTTPServer.__init__c                    r!   )Nc                 S   r"   r   r#   r%   r   r   r   r(      r)   z$HTTPServer.debug.<locals>.<listcomp>r   r*   r+   r   r   r   r.      r/   zHTTPServer.debugc                    s&   t |  | _t dI d H  | S )N   )r|   create_taskserver{   sleeprO   r   r   r   
__aenter__   s   zHTTPServer.__aenter__c                    s   |   I d H  d S r0   )	terminate)r   exc_typerE   tbr   r   r   	__aexit__   s   zHTTPServer.__aexit__c                    s&   | j D ]	}| I d H  qg | _ d S r0   )ry   r   )r   clientr   r   r   r      s   

zHTTPServer.terminatec              
      s  z6z	| j }|  j d7  _ t||}|  }| d| I d H  	 |jjtjtjtj	tjikr2n|jjtj tj
kr=n|jjtj	 tj
krHn|jjtjtjtj	tjikr\|j  q"|jjtjtjtj	tjiks|jjtjtjtj	tjiks| d| I d H  | |jjI d H  nz_| dI d H  | I d H }|d u rW ni| d|I d H  t|tju rz|||I d H  W n ty } zW Y d }~W n?d }~ww W q"t|tju rW n/| d|t|f I d H  W n ty
 } z| d|I d H  W Y d }~nd }~ww q#W n ty$ } z
t  W Y d }~nd }~ww W | I d H  d S W | I d H  d S | I d H  w )	Nr~   z'Server: New client connected with id %sTz&[%s] Server: Connection state not idlez$Server main loop waiting for requestzServer main loop got event:z"[%s] Server: unknown event type %szError during response handler: )rz   r	   rv   r.   r   statesr   CLIENTCLOSEDr   
MUST_CLOSEDONEstart_next_cycleIDLE	SEND_BODYrG   r1   Requestrk   rB   r2   	traceback	print_excrI   )r   
connectionr   ra   handlerr7   rE   er   r   r   __handle_connection   sl   

 &"zHTTPServer.__handle_connectionc              
      s^   zt  }t| j|}|| jI d H W S  ty. } zt  d |fW  Y d }~S d }~ww r0   )r   r   rw   serve_callback_HTTPServer__handle_connectionrB   r   r   )r   
packetizerserverr   r   r   r   r      s   zHTTPServer.serve)NN)r\   r]   r^   r_   r   r    r.   r   r   r   r   r   r   r   r   r   ru      s    3ru   c                     s   ddl m ddlmm ddlm  dd } dtfdd	fd
dtddt	j
}t t| }fddt fdd|d}| I d H  td d S )Nr   )spnegorelay_ntlm_factory)NTLMRelaySettingsntlmrelay_factory)HTTPRelayHandlerc                    s   	 |   I d H }t| qr0   )getprint)queueitemr   r   r   read_q   s
   zrelaytest.<locals>.read_qr-   c                    s   t |  d S r0   )r   )r-   r   r   r   	dummy_log   s   zrelaytest.<locals>.dummy_logc                     s     } | _ d| _| S )N   )r   timeout)ntlm_settings)r   r   r   r   ntlm_settings_factory   s   z(relaytest.<locals>.ntlm_settings_factoryz0.0.0.0P   c                      s    fddS )Nc                      s    S r0   r   r   )r   r   r   r   <lambda>	      z-relaytest.<locals>.<lambda>.<locals>.<lambda>r   r   )auth_relay_queuer   r   r   r   r   r   	  r)   zrelaytest.<locals>.<lambda>c                      s    S r0   r   r   )r   relay_handlerr   r   r   
  r   )r   done)%asyauth.protocols.spnego.relay.nativer   #asyauth.protocols.ntlm.relay.nativer   r   /asysocks.unicomm.protocol.server.http.httprelayr   r$   r   r   
SERVER_TCPr|   Queuer   ru   r   r   )r   rw   r'   r   r   )r   r   r   r   r   r   r   r   r   	relaytest   s   r   __main__)asysocks.unicomm.common.targetr   r   "asysocks.unicomm.common.connectionr   #asysocks.unicomm.common.packetizersr   r   asysocks.unicomm.serverr   r|   r   	itertoolsr   rT   email.utilsrX   r   r	   r_   ru   r   r\   runr   r   r   r   <module>   s"   W-\!