
    wg+                     j    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	y)    N)get_static_filec                   <    e Zd ZdZ	 	 	 d	dZd Zd Zd Zd Zd Z	y)
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)
    Nc                 6   || _         || _        || _        | j                  _| j                  j                  d      sd| j                  z   | _        | j                  j	                  d      s| xj                  dz  c_        |xs i | _        || _        || _        y N/)engineio_serverother_asgi_appengineio_path
startswithendswithstatic_files
on_startupon_shutdown)selfr	   r
   r   r   r   r   s          `/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/engineio/async_drivers/asgi.py__init__zASGIApp.__init__.   s      /,*)%%005%(4+=+=%="%%..s3""c)"(.B$&    c                   K   |d   dk(  r| j                  |||       d {    y |d   dv r_| j                  -| j                  |d         j                  | j                        r&| j                  j                  |||       d {    y |d   dk(  r%| j                  rt        |d   | j                        nd }|r>t        j                  j                  |d         r| j                  |||       d {    y | j                  | j                  |||       d {    y | j                  ||       d {    y 7 7 7 M7 '7 w)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6]33""*..uV}=HH&&(&&55eWdKKK =F*t/@/@ *%-9J9JKFJ rww~~k*.EF,,['4HHH$$0))%$???nnWd333 6
 L
 I?3sY   E
D?A%E
EA.E
6E7'E
EE
9E:E
E
E
E
E
c                 (  K    |        d {   }|d   dk(  ret        |d   d      5 }|j                         }d d d         |ddd|d   j                  d	      fgd
       d {     |dd       d {    y y 7 r# 1 sw Y   IxY w7 '7 w)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   s     i=N*k*-t4 #&&(# 5"%%4k*7,,2F7O%= $>? @ @ @  4 ') * * * +  # #@*sC   BB BB,B&B'B9B:BBBBc                   K   | j                   4| j                  (| j                  | j                  |||       d {    y 	  |        d {   }|d   dk(  rg| j                  rH	 t        j                  | j                        r| j                          d {   n| j                           |ddi       d {    no|d   dk(  rg| j                  rH	 t        j                  | j                        r| j                          d {   n| j                           |ddi       d {    y 7 7 7 #   |ddi       d {  7   Y y xY w7 7 J#   |ddi       d {  7   Y y xY w7 Dw)Nr   zlifespan.startupzlifespan.startup.failedzlifespan.startup.completezlifespan.shutdownzlifespan.shutdown.failedzlifespan.shutdown.complete)r
   r   r   asyncioiscoroutinefunction)r   r"   r#   r$   r8   s        r   r   zASGIApp.lifespan\   ss    *t/F  (%%eWd;;;!)OEV} 22??&::4??K #oo///!%!2 F$?@AAAv"55##&::4;K;K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   ;E2D2E2D4E2(2D8 D6D8 /E2<E=E22E 	E
E E2+E0,E24E26D8 8EE
EE2E E-%E(&E-+E2c                 d   K    |dddgd       d{     |ddd       d{    y7 7 w)	z+Return a 404 Not Found error to the client.r*   i  )r,   s
   text/plainr/   Nr2   s	   Not Foundr3    )r   r#   r$   s      r   r!   zASGIApp.not_found{   sX     1! @AC D 	D 	D 0(* + 	+ 	+	D	+s   0,0.00c                 2    |j                  d      s|dz  }|S r   )r   )r   r   s     r   r   zASGIApp._ensure_trailing_slash   s    }}S!CKDr   )NNz	engine.ioNN)
__name__
__module____qualname____doc__r   r&   r    r   r!   r   r?   r   r   r   r      s1    $J 8<2=.2'4$*>+r   r   c                   K    G d d      } |        d {   }d}|d   dk(  rk||j                  d      xs dz  }|j                  d      rM |        d {   }|d   dk(  r||j                  d      xs dz  }|j                  d      rAn|d   dk(  rni S | d	   }d
}d| v r"| d   r	 | d   j                  d      }|d|z   z  }i d ||      dt        j                  ddddddddddddd| j                  dd      d| d	   d|d|d d
d!d"d#d$d%d&d'dd&||| d(}| d)   D ]t  \  }	}
	 |	j                         j                  d      }	|
j                  d      }
|	d*k(  r|
|d+<   B|	d,k(  r|
|d-<   Md.|	j                  d/d0      z  }||v r
||    d1|
 }
|
||<   v |j                  d2d3      |d4<   |S 7 7 i# t        $ r Y w xY w# t        $ r Y w xY ww)5Nc                       e Zd Zd ZddZy)+translate_request.<locals>.AwaitablePayloadc                     |xs d| _         y Nr   r:   )r   r:   s     r   r   z4translate_request.<locals>.AwaitablePayload.__init__   s    ">cDLr   Nc                    K   || j                   }d| _         |S | j                   d | }| j                   |d  | _         |S wrI   rJ   )r   lengthrs      r   r6   z0translate_request.<locals>.AwaitablePayload.read   sK     ~LL" H LL&)#||FG4Hs   =?N)rA   rB   rC   r   r6   r?   r   r   AwaitablePayloadrG      s    	*	r   rO   r   r   r(   r4   	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.scoper1   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$   rO   r8   r:   raw_urirR   environhdr_name	hdr_valuekeys               r   translate_requestry      s      )OEGV}&599V$++ii$!)OEV}.599V,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 ~%&/GN#))(1G$%(**344'>"3<.)5I %!( ")-Ev!NGNG 
 $ " 		@ " 		sr   G$F?AG$G5G$G$-G A6G$80G(AG$G$	GG$GG$	G!G$ G!!G$c                 @  K   |D cg c]*  }|d   j                  d      |d   j                  d      f, }}|d   d   dk(  r| j                  d      r |d   d	|d
       d {    y |rCt        |t              r|j	                  d      n
t        |      } |d   d|d       d {    y  |d   ddi       d {    y  |d   dt        | j                  d      d         |d       d {     |d   d|d       d {    y c c}w 7 7 k7 W7 &7 w)Nr   r.   rT   rf   r   r   z200 re   websocket.accept)r   r1   websocket.close)r   reasonr*    r/   r2   r3   )r7   r   
isinstancebytesrn   strintsplit)r0   r1   r:   ru   hr}   s         r   make_responser      sw    ELM!G$adkk'&:;MGM|V$3V$&'+&0B3:(< = = = 	 !'51 !07:7| *gk*4E6<,> ? ? ? 	 +gk*F4E+FGGG
'+
(=*-fll3.?.B*C+2 4 5 5 5 '+
(<(/ 1 2 2 2% N=? H52sd   D/D/D%D&AD*D+D D2D3D4D	D
DDDDDc                   .    e Zd ZdZd Zd Zd Zd Zd Zy)	WebSocketz
    This wrapper class provides an asgi WebSocket interface that is
    somewhat compatible with eventlet's implementation.
    c                 .    || _         d | _        d | _        y rN   )handlerasgi_receive	asgi_send)r   r   servers      r   r   zWebSocket.__init__   s     r   c                    K   |d   | _         |d   | _        | j                  ddi       d {    | j                  |        d {    y7 7 w)Nrd   re   r   r{   rQ   )r   r   r   )r   ru   s     r   r&   zWebSocket.__call__   sU     #N3 -nnf&89:::ll4    	; s!   +AAAAAAc                 f   K   	 | j                  ddi       d {    y 7 # t        $ r Y y w xY ww)Nr   r|   )r   	Exception)r   s    r   closezWebSocket.close  s4     	..&*;!<=== 		s(   1"  " 1" 	.1.1c                 |   K   d }d }t        |t              r|}n|}| j                  d||d       d {    y 7 w)Nzwebsocket.send)r   r   text)r   r   r   )r   message	msg_bytesmsg_texts       r   r$   zWebSocket.send  sH     	gu%IHnn&6'0&.0 1 	1 	1s   2<:<c                    K   | j                          d {   }|d   dk7  r
t               |j                  d      xs |j                  d      S 7 :w)Nr   zwebsocket.receiver   r   )r   OSErrorrm   )r   r8   s     r   waitzWebSocket.wait  sM     ''))=//)Oyy!6UYYv%66 *s   AA;AN)	rA   rB   rC   rD   r   r&   r   r$   r   r?   r   r   r   r      s     
	17r   r   T)r<   ry   r   r   )
r   rp   r<   engineio.static_filesr   r   ry   r   r   _asyncr?   r   r   <module>r      sJ    	 
  1~ ~BQh2.'7 '7V *"	
r   