
    wg                     p    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y)    N)urlsplit   )
exceptionsc                 R      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        |   |i | t        j                  t              r*j                  dk(  rd | _        n$j                  g| _        nj                  | _        t        j                         | _        y )N*)	super__init__
isinstancecors_allowed_originsstrallowed_originsasyncioQueuereceive_queue)selfargskwargs	__class__engineio_servers      c/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/engineio/async_drivers/tornado.pyr   z-get_tornado_handler.<locals>.Handler.__init__   sn    Gd-f-/>>D"773>+/D( (<<,>D( (7'K'K$!(D    c                   K   | j                   j                  j                  dd      j                         dk(  r0t	        |   |i |}t        j                  |      r| d {    y y j                  |        d {    y 7  7 w)NUpgrade 	websocket)requestheadersgetlowerr   r   iscoroutinehandle_request)r   r   r   retr   r   s       r   r!   z(get_tornado_handler.<locals>.Handler.get   s{     ||##''	26<<>+Mgk4262&&s+II , &44T::: :s$   A!B	$B%B	?B B	B	c                 V   K   t        j                  j                  |              y wN)r   ensure_futurer$   r   r   r   r   s      r   openz)get_tornado_handler.<locals>.Handler.open    s      !!/"@"@"FGs   &)c                 D   K   j                  |        d {    y 7 wr'   r$   r)   s      r   postz)get_tornado_handler.<locals>.Handler.post$        !00666     c                 D   K   j                  |        d {    y 7 wr'   r,   r)   s      r   optionsz,get_tornado_handler.<locals>.Handler.options'   r.   r/   c                 V   K   | j                   j                  |       d {    y 7 wr'   )r   putr   messages     r   
on_messagez/get_tornado_handler.<locals>.Handler.on_message*   s      $$((111s   )')c                 R   K   | j                   j                          d {   S 7 wr'   )r   r!   r   s    r   get_next_messagez5get_tornado_handler.<locals>.Handler.get_next_message-   s!     ++//1111s   '%'c                 :    | j                   j                  d        y r'   )r   
put_nowaitr8   s    r   on_closez-get_tornado_handler.<locals>.Handler.on_close0   s    ))$/r   c                 X    | j                   || j                   v ryt        | 	  |      S )NT)r   r   check_origin)r   originr   s     r   r>   z1get_tornado_handler.<locals>.Handler.check_origin3   s/    ##+v9M9M/M7'//r   c                     i S r'    r8   s    r   get_compression_optionsz<get_tornado_handler.<locals>.Handler.get_compression_options8   s    Ir   )__name__
__module____qualname__r   r!   r*   r-   r1   r6   r9   r<   r>   rB   __classcell__)r   r   s   @r   Handlerr      s6    
	1	;	H	7	7	2	2	0	0
	r   rG   )tornador   WebSocketHandler)r   rG   s   ` r   get_tornado_handlerrJ   
   s#    /'##44 /b Nr   c                 Z    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                  xs dd|dd| j                   j                  z  ddddddddd| }| j                   j                  j                         D ]E  \  }}|j                         }|dk(  r||d<   !|dk(  r||d <   ,d!|j                  d"d#      z  }|||<   G |j                  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y)+translate_request.<locals>.AwaitablePayloadc                     |xs d| _         y Nr   payload)r   rQ   s     r   r   z4translate_request.<locals>.AwaitablePayload.__init__D   s    ">cDLr   Nc                    K   || j                   }d| _         |S | j                   d | }| j                   |d  | _         |S wrO   rP   )r   lengthrs      r   readz0translate_request.<locals>.AwaitablePayload.readG   sK     ~LL" H LL&)#||FG4Hs   =?r'   )rC   rD   rE   r   rU   rA   r   r   AwaitablePayloadrM   C   s    	*	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   ?   s#     oo""G--.I##HC'//////&w/szz 	 	d	
 	E 	U 	 	9 	'//00 	--3 	8 	9w'>'>> 	{ 	s 	y  	s!" 	7#G(  '66<<> 
!)>>#~%&/GN#))(1G$%(**344 
! ")-Ev!NGI$GKGMNr   c                     |d   }	 |j                  t        | j                         d                |D ]  \  }}|j	                  ||        |j                  |       |j                          y# t        $ r Y yw xY w)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:
 ! 2""6512'"   	s   +A0 0	A<;A<c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)	WebSocketz
    This wrapper class provides a tornado WebSocket interface that is
    somewhat compatible with eventlet's implementation.
    c                      || _         d | _        y r'   )rw   r   )r   rw   servers      r   r   zWebSocket.__init__   s    #r   c                 d   K   |d   | _         || _        | j                  |        d {    y 7 w)Nrd   )r   rz   rw   )r   rz   s     r   __call__zWebSocket.__call__   s-     &'89ll4   s   &0.0c                 @   K   | j                   j                          y wr'   )r   closer8   s    r   r   zWebSocket.close   s     ""$s   c                    K   	 | j                   j                  |t        |t                     y # t        j
                  j                  $ r t        j                         w xY ww)N)binary)	r   write_messager   bytesrH   r   WebSocketClosedErrorr   EngineIOErrorr4   s     r   sendzWebSocket.send   sY     	-  ..
7E : / <  55 	-**,,	-s   A%+0 A%2A""A%c                    K   | j                   j                          d {   }t        |t              st        |t              s
t               |S 7 0wr'   )r   r9   r   r   r   OSError)r   msgs     r   waitzWebSocket.wait   sB     ((99;;#u%sC()O
	 <s   AA1AN)	rC   rD   rE   __doc__r   r   r   r   r   rA   r   r   r   r      s     $!
%-r   r   T)r   r   r   r   )r   rp   urllib.parser   r   r   tornado.webrH   tornado.websocketrJ   r   r   r   _asyncrA   r   r   <module>r      sH     
 !   2j>B" B *"	
r   