
    wg)                     v    d dl Z d dlZd dlZddlmZ ddlmZ ddlmZ ddlmZ  G d dej                        Z	y)	    N   )base_socket)
exceptions)packet)payloadc                   P    e Zd Zd Zd Zd Zd Zd Zd ZddZ	d	 Z
d
 Zd Zd Zy)AsyncSocketc                   K   	 t        j                  | j                  j                         | j                  j
                  | j                  j                  z          d{   g}| j                  j                          |dgk(  rg S 	 	 | j                  j                         }| j                  j                          || j                  j                  d       	 |S |j                  |       g7 # t         j                  t         j                  f$ r t        j                         w xY w# t         j                  $ r Y |S w xY ww)z'Wait for packets to send to the client.N)asynciowait_forqueuegetserverping_intervalping_timeout	task_doneTimeoutErrorCancelledErrorr   
QueueEmpty
get_nowait
put_nowaitappend)selfpacketspkts      Z/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/engineio/async_socket.pypollzAsyncSocket.poll   s'    	*$--

 ))DKK,D,DDF F GG JJ  " tfIjj++-

$$&;JJ))$/  s# F $$g&<&<= 	*''))	* %% s`   EAC2  C0!C2  	E
AD- ED- /E0C2 28D**E-E EEEc           	        K   | j                   j                  j                  d| j                  t        j
                  |j                     t        |j                  t              s|j                  nd       |j                  t        j                  k(  r| j                          y|j                  t        j                  k(  rP| j                   j                  d| j                  |j                  | j                   j                         d{    y|j                  t        j                  k(  r;| j!                  t	        j"                  t        j$                               d{    y|j                  t        j&                  k(  r;| j)                  dd| j                   j*                  j,                         d{    yt/        j0                         7 7 s7 w)	zReceive packet from the client.z%s: Received packet %s data %s<binary>message	run_asyncNFTwaitabortreason)r   loggerinfosidr   packet_namespacket_type
isinstancedatabytesPONGschedule_pingMESSAGE_trigger_eventasync_handlersUPGRADEsendPacketNOOPCLOSEcloser&   CLIENT_DISCONNECTr   UnknownPacketErrorr   r   s     r   receivezAsyncSocket.receive#   sT     @ $&*=*=coo*N0:388U0K%/	1 ??fkk) __.++,,488SXX++44 - 6 6 6 __.))FMM&++6777__,**%t$(KK$6$6$H$H  J J J //116 8Js8   D	GGAG#G$AG;G<GGGc                   K   | j                   rt        j                         | j                  rt	        j                         | j                  z
  | j
                  j                  kD  rk| j
                  j                  j                  d| j                         | j                  dd| j
                  j                  j                         d{    yy7 w)z,Make sure the client is still sending pings.z"%s: Client is gone, closing socketFr#   NT)closedr   SocketIsClosedError	last_pingtimer   r   r'   r(   r)   r9   r&   PING_TIMEOUTr   s    r   check_ping_timeoutzAsyncSocket.check_ping_timeout7   s     ;;0022>>		dnn,t{{/G/GGKK##$H$(HH.
 **%u$(KK$6$6$C$C  E E EEs   C
CCCc           	      |  K   | j                          d{   sy| j                  j                  |       d{    | j                  j                  j                  d| j                  t        j                  |j                     t        |j                  t              s|j                         yd       y7 7 w)zSend a packet to the client.Nz%s: Sending packet %s data %sr   )rE   r   putr   r'   r(   r)   r   r*   r+   r,   r-   r.   r<   s     r   r5   zAsyncSocket.sendG   s     ,,...**..%%% ? $&*=*=coo*N0:388U0K	1 &0	1	 / &s    B<B8#B<B:A>B<:B<c                 V  K   |j                  dd      j                         j                  d      D cg c]  }|j                          }}|j                  dd      j                         }d|v r\|| j                  v rN| j
                  j                  j                  d| j                  |        t        | d|z         |       d{   S | j                  s| j                  r$t        j                  t        j                        gS 	 | j                          d{   }|S c c}w 7 `7 # t         j"                  $ rf t%        j&                         }| j)                  d	| j
                  j*                  j,                  
       d{  7   |d   j/                  |d         w xY ww)z2Handle a long-polling GET request from the client.HTTP_CONNECTION ,HTTP_UPGRADEupgradez%%s: Received request to upgrade to %s	_upgrade_NF)r$   r&   r      )r   lowersplitstripupgrade_protocolsr   r'   r(   r)   getattr	upgradingupgradedr   r6   r7   r   r   r   sysexc_infor9   r&   TRANSPORT_ERRORwith_traceback)r   environsconnections	transportr   excs          r   handle_get_requestzAsyncSocket.handle_get_requestR   sz     [[!2B7==?EEcJL GGIL L KK399;	#	T5K5K(KKK##$K$(HHi9?{Y'>?HHH>>T]] MM&++.//	0 IIK'G 'L I ($$ 	0,,.C**%$(KK$6$6$F$F  H H Ha&''A//		0sU   2F)D$A=F)D)	A F)
D- D+D- "F)+D- -AF&F	F&&F)c                 z  K   t        |j                  dd            }|| j                  j                  kD  rt	        j
                         |d   j                  |       d{   j                  d      }t        j                  |      }|j                  D ]  }| j                  |       d{     y7 T7 	w)z3Handle a long-polling POST request from the client.CONTENT_LENGTH0z
wsgi.inputNzutf-8)encoded_payload)intr   r   max_http_buffer_sizer   ContentTooLongErrorreaddecoder   Payloadr   r=   )r   r[   lengthbodypr   s         r   handle_post_requestzAsyncSocket.handle_post_requesti   s     W[[!1378DKK4440022!,/44V<<DDWMD5Ayy (ll3'''( = (s%   A B;"B7#AB;/B90B;9B;Nc                   K   | j                   s| j                  sd| _        | j                  j                  d| j                  |xs  | j                  j
                  j                  d       d{    |s:| j                  t        j                  t        j                               d{    d| _         |r#| j                  j                          d{    yyyy7 o7 57 w)zClose the socket connection.T
disconnectFr!   N)r?   closingr   r2   r)   r&   SERVER_DISCONNECTr5   r   r6   r8   r   join)r   r$   r%   r&   s       r   r9   zAsyncSocket.closet   s     {{4<<DL++,,dhh>$++,,>> - ! ! ! iifll ;<<<DKjjoo'''  $0{!
 = (s6   A.C&0C 1;C&,C"-*C&C$	C&"C&$C&c                 N    | j                   j                  | j                         y N)r   start_background_task
_send_pingrD   s    r   r0   zAsyncSocket.schedule_ping   s    ))$//:    c                 ^  K   d | _         t        j                  | j                  j                         d {    | j
                  sa| j                  sTt        j                         | _         | j                  t        j                  t        j                               d {    y y y 7 r7 	wru   )rA   r   sleepr   r   rq   r?   rB   r5   r   r6   PINGrD   s    r   rw   zAsyncSocket._send_ping   st     mmDKK55666||DKK!YY[DN))FMM&++6777 %0| 	7 8s"   4B-B)A*B-!B+"B-+B-c                 *  K   | j                   rt        d      | j                  j                  d   | j                  j	                         S  | j                  j                  d   | j
                  | j                        } ||       d{   S 7 w)z1Upgrade the connection from polling to websocket.z Socket has been upgraded already	websocketN)rV   OSErrorr   _async_bad_request_websocket_handler)r   r[   wss      r   _upgrade_websocketzAsyncSocket._upgrade_websocket   s{     ==<==;;k*2;;++--,T[[,##T[[2[   s   B
BBBc                 Z   K    fd} j                   rd _        	  |        d{   }t        j                  |      }|j
                  t        j                  k7  s|j                  dk7  r8 j                  j                  j                  d j                         d _        yj                  t        j                  t        j                  d      j                                d{     j                  j!                  t        j                  t        j"                               d{    	  |        d{   }t        j                  |      }|j
                  t        j$                  k7  r@d _         j                  j                  j                  d	 j                  |       d _        yd _        d _        nd _         d _         fd
}t)        j*                   |             } j                  j                  j                  d j                         	 d}t)        j*                   |             }	 t)        j,                  | j                  j.                   j                  j0                  z          d{   }|n1t        j                  |      }	  j7                  |       d{     j                  j!                  d       d{    t)        j,                  |d       d{     j?                  dd j                  j@                  jB                         d{    y7 # t        $ r Y yw xY w7 c7 "7 # t        $ r
 d _        Y yw xY w7 # t(        j2                  $ r 	 |j5                          n#  Y nxY wY  Y xY w7 # t8        j:                  $ r Y t8        j<                  $ r)  j                  j                  j                  d       Y 5  j                  j                  j5                  d       Y _xY w7 C7 '7 w)z*Engine.IO handler for websocket transport.c                     K   j                          d {   } | r-t        |       j                  j                  kD  rt	        d      | S 7 5w)Nzpacket is too large)r$   lenr   rf   
ValueError)r-   r   r   s    r   websocket_waitz6AsyncSocket._websocket_handler.<locals>.websocket_wait   sB     ?DD	DKK$D$DD !677K #s   AA6ATN)encoded_packetprobez,%s: Failed websocket upgrade, no PING packetF)r-   zK%s: Failed websocket upgrade, expected UPGRADE packet, received %s instead.c                  *  K   	 d } 	 j                          d {   } | sn1	 | D ])  }j                  |j	                                d {    + 	 Oj                          d {    y 7 Q# t        j                  $ r Y 0w xY w7 <#  Y :xY w7 )wru   )r   r   r   r5   encoder9   )r   r   r   r   s     r   writerz.AsyncSocket._websocket_handler.<locals>.writer   s     $(IIK/G & 4 ggcjjl3334  ((* 0!,,  4sl   BA/ A-A/ B'B
 BB
 B'B(B-A/ /BBBBB
 
BBz#%s: Upgrade to websocket successfulz!Receive error -- socket is closedzUnknown receive error)timeoutr#   )"	connectedrU   r~   r   r6   r+   r{   r-   r   r'   r(   r)   r5   r/   r   r   rG   r7   r4   rV   r   ensure_futurer   r   r   r   	exceptionr=   r   r;   r@   r9   r&   TRANSPORT_CLOSE)	r   r   r   r   decoded_pktr   writer_taskrm   	wait_tasks	   ``       r   r   zAsyncSocket._websocket_handler   sx    	 >>!DN*,, !--s;K&&&++5$$/""''BDHHN!&''&--'BIIKLLL**..v{{!;<<<*,, !--s;K&&&..8 %""'',HHc# "' DM"DN!DN DM	" ++FH51488	= A--n.>?I!**KK--0H0HHJ J$ y--q1C
Fll3'''7 L jjnnT"""{D999jje4 $ 2 2 B B  D 	D 	DA -  M< - !&ZJ )) '') (00 11 ""''(KLF "",,-DE"9	DsO  P+
M L?M B?P+.M/AP+2M3P+8
M MM C=P+AM2 	M0
M2 P+(N( <N&=N( P+ P#!P+?P& 9P+9P):P+?M 	MP+MP+P+M M-*P+,M--P+0M2 2N#NN#NN#P+ N#!P+&N( (P ;P+=7P 4P+7&P P+&P+)P+)TFN)__name__
__module____qualname__r   r=   rE   r5   r`   rn   r9   r0   rw   r   r    rx   r   r	   r	      s;    .2( 	1.	((;8	!nDrx   r	   )
r   rW   rB   rJ   r   r   r   r   
BaseSocketr	   r   rx   r   <module>r      s0     
     zD+(( zDrx   