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 Continueéd   ©Ú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 r£W ni|  d|¡I d H  t|ƒtju rÔz| ||¡I d H  W n tyÑ } zW Y d }~W n?d }~ww W q"t|ƒtju rÝW 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.0éP   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-\!ÿ