
    wg                         d dl Z d dlmZ 	 d dlmZ 	 d dlmZ d Z	d Z
d Z G d d	      Zd
e	e
eeredZyddZy# e$ r	 d dlmZ Y 0w xY w# e$ r dZdZY ?w xY w)    N)urlsplit)HTTPResponse)WebSocketProtocolc                     | j                  |j                  |g d       	 | j                          y# t        $ r Y yw xY w)zThis function sets up the engine.io endpoint as a route for the
    application.

    Note that both GET and POST requests must be hooked up on the engine.io
    endpoint.
    )GETPOSTOPTIONS)methodsN)	add_routehandle_requestenable_websocketAttributeError)appengineio_serverengineio_endpoints      a/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/engineio/async_drivers/sanic.pycreate_router      sF     MM/002C4  6 s   3 	??c                 ~    G d d      }t        | j                        }i d || j                        dt        j                  ddddd	d
dd
dd
ddd| j
                  d|j                  xs dd| j                  dd| j                  z   ddddddddd| }| j                  j                         D ]S  \  }}|j                         }|dk(  r||d<   !|dk(  r||d<   ,d |j                  d!d"      z  }||v r
||    d#| }|||<   U |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 N    payload)selfr   s     r   __init__z4translate_request.<locals>.AwaitablePayload.__init__$   s    ">cDLr   Nc                    K   || j                   }d| _         |S | j                   d | }| j                   |d  | _         |S wr   r   )r   lengthrs      r   readz0translate_request.<locals>.AwaitablePayload.read'   sK     ~LL" H LL&)#||FG4Hs   =?N)__name__
__module____qualname__r   r!    r   r   AwaitablePayloadr   #   s    	*	r   r'   z
wsgi.inputzwsgi.errorszwsgi.version)   r   z
wsgi.asyncTzwsgi.multithreadFzwsgi.multiprocesszwsgi.run_onceSERVER_SOFTWAREsanicREQUEST_METHODQUERY_STRING RAW_URISERVER_PROTOCOLzHTTP/REMOTE_ADDRz	127.0.0.1REMOTE_PORT0SERVER_NAMESERVER_PORTsanic.requestzCONTENT-TYPECONTENT_TYPEzCONTENT-LENGTHCONTENT_LENGTHzHTTP_%s-_,HTTP_X_FORWARDED_PROTOhttpzwsgi.url_scheme	PATH_INFOSCRIPT_NAME)r   urlbodysysstderrmethodqueryversionheadersitemsupperreplacegetpath)requestr'   	uri_partsenvironhdr_name	hdr_valuekey	path_infos           r   translate_requestrS      s     %I&w||4szz 	 	d	
 	E 	U 	 	7 	'.. 		-2 	7;; 	7W__4 	{ 	s 	w  	s!" 	#G(  '446 !)>>#~%&/GN#))(1G$%(**344'>"3<.)5I ! ")-Ev!NGI$GKGMNr   c                     i }d}|D ])  }|d   j                         dk(  r|d   }|d   ||d   <   + t        ||t        | j                         d         |      S )zTThis function generates an appropriate response object for this async
    mode.
    Nr   zcontent-typer(   )r@   content_typestatusrF   )lowerr   intsplit)rV   rF   r   rN   headers_dictrU   hs          r   make_responser\   ^   st     LL &Q4::<>)Q4L!"1L1	&
 W<"6<<>!#45|M Mr   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)	WebSocketz
    This wrapper class provides a sanic WebSocket interface that is
    somewhat compatible with eventlet's implementation.
    c                 .    || _         || _        d | _        y r"   )handlerserver_sock)r   r`   ra   s      r   r   zWebSocket.__init__r   s    
r   c                    K   |d   }|j                   j                         }|j                  |       d {   | _        || _        | j                  |        d {    | j                  j                         S 7 C7  w)Nr5   )	transportget_protocolwebsocket_handshakerb   rN   r`   ra   _ok)r   rN   rL   protocols       r   __call__zWebSocket.__call__w   so     /*$$113#77@@
ll4   {{  	 A 	!s!   4A>A:$A>A<A><A>c                 T   K   | j                   j                          d {    y 7 wr"   )rb   close)r   s    r   rk   zWebSocket.close   s     jj   s   (&(c                 V   K   | j                   j                  |       d {    y 7 wr"   )rb   send)r   messages     r   rm   zWebSocket.send   s     jjoog&&&s   )')c                    K   | j                   j                          d {   }t        |t              st        |t              s
t               |S 7 0wr"   )rb   recv
isinstancebytesstrOSError)r   datas     r   waitzWebSocket.wait   s>     ZZ__&&$&tS))O	 's   AA1AN)	r#   r$   r%   __doc__r   ri   rk   rm   rv   r&   r   r   r^   r^   m   s     
!!'r   r^   T)asyncior   rS   r\   	websocket)rA   urllib.parser   sanic.responser   )sanic.server.protocols.websocket_protocolr   ImportErrorsanic.websocketr   rS   r\   r^   _asyncr&   r   r   <module>r      s    
 !+6O <~M D  *"/

 6:
M  656 Ls,   A < A
A 	A

A 	AA