
    i)                     t    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	dS )	    N   )base_socket)
exceptions)packet)payloadc                   R    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d	S )AsyncSocketc                 D  K   	 t          j        | j                                        | j        j        | j        j        z              d{V g}| j                                         n2# t           j        t           j	        f$ r t          j                    w xY w|dgk    rg S 	 	 | j                                        }| j                                         || j                            d           n,|                    |           n# t           j        $ r Y nw xY w||S )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      @/usr/local/lib/python3.11/dist-packages/engineio/async_socket.pypollzAsyncSocket.poll   s]     	*$-
  )DK,DDF F F F F F F F GG J  """"$g&<= 	* 	* 	*')))	*tfI		j++--
$$&&&;J))$///s####%   		 s%   A#A( (/B%AD
 4D
 
DDc           	        K   | j         j                            d| j        t          j        |j                 t          |j        t                    s|j        nd           |j        t          j
        k    r|                                  dS |j        t          j        k    r:| j                             d| j        |j        | j         j                   d{V  dS |j        t          j        k    r9|                     t	          j        t          j                             d{V  dS |j        t          j        k    r/|                     dd| j         j        j                   d{V  dS t/          j                    )	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#   s      @ $&*=co*N0:38U0K0K !0%/	1 	1 	1 ?fk))     _..+,,48SX+4 - 6 6 6 6 6 6 6 6 6 6 6 _..))FM&+6677777777777_,,**%t$(K$6$H  J J J J J J J J J J J /111    c                 F  K   | j         rt          j                    | j        r}t	          j                    | j        z
  | j        j        k    rT| j        j                            d| j	                   | 
                    dd| j        j        j                   d{V  dS dS )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      ; 	30222> 			dn,t{/GGGK##$H$(H. . .
 **%u$(K$6$C  E E E E E E E E E5tr>   c           	      <  K   |                                   d{V sdS | j                            |           d{V  | j        j                            d| j        t          j        |j	                 t          |j        t                    s|j        nd           dS )zSend a packet to the client.Nz%s: Sending packet %s data %sr   )rF   r   putr   r'   r(   r)   r   r*   r+   r,   r-   r.   r<   s     r   r5   zAsyncSocket.sendG   s      ,,........ 	&F*..%%%%%%%%% ? $&*=co*N0:38U0K0K !0%/	1 	1 	1 	1 	1r>   c                   K   d |                     dd                                                              d          D             }|                     dd                                          }d|v rQ|| j        v rH| j        j                            d| j        |            t          | d|z             |           d	{V S | j	        s| j
        rt          j        t          j                  gS 	 |                                  d	{V }ns# t          j        $ ra t#          j                    }|                     d
| j        j        j                   d	{V  |d                             |d                   w xY w|S )z2Handle a long-polling GET request from the client.c                 6    g | ]}|                                 S  )strip).0ss     r   
<listcomp>z2AsyncSocket.handle_get_request.<locals>.<listcomp>T   s6     L L L GGIIL L Lr>   HTTP_CONNECTION ,HTTP_UPGRADEupgradez%%s: Received request to upgrade to %s	_upgrade_NF)r$   r&   r      )r   lowersplitupgrade_protocolsr   r'   r(   r)   getattr	upgradingupgradedr   r6   r7   r   r   r   sysexc_infor9   r&   TRANSPORT_ERRORwith_traceback)r   environconnections	transportr   excs         r   handle_get_requestzAsyncSocket.handle_get_requestR   s     L L[[!2B77==??EEcJJL L L KK3399;;	##	T5K(K(KK##$K$(Hi9 9 9?{Y'>??HHHHHHHHH> 	0T] 	0 M&+..//	0 IIKK''''''GG$ 	0 	0 	0,..C**%$(K$6$F  H H H H H H H H Ha&''A///		0
 s   3D A0E>c                 r  K   t          |                    dd                    }|| j        j        k    rt	          j                    |d                             |           d{V                     d          }t          j	        |          }|j
        D ]}|                     |           d{V  dS )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   ra   lengthbodypr   s         r   handle_post_requestzAsyncSocket.handle_post_requesti   s      W[[!137788DK4440222!,/44V<<<<<<<<DDWMMD555Ay ( (ll3''''''''''( (r>   TFNc                 v  K   | j         s| j        sd| _        | j                            d| j        |p| j        j        j        d           d{V  |s7|                     t          j	        t          j
                             d{V  d| _         |r%| j                                         d{V  dS dS dS dS )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+,,dh>$+,> - ! ! ! ! ! ! ! ! !  =iifl ; ;<<<<<<<<<DK (joo'''''''''''
	( 
	( 
	( 
	(( (r>   c                 D    | j                             | j                   d S N)r   start_background_task
_send_pingrE   s    r   r0   zAsyncSocket.schedule_ping   s     ))$/:::::r>   c                 "  K   d | _         t          j        | j        j                   d {V  | j        sX| j        sSt          j                    | _         |                     t          j
        t          j                             d {V  d S d S d S rz   )rB   r   sleepr   r   rv   r@   rC   r5   r   r6   PINGrE   s    r   r|   zAsyncSocket._send_ping   s      mDK5666666666| 	8DK 	8!Y[[DN))FM&+6677777777777	8 	8 	8 	8r>   c                    K   | j         rt          d          | j        j        d         | j                                        S  | j        j        d         | j        | j                  } ||           d{V S )z1Upgrade the connection from polling to websocket.z Socket has been upgraded already	websocketN)r\   OSErrorr   _async_bad_request_websocket_handler)r   ra   wss      r   _upgrade_websocketzAsyncSocket._upgrade_websocket   s      = 	><===;k*2;++---,T[,#T[2 2R[[       r>   c                 F   K    fd} j         rd _        	  |             d{V }n# t          $ r Y dS w xY wt          j        |          }|j        t          j        k    s|j        dk    r. j        j	        
                    d j                   d _        dS                     t          j        t          j        d                                                     d{V   j                            t          j        t          j                             d{V  	  |             d{V }n# t          $ r d _        Y dS w xY wt          j        |          }|j        t          j        k    r6d _         j        j	        
                    d	 j        |           d _        dS d _        d _        nd _         d _         fd
}t)          j         |                      } j        j	        
                    d j                   	 d}t)          j         |                      }	 t)          j        | j        j         j        j        z              d{V }n4# t(          j        $ r  	 |                                 n#  Y nxY wY n Y nxY w|nt          j        |          }	                      |           d{V  ne# t8          j        $ r Y nTt8          j        $ r"  j        j	        
                    d           Y n'  j        j	                            d           Y nxY w" j                            d           d{V  t)          j        |d           d{V                       dd j        j         j!                   d{V  dS )z*Engine.IO handler for websocket transport.c                     K                                     d {V } | r,t          |           j        j        k    rt	          d          | S )Nzpacket is too large)r$   lenr   rk   
ValueError)r-   r   r   s    r   websocket_waitz6AsyncSocket._websocket_handler.<locals>.websocket_wait   sQ      ??????D 8D		DK$DDD !6777Kr>   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 } 	                                   d {V } n# t          j        $ r Y nCw xY w| sn<	 | D ]/}                    |                                           d {V  0n#  Y nxY wr                                 d {V  d S rz   )r   r   r   r5   encoder9   )r   r   r   r   s     r   writerz.AsyncSocket._websocket_handler.<locals>.writer   s      $(IIKK//////GG!,   E & 4 4 ggcjjll33333333334E ((**s   # 552A/ /A3z#%s: Upgrade to websocket successfulz!Receive error -- socket is closedzUnknown receive error)timeoutr#   )"	connectedr[   r   r   r6   r+   r   r-   r   r'   r(   r)   r5   r/   r   r   rH   r7   r4   r\   r   ensure_futurer   r   r   r   	exceptionr=   r   r;   rA   r9   r&   TRANSPORT_CLOSE)	r   r   r   r   decoded_pktr   writer_taskrr   	wait_tasks	   ``       r   r   zAsyncSocket._websocket_handler   s     	 	 	 	 	 	 > $	!!DN*N,,,,,,,,    -s;;;K&&+55$//"''BDHN N N!&''&-'BBBIIKKLLLLLLLLL*..v{!;!;<<<<<<<<<*N,,,,,,,,   !& !-s;;;K&&.88 %"'',Hc# # # "' DM"DNN!DN DM	 	 	 	 	 	" +FFHH55148	= 	= 	=$	FA-nn.>.>??I!*K-0HHJ J J J J J J J )   ''))))Dy-q111C
Fll3''''''''''0   1   "''(KLLLF ",,-DEEEEEI$	FL jnnT"""""""""{D9999999999jje4 $ 2 B  D D 	D 	D 	D 	D 	D 	D 	D 	D 	Ds`   , 
::(D9 9EE52I( (J8JJJJJ5K L3"-L3 L3)TFN)__name__
__module____qualname__r   r=   rF   r5   re   rs   r9   r0   r|   r   r   rK   r>   r   r	   r	      s          .2 2 2(   	1 	1 	1  .	( 	( 	(( ( ( (; ; ;8 8 8	! 	! 	!nD nD nD nD nDr>   r	   )
r   r]   rC   rQ   r   r   r   r   
BaseSocketr	   rK   r>   r   <module>r      s     



                         zD zD zD zD zD+( zD zD zD zD zDr>   