
    iw,                     x    d dl Z d dlZd dlZd dlmZ  G d d          Zd Zd Z G d d          Zd	eeed
Z	dS )    N)get_static_filec                   >    e Zd ZdZ	 	 	 d
dZd Zd Zd Zd Zd	 Z	dS )ASGIAppa  ASGI application middleware for Engine.IO.

    This middleware dispatches traffic to an Engine.IO application. It can
    also serve a list of static files to the client, or forward unrelated
    HTTP traffic to another ASGI application.

    :param engineio_server: The Engine.IO server. Must be an instance of the
                            ``engineio.AsyncServer`` class.
    :param static_files: A dictionary with static file mapping rules. See the
                         documentation for details on this argument.
    :param other_asgi_app: A separate ASGI app that receives all other traffic.
    :param engineio_path: The endpoint where the Engine.IO application should
                          be installed. The default value is appropriate for
                          most cases. With a value of ``None``, all incoming
                          traffic is directed to the Engine.IO server, with the
                          assumption that routing, if necessary, is handled by
                          a different layer. When this option is set to
                          ``None``, ``static_files`` and ``other_asgi_app`` are
                          ignored.
    :param on_startup: function to be called on application startup; can be
                       coroutine
    :param on_shutdown: function to be called on application shutdown; can be
                        coroutine

    Example usage::

        import engineio
        import uvicorn

        eio = engineio.AsyncServer()
        app = engineio.ASGIApp(eio, static_files={
            '/': {'content_type': 'text/html', 'filename': 'index.html'},
            '/index.html': {'content_type': 'text/html',
                            'filename': 'index.html'},
        })
        uvicorn.run(app, '127.0.0.1', 5000)
    N	engine.ioc                    || _         || _        || _        | j        S| j                            d          sd| j        z   | _        | j                            d          s| xj        dz  c_        |pi | _        || _        || _        d S N/)engineio_serverother_asgi_appengineio_path
startswithendswithstatic_files
on_startupon_shutdown)selfr
   r   r   r   r   r   s          F/usr/local/lib/python3.11/dist-packages/engineio/async_drivers/asgi.py__init__zASGIApp.__init__.   s      /,*)%0055 >%(4+=%="%..s33 *""c)""(.B$&    c                   K   |d         dk    r|                      |||           d {V  d S |d         dv r^| j        3|                     |d                                       | j                  r$| j                            |||           d {V  d S |d         dk    r"| j        rt          |d         | j                  nd }|rDt          j	        
                    |d                   r|                     |||           d {V  d S | j        |                     |||           d {V  d S |                     ||           d {V  d S )Ntypelifespan)http	websocketpathr   filename)r   r   _ensure_trailing_slashr   r
   handle_requestr   r   osr   existsserve_static_filer   	not_found)r   scopereceivesendstatic_files        r   __call__zASGIApp.__call__=   s     =J&&--w555555555556]333"*..uV}==HH&( ( + &55eWdKKKKKKKKKKK =F**t/@* *%-9JKKKFJ  4rw~~k*.EFF 4,,['4HHHHHHHHHHH$0))%$???????????nnWd33333333333r   c                 T  K    |             d {V }|d         dk    rt          |d         d          5 }|                                }d d d            n# 1 swxY w Y    |ddd|d                             d	          fgd
           d {V   |d|d           d {V  d S d S )Nr   http.requestr   rbhttp.response.start      Content-Typecontent_typeutf-8r   statusheadershttp.response.bodyr   body)openreadencode)r   r&   r$   r%   eventfpayloads          r   r!   zASGIApp.serve_static_fileO   sc     gii=N**k*-t44 #&&((# # # # # # # # # # # # # # #$ 5"%%4k*7,,2F7OO%= $>? ? @ @ @ @ @ @ @ @ @ $ 4 ') ) * * * * * * * * * * * +*s   AAAc                   K   | j         -| j        &| j        |                      |||           d {V  d S 	  |             d {V }|d         dk    r| j        rd	 t          j        | j                  r|                                  d {V n|                                  n#   |ddi           d {V  Y d S xY w |ddi           d {V  n|d         dk    r| j        rd	 t          j        | j                  r|                                  d {V n|                                  n#   |ddi           d {V  Y d S xY w |ddi           d {V  d S ))	NTr   zlifespan.startupzlifespan.startup.failedzlifespan.startup.completezlifespan.shutdownzlifespan.shutdown.failedzlifespan.shutdown.complete)r   r   r   inspectiscoroutinefunction)r   r#   r$   r%   r9   s        r   r   zASGIApp.lifespan\   s     *t/F (%%eWd;;;;;;;;;F	!'))OOOOOOEV} 222? &:4?KK3doo/////////!%!2!2"dF,E#FGGGGGGGGGdF$?@AAAAAAAAAAv"555# &:4;KLL4d..000000000!%!1!1!3!3"dF,F#GHHHHHHHHHdF$@ABBBBBBBBB-	s   AB$ $B<'AD/ /Ec                 ^   K    |dddgd           d{V   |ddd           d{V  dS )	z+Return a 404 Not Found error to the client.r+   i  )r-   s
   text/plainr0   Nr3   s	   Not Foundr4    )r   r$   r%   s      r   r"   zASGIApp.not_found{   s      d1! @AC C D D 	D 	D 	D 	D 	D 	D 	D d0(* * + + 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+r   c                 :    |                     d          s|dz  }|S r   )r   )r   r   s     r   r   zASGIApp._ensure_trailing_slash   s$    }}S!! 	CKDr   )NNr   NN)
__name__
__module____qualname____doc__r   r'   r!   r   r"   r   r@   r   r   r   r      s        $ $J 8<2=.2' ' ' '4 4 4$* * *  >+ + +    r   r   c                 T  K    G d d          } |             d {V }d}|d         dk    r{||                     d          pdz  }|                     d          rK |             d {V }|d         dk    r||                     d          pdz  }|                     d          Kn|d         dk    rni S | d	         }d
}d| v r=| d         r5	 | d                             d          }|d|z   z  }n# t          $ r Y nw xY wi d ||          dt          j        ddddddddddddd|                      dd          d| d	         d|d|d d
d!d"d#d$d%d&d'dd&||| d(}| d)         D ]\  }	}
	 |	                                                    d          }	|
                    d          }
n# t          $ r Y Ow xY w|	d*k    r|
|d+<   _|	d,k    r|
|d-<   kd.|	                    d/d0          z  }||v r||          d1|
 }
|
||<   |                     d2d3          |d4<   |S )5Nc                       e Zd Zd ZddZdS )+translate_request.<locals>.AwaitablePayloadc                     |pd| _         d S Nr   r;   )r   r;   s     r   r   z4translate_request.<locals>.AwaitablePayload.__init__   s    ">cDLLLr   Nc                 r   K   || j         }d| _         n#| j         d |         }| j         |d          | _         |S rJ   rK   )r   lengthrs      r   r7   z0translate_request.<locals>.AwaitablePayload.read   sB      ~L"L&)#|FGG4Hr   N)rB   rC   rD   r   r7   r@   r   r   AwaitablePayloadrH      s7        	* 	* 	*	 	 	 	 	 	r   rP   r   r   r)   r5   	more_bodyzwebsocket.connectr    query_stringr/   ?z
wsgi.inputzwsgi.errorszwsgi.version)   r   z
wsgi.asyncTzwsgi.multithreadFzwsgi.multiprocesszwsgi.run_onceSERVER_SOFTWAREasgiREQUEST_METHODmethodGET	PATH_INFOQUERY_STRINGRAW_URISCRIPT_NAMESERVER_PROTOCOLzHTTP/1.1REMOTE_ADDRz	127.0.0.1REMOTE_PORT0SERVER_NAME)SERVER_PORTasgi.receive	asgi.send
asgi.scoper2   zCONTENT-TYPECONTENT_TYPEzCONTENT-LENGTHCONTENT_LENGTHzHTTP_%s-_,HTTP_X_FORWARDED_PROTOr   zwsgi.url_scheme)getdecodeUnicodeDecodeErrorsysstderrupperreplace)r#   r$   r%   rP   r9   r;   raw_urirS   environhdr_name	hdr_valuekeys               r   translate_requestrz      s             '))OOOOOOEGV}&&599V$$++ii$$ 	4!'))OOOOOOEV}..599V,,33 ii$$ 	4 
v-	-	-	FmGL5#8	* 077@@L s\))GG " 	 	 	D	&&w//sz 	 	d	
 	E 	U 	 	6 	%))He44 	U6] 	 	7 	r 	: 	{  	s!" 	v#$ +  G0  %Y/ ! !)	~~''..w77H!((11II! 	 	 	H	 ~%%&/GN#)))(1G$%(**3444'>>"3<55)55I !(-Ev!N!NGNs$   C3 3
D ?D :<F77
GGc                 >  K   d |D             }|d         d         dk    r|                      d          r |d         d|d           d {V  no|rTt          |t                    r|                    d	          nt	          |          } |d         d
|d           d {V  n |d         dd
i           d {V  d S  |d         dt          |                     d          d                   |d           d {V   |d         d|d           d {V  d S )Nc                 z    g | ]8}|d                               d          |d                              d          f9S )r   r/   rU   )r8   ).0hs     r   
<listcomp>z!make_response.<locals>.<listcomp>   s=    MMM!G$$adkk'&:&:;MMMr   rg   r   r   z200 rf   websocket.accept)r   r2   r/   websocket.close)r   reasonr+    r   r0   r3   r4   )r   
isinstancebytesro   strintsplit)r1   r2   r;   rv   r   s        r   make_responser      s     MMWMMMG|V$33V$$ 
	H&'+&0B3:(< (< = = = = = = = = = =  H!'511D0007:7|| *gk*4E6<,> ,> ? ? ? ? ? ? ? ? ? ? +gk*F4E+FGGGGGGGGG
'+
(=*-fll3.?.?.B*C*C+2 4  4 5 5 5 5 5 5 5 5 5 '+
(<(/ 1  1 2 2 2 2 2 2 2 2 2 2 2r   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 an asgi WebSocket interface that is
    somewhat compatible with eventlet's implementation.
    c                 0    || _         d | _        d | _        d S rO   )handlerasgi_receive	asgi_send)r   r   servers      r   r   zWebSocket.__init__   s     r   c                    K   |d         | _         |d         | _        |                     ddi           d {V  |                     |            d {V  dS )Nre   rf   r   r   rR   )r   r   r   )r   rv   s     r   r'   zWebSocket.__call__   sr      #N3 -nnf&89:::::::::ll4         rr   c                 h   K   	 |                      ddi           d {V  d S # t          $ r Y d S w xY w)Nr   r   )r   	Exception)r   s    r   closezWebSocket.close  s]      	..&*;!<=========== 	 	 	DD	s   # 
11c                    K   d }d }t          |t                    r|}n|}|                     d||d           d {V  d S )Nzwebsocket.send)r   r   text)r   r   r   )r   message	msg_bytesmsg_texts       r   r%   zWebSocket.send  s      	gu%% 	IIHnn&6'0&.0 0 1 1 	1 	1 	1 	1 	1 	1 	1 	1 	1r   c                   K   |                                   d {V }|d         dk    rt                      |                    dd           |d         S |                    dd           |d         S t                      )Nr   zwebsocket.receiver   r   )r   OSErrorrn   )r   r9   s     r   waitzWebSocket.wait  s      ''))))))))=///))O99Wd##/>!YYvt$$0= ))Or   N)	rB   rC   rD   rE   r   r'   r   r%   r   r@   r   r   r   r      si           
    	1 	1 	1	 	 	 	 	r   r   T)asynciorz   r   r   )
r=   r   rq   engineio.static_filesr   r   rz   r   r   _asyncr@   r   r   <module>r      s     				 



 1 1 1 1 1 1~ ~ ~ ~ ~ ~ ~ ~BQ Q Qh2 2 2., , , , , , , ,` *"	
 
r   