
    iw,                     j    S SK r S SKrS SKrS SKJr   " S S5      rS rS r " S S5      rS	\\\S
.r	g)    N)get_static_filec                   F    \ rS rSrSr   SS jrS rS rS rS r	S	 r
S
rg)ASGIApp   a  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)
Nc                 L   Xl         X l        X@l        U R                  bi  U R                  R                  S5      (       d  SU R                  -   U l        U R                  R	                  S5      (       d  U =R                  S-  sl        U=(       d    0 U l        XPl        X`l        g N/)engineio_serverother_asgi_appengineio_path
startswithendswithstatic_files
on_startupon_shutdown)selfr
   r   r   r   r   r   s          X/home/admin/cozy_coffee/venv/lib/python3.13/site-packages/engineio/async_drivers/asgi.py__init__ASGIApp.__init__.   s      /,*)%%0055%(4+=+=%="%%..s33""c)"(.B$&    c                   #    US   S:X  a  U R                  XU5      I S h  vN   g US   S;   ad  U R                  b2  U R                  US   5      R                  U R                  5      (       a%  U R                  R                  XU5      I S h  vN   g US   S:X  a*  U R                  (       a  [        US   U R                  5      OS nU(       aB  [        R                  R                  US   5      (       a  U R                  XBU5      I S h  vN   g U R                  b  U R                  XU5      I S h  vN   g U R                  X#5      I S h  vN   g  GN3 N NL N& N7f)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__ASGIApp.__call__=   s4    =J&--5556]33""*..uV}=HH&&( (&&55edKKK =F*t/@/@ *%-9J9JKFJ rww~~k*.EFF,,[4HHH$$0))%$???nnW333 6
 L
 I?3sY   EEA,EEA=EE'E4E5EEEEEEEc                 4  #    U" 5       I S h  vN nUS   S:X  ae  [        US   S5       nUR                  5       nS S S 5        U" SSSUS   R                  S	5      4/S
.5      I S h  vN   U" SWS.5      I S h  vN   g g  Ns! , (       d  f       NN= f N, N7f)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"   ASGIApp.serve_static_fileO   s     i=N*k*-t4&&( 5 5"%%4k*7,,2F7O%= $>? @ @ @  4 ') * * * +  44@*sC   BBBB,B'B(B:B;B
BBBc                 (  #    U R                   b5  U R                  c(  U R                  c  U R                  XU5      I S h  vN   g  U" 5       I S h  vN nUS   S:X  as  U R                  (       aO   [        R                  " U R                  5      (       a  U R                  5       I S h  vN   OU R                  5         U" SS05      I S h  vN   O|US   S:X  as  U R                  (       aO   [        R                  " U R                  5      (       a  U R                  5       I S h  vN   OU R                  5         U" SS05      I S h  vN   g GM
   GN GN N!   U" SS05      I S h  vN     g = f N NO!   U" SS05      I S h  vN     g = f NH7f)Nr   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&   r;   s        r   r   ASGIApp.lifespan\   sq    *t/F  (%%ed;;;!)OEV} 22??&::4??KK #oo///!%!2 F$?@AAAv"55##&::4;K;KLL #..000!%!1!1!3 F$@ABBB-  < $ 0"F,E#FGGGA 1"F,F#GHHHBs   =FE FEF08E (E)E -F.E >FE2F,8E6 $E4%E6 )F*E6 :FF	FFE E/'E*(E/-F4E6 6FFFFc                 d   #    U" SSS/S.5      I Sh  vN   U" SSS.5      I Sh  vN   g N N7f)	z+Return a 404 Not Found error to the client.r-   i  )r/   s
   text/plainr2   Nr5   s	   Not Foundr6    )r   r%   r&   s      r   r#   ASGIApp.not_found{   sV     1! @AC D 	D 	D 0(* + 	+ 	+	D	+s   0,0.00c                 <    UR                  S5      (       d  US-  nU$ r   )r   )r   r   s     r   r   ASGIApp._ensure_trailing_slash   s    }}S!!CKDr   )r   r
   r   r   r   r   )NNz	engine.ioNN)__name__
__module____qualname____firstlineno____doc__r   r(   r"   r   r#   r   __static_attributes__rD   r   r   r   r      s1    $J 8<2=.2'4$*>+r   r   c                   #     " S S5      nU" 5       I S h  vN nSnUS   S:X  a  XTR                  S5      =(       d    S-  nUR                  S5      (       aL  U" 5       I S h  vN nUS   S:X  a  XTR                  S5      =(       d    S-  nUR                  S5      (       a  ML  OUS   S:X  a  O0 $ U S	   nS
nSU ;   a'  U S   (       a   U S   R                  S5      nUSU-   -  n0 SU" U5      _S[        R                  _SS_SS_SS_SS_SS_SS_SU R                  SS5      _SU S	   _SU_SU_S S
_S!S"_S#S$_S%S&_S'S_S&UUU S(.EnU S)    Hu  u  p U	R                  5       R                  S5      n	U
R                  S5      n
U	S*:X  a  XS+'   MB  U	S,:X  a  XS-'   MN  S.U	R                  S/S05      -  nX;   a	  X    S1U
 3n
XU'   Mw     UR                  S2S35      US4'   U$  GN GN~! [         a     GNf = f! [         a     M  f = f7f)5Nc                   $    \ rS rSrS rSS jrSrg)+translate_request.<locals>.AwaitablePayload   c                 $    U=(       d    SU l         g Nr   r=   )r   r=   s     r   r   4translate_request.<locals>.AwaitablePayload.__init__   s    ">cDLr   Nc                    #    Uc  U R                   nSU l         U$ U R                   S U nU R                   US  U l         U$ 7frS   rT   )r   lengthrs      r   r9   0translate_request.<locals>.AwaitablePayload.read   sJ     ~LL" H LL&)#||FG4Hs   >A rT   N)rH   rI   rJ   rK   r   r9   rM   rD   r   r   AwaitablePayloadrP      s    	*	r   r[   r   r   r+   r7   	more_bodyzwebsocket.connectr    query_stringr1   ?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.scoper4   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&   r[   r;   r=   raw_urir^   environhdr_name	hdr_valuekeys               r   translate_requestr      s      )OEGV}&99V$++ii$$!)OEV}.99V,33 ii$$ 
v-	-	FmGL5#8	* 077@L s\))G&w/szz 	 	d	
 	E 	U 	 	6 	%))He4 	U6] 	 	7 	r 	: 	{  	s!" 	v#$ +G0  %Y/	~~'..w7H!((1I ~%&/N#))(1$%(**344>"<.)5I %  0( ")-Ev!NGNG 
 $ " 		@ " 		sr   HGAH#G!$?H%$H
G$ A5H0G5AH!H$
G2.H1G22H5
H?HHHc                 d  #    U Vs/ s H*  oDS   R                  S5      US   R                  S5      4PM,     nnUS   S   S:X  a  U R                  S5      (       a  US   " S	US
.5      I S h  vN   g U(       aH  [        U[        5      (       a  UR	                  S5      O
[        U5      nUS   " SUS.5      I S h  vN   g US   " SS05      I S h  vN   g US   " S[        U R                  S5      S   5      US.5      I S h  vN   US   " SUS.5      I S h  vN   g s  snf  N Nk NW N& N7f)Nr   r1   r`   rr   r   r   z200 rq   websocket.accept)r   r4   websocket.close)r   reasonr-    r2   r5   r6   )r:   r   
isinstancebytesrz   strintsplit)r3   r4   r=   r   hr   s         r   make_responser      sm    ELMW!G$adkk'&:;WGM|V$3V$$+&0B3:(< = = = 	 !'511 !07:7| k*4E6<,> ? ? ? 	 k*F4E+FGGG
+
(=*-fll3.?.B*C+2 4 5 5 5 +
(<(/ 1 2 2 2% N=? H52sd   D01D!5D0-D&.AD0<D(=D0D*2D0D,D0D.D0(D0*D0,D0.D0c                   6    \ rS rSrSrS rS rS rS rS r	Sr
g	)
	WebSocket   zu
This wrapper class provides an asgi WebSocket interface that is
somewhat compatible with eventlet's implementation.
c                 ,    Xl         S U l        S U l        g rZ   )handlerasgi_receive	asgi_send)r   r   servers      r   r   WebSocket.__init__   s     r   c                    #    US   U l         US   U l        U R                  SS05      I S h  vN   U R                  U 5      I S h  vN   g N N7f)Nrp   rq   r   r   r]   r   r   r   )r   r   s     r   r(   WebSocket.__call__   sS     #N3 -nnf&89:::ll4    	; s!   +AAAAAAc                 h   #     U R                  SS05      I S h  vN   g  N! [         a     g f = f7f)Nr   r   )r   	Exception)r   s    r   closeWebSocket.close  s3     	..&*;!<=== 		s(   2"  " 2" 
/2/2c                    #    S nS n[        U[        5      (       a  UnOUnU R                  SUUS.5      I S h  vN   g  N7f)Nzwebsocket.send)r   r   text)r   r   r   )r   message	msg_bytesmsg_texts       r   r&   WebSocket.send  sJ     	gu%%IHnn&6'0&.0 1 	1 	1s   7A?Ac                    #    U R                  5       I S h  vN nUS   S:w  a
  [        5       eUR                  SS 5      b  US   $ UR                  SS 5      b  US   $ [        5       e NQ7f)Nr   zwebsocket.receiver   r   )r   OSErrorry   )r   r;   s     r   waitWebSocket.wait  sl     ''))=//)O99Wd#/>!YYvt$0= )O *s   A*A(AA*r   N)rH   rI   rJ   rK   rL   r   r(   r   r&   r   rM   rD   r   r   r   r      s     
	1	r   r   T)asyncior   r   r   )
r@   r    r|   engineio.static_filesr   r   r   r   r   _asyncrD   r   r   <module>r      sJ     	 
 1~ ~BQh2., ,` *"	
r   