
    i                         d dl Z d dlZd dlZd dlmZ ddlmZ d dlZd dl	Zd Z
d Zd Z G d d	          Zd
eeedZdS )    N)urlsplit   )
exceptionsc                 F      G  fddt           j        j                  }|S )Nc                   n     e Zd Z fdZ fdZfdZfdZfdZd Zd Z	d Z
 fd	Zd
 Z xZS )$get_tornado_handler.<locals>.Handlerc                      t                      j        |i | t          j        t                    r!j        dk    rd | _        nj        g| _        nj        | _        t          j                    | _        d S )N*)	super__init__
isinstancecors_allowed_originsstrallowed_originsasyncioQueuereceive_queue)selfargskwargs	__class__engineio_servers      I/usr/local/lib/python3.11/dist-packages/engineio/async_drivers/tornado.pyr   z-get_tornado_handler.<locals>.Handler.__init__   s    EGGd-f---/>DD L"73>>+/D(( (<,>D(( (7'K$!(D    c                    K   | j         j                            dd                                          dk    r9 t	                      j        |i |}t          j        |          r
| d {V  d S d S                     |            d {V  d S )NUpgrade 	websocket)requestheadersgetlowerr   inspectiscoroutinehandle_request)r   r   r   retr   r   s       r   r!   z(get_tornado_handler.<locals>.Handler.get   s      |#''	266<<>>+MM!eggk42622&s++ IIIIIIIII  &44T:::::::::::r   c                 Z   K   t          j                            |                      d S N)r   ensure_futurer%   r   r   r   r   s      r   openz)get_tornado_handler.<locals>.Handler.open!   s,      !/"@"@"F"FGGGGGr   c                 B   K                        |            d {V  d S r(   r%   r*   s      r   postz)get_tornado_handler.<locals>.Handler.post%   3      !0066666666666r   c                 B   K                        |            d {V  d S r(   r-   r*   s      r   optionsz,get_tornado_handler.<locals>.Handler.options(   r/   r   c                 J   K   | j                             |           d {V  d S r(   )r   putr   messages     r   
on_messagez/get_tornado_handler.<locals>.Handler.on_message+   s5      $((11111111111r   c                 D   K   | j                                          d {V S r(   )r   r!   r   s    r   get_next_messagez5get_tornado_handler.<locals>.Handler.get_next_message.   s-      +//111111111r   c                 :    | j                             d            d S r(   )r   
put_nowaitr8   s    r   on_closez-get_tornado_handler.<locals>.Handler.on_close1   s    ))$/////r   c                 j    | j         	|| j         v rdS t                                          |          S )NT)r   r   check_origin)r   originr   s     r   r>   z1get_tornado_handler.<locals>.Handler.check_origin4   s6    #+v9M/M/Mt77''///r   c                     i S r(    r8   s    r   get_compression_optionsz<get_tornado_handler.<locals>.Handler.get_compression_options9   s    Ir   )__name__
__module____qualname__r   r!   r+   r.   r1   r6   r9   r<   r>   rB   __classcell__)r   r   s   @r   Handlerr      s       
	1 
	1 
	1 
	1 
	1 
	1	; 	; 	; 	; 	; 	;	H 	H 	H 	H 	H	7 	7 	7 	7 	7	7 	7 	7 	7 	7	2 	2 	2	2 	2 	2	0 	0 	0	0 	0 	0 	0 	0
	 	 	 	 	 	 	r   rG   )tornador   WebSocketHandler)r   rG   s   ` r   get_tornado_handlerrJ      sE    / / / / / / /'#4 / / /b Nr   c                     G d d          }| j         j        }t          | j         j                  }| j         j        }| j         j        r|d| j         j        z   z  }i d ||          dt
          j        dddd	d
dddddddd| j         j        d| j         j        pdd|dd| j         j        z  ddddddddd| }| j         j	        
                                D ]O\  }}|                                }|dk    r||d<   %|dk    r||d <   1d!|                    d"d#          z  }|||<   P|                    d$d%          |d&<   |j        }	|	|d'<   d|d(<   |S ))zThis function takes the arguments passed to the request handler and
    uses them to generate a WSGI compatible environ dictionary.
    c                       e Zd Zd ZddZdS )+translate_request.<locals>.AwaitablePayloadc                     |pd| _         d S Nr   payload)r   rQ   s     r   r   z4translate_request.<locals>.AwaitablePayload.__init__E   s    ">cDLLLr   Nc                 r   K   || j         }d| _         n#| j         d |         }| j         |d          | _         |S rO   rP   )r   lengthrs      r   readz0translate_request.<locals>.AwaitablePayload.readH   sB      ~L"L&)#|FGG4Hr   r(   )rC   rD   rE   r   rU   rA   r   r   AwaitablePayloadrM   D   s7        	* 	* 	*	 	 	 	 	 	r   rV   ?z
wsgi.inputzwsgi.errorszwsgi.version)   r   z
wsgi.asyncTzwsgi.multithreadFzwsgi.multiprocesszwsgi.run_onceSERVER_SOFTWAREaiohttpREQUEST_METHODQUERY_STRINGr   RAW_URISERVER_PROTOCOLzHTTP/%sREMOTE_ADDRz	127.0.0.1REMOTE_PORT0SERVER_NAMESERVER_PORTtornado.handlerzCONTENT-TYPECONTENT_TYPEzCONTENT-LENGTHCONTENT_LENGTHzHTTP_%s-_HTTP_X_FORWARDED_PROTOhttpzwsgi.url_scheme	PATH_INFOSCRIPT_NAME)r   bodyr   pathquerysysstderrmethodversionr    itemsupperreplacer!   )
handlerrV   rQ   	uri_partsfull_urienvironhdr_name	hdr_valuekey	path_infos
             r   translate_requestr   @   s0           o"G-..I#H 0C'////&&w//sz 	 	d	
 	E 	U 	 	9 	'/0 	-3 	8 	9w'>> 	{ 	s 	y  	s!" 	7#G(  '6<<>> 
! 
!)>>##~%%&/GN#)))(1G$%(**3444 !(-Ev!N!NGI$GKGMNr   c                 >   |d         }	 |                     t          |                                 d                              n# t          $ r Y dS w xY w|D ]\  }}|                    ||           |                    |           |                                 dS )zTThis function generates an appropriate response object for this async
    mode.
    rd   r   N)
set_statusintsplitRuntimeError
set_headerwritefinish)statusr    rQ   rz   tornado_handlerheadervalues          r   make_responser      s     /0O""3v||~~a'8#9#9::::    	 ! 2 2""651111'"""s   :A 
AAc                   0    e Zd ZdZd Zd Zd Zd Zd ZdS )	WebSocketz
    This wrapper class provides a tornado WebSocket interface that is
    somewhat compatible with eventlet's implementation.
    c                 "    || _         d | _        d S r(   )rw   r   )r   rw   servers      r   r   zWebSocket.__init__   s    #r   c                 h   K   |d         | _         || _        |                     |            d {V  d S )Nrd   )r   rz   rw   )r   rz   s     r   __call__zWebSocket.__call__   sE      &'89ll4           r   c                 <   K   | j                                          d S r(   )r   closer8   s    r   r   zWebSocket.close   s!      ""$$$$$r   c                    K   	 | j                             |t          |t                               d S # t          j        j        $ r t          j                    w xY w)N)binary)	r   write_messager   bytesrH   r   WebSocketClosedErrorr   EngineIOErrorr4   s     r   sendzWebSocket.send   st      	- ..
7E : : / < < < < < 5 	- 	- 	-*,,,	-s	   /5 (Ac                    K   | j                                          d {V }t          |t                    s#t          |t                    st                      |S r(   )r   r9   r   r   r   OSError)r   msgs     r   waitzWebSocket.wait   s^      (99;;;;;;;;#u%% 	sC((	))O
r   N)	rC   rD   rE   __doc__r   r   r   r   r   rA   r   r   r   r      si         $ $ $! ! !
% % %- - -    r   r   T)r   r   r   r   )r   r#   rp   urllib.parser   r   r   tornado.webrH   tornado.websocketrJ   r   r   r   _asyncrA   r   r   <module>r      s      



 ! ! ! ! ! !              2 2 2j> > >B  "       B *"	
 
r   