
    wgf(                     n    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                   T    e Zd 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)SocketzAn Engine.IO socket.c                 2   | j                   j                         }	 | j                  j                  | j                   j                  | j                   j
                  z         g}| j                  j                          |dgk(  rg S 	 	 | j                  j                  d      }| j                  j                          || j                  j                  d       	 |S |j                  |       i# |$ r t        j                         w xY w# |$ r Y |S w xY w)z'Wait for packets to send to the client.)timeoutNF)block)serverget_queue_empty_exceptionqueuegetping_intervalping_timeout	task_doner   
QueueEmptyputappend)selfqueue_emptypacketspkts       T/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/engineio/socket.pypollzSocket.poll   s
   kk;;=	*zz~~11DKK4L4LL & N OGJJ  " tfIjjnn5n1

$$&;JJNN4(  s# 	  	*''))	*  s%   A"C0 AD D 0D
DDc           	         |j                   t        t        j                        k  rt        j                  |j                      nd}| j                  j
                  j                  d| j                  |t        |j                  t              s|j                  nd       |j                   t        j                  k(  r| j                          y	|j                   t        j                  k(  rH| j                  j                  d| j                  |j                  | j                  j                         y	|j                   t        j                   k(  r3| j#                  t        j$                  t        j&                               y	|j                   t        j(                  k(  r3| j+                  dd| j                  j,                  j.                         y	t1        j2                         )
zReceive packet from the client.UNKNOWNz%s: Received packet %s data %s<binary>message	run_asyncFTwaitabortreasonN)packet_typelenr   packet_namesr   loggerinfosid
isinstancedatabytesPONGschedule_pingMESSAGE_trigger_eventasync_handlersUPGRADEsendPacketNOOPCLOSEcloser&   CLIENT_DISCONNECTr   UnknownPacketError)r   r   packet_names      r   receivezSocket.receive#   sF    V%8%8!99 ))#//:?H 	 @ $+0:388U0K%/	1 ??fkk) __.KK&&y$((CHH151K1K ' M__.IIfmmFKK01__,JJE"kk00BB  D //11    c                    | j                   rt        j                         | j                  rt	        j                         | j                  z
  | j
                  j                  kD  rc| j
                  j                  j                  d| j                         | j                  dd| j
                  j                  j                         yy)z2Make sure the client is still responding to pings.z"%s: Client is gone, closing socketFr#   T)closedr   SocketIsClosedError	last_pingtimer   r   r*   r+   r,   r:   r&   PING_TIMEOUTr   s    r   check_ping_timeoutzSocket.check_ping_timeout8   s    ;;0022>>		dnn,t{{/G/GGKK##$H$(HH.
 JJE"kk00==  ?r?   c           	      L   | j                         sy| j                  j                  |       | j                  j                  j                  d| j                  t        j                  |j                     t        |j                  t              s|j                         yd       y)zSend a packet to the client.Nz%s: Sending packet %s data %sr   )rG   r   r   r   r*   r+   r,   r   r)   r'   r-   r.   r/   )r   r   s     r   r6   zSocket.sendH   sr    &&(JJNN3 ? $&*=*=coo*N0:388U0K	1 &0	1r?   c                    |j                  dd      j                         j                  d      D cg c]  }|j                          }}|j                  dd      j                         }d|v rU|| j                  v rG| j
                  j                  j                  d| j                  |        t        | d|z         ||      S | j                  s| j                  r$t        j                  t        j                        gS 	 | j                         }|S c c}w # t         j"                  $ r] t%        j&                         }| j)                  d| j
                  j*                  j,                  	       |d
   j/                  |d         w xY w)z2Handle a long-polling GET request from the client.HTTP_CONNECTION ,HTTP_UPGRADEupgradez%%s: Received request to upgrade to %s	_upgrade_F)r$   r&   r      )r   lowersplitstripupgrade_protocolsr   r*   r+   r,   getattr	upgradingupgradedr   r7   r8   r   r   r   sysexc_infor:   r&   TRANSPORT_ERRORwith_traceback)r   environstart_responsesconnections	transportr   excs           r   handle_get_requestzSocket.handle_get_requestS   s]    [[!2B7==?EEcJL GGIL L KK399;	#	T5K5K(KKK##$K$(HHi9974y!89':HJ J>>T]] MM&++.//	0iikG
 'L $$ 	0,,.CJJE$++*<*<*L*LJMa&''A//	0s   DD A0Fc                 J   t        |j                  dd            }|| j                  j                  kD  rt	        j
                         |d   j                  |      j                  d      }t        j                  |      }|j                  D ]  }| j                  |        y)z3Handle a long-polling POST request from the client.CONTENT_LENGTH0z
wsgi.inputzutf-8)encoded_payloadN)intr   r   max_http_buffer_sizer   ContentTooLongErrorreaddecoder   Payloadr   r>   )r   r\   lengthbodypr   s         r   handle_post_requestzSocket.handle_post_requestj   s    W[[!1378DKK4440022<(--f5<<WED5Ayy "S!"r?   Nc                    | j                   s| j                  sd| _        | j                  j                  d| j                  |xs  | j                  j
                  j                  d       |s2| j                  t        j                  t        j                               d| _         | j                  j                  d       |r| j                  j                          yyyy)zClose the socket connection.T
disconnectFr!   N)rA   closingr   r3   r,   r&   SERVER_DISCONNECTr6   r   r7   r9   r   r   join)r   r$   r%   r&   s       r   r:   zSocket.closeu   s    {{4<<DLKK&&dhh>$++,,>> ' ! 		&--56DKJJNN4 

!  $0{r?   c                 N    | j                   j                  | j                         y N)r   start_background_task
_send_pingrF   s    r   r1   zSocket.schedule_ping   s    ))$//:r?   c                 :   d | _         | j                  j                  | j                  j                         | j                  sY| j
                  sLt        j                         | _         | j                  t        j                  t        j                               y y y rw   )rC   r   sleepr   rs   rA   rD   r6   r   r7   PINGrF   s    r   ry   zSocket._send_ping   s_    $++334||DKK!YY[DNIIfmmFKK01 %0|r?   c                    | j                   rt        d      | j                  j                  d   | j                  j	                         S  | j                  j                  d   | j
                  | j                        } |||      S )z1Upgrade the connection from polling to websocket.z Socket has been upgraded already	websocket)rW   OSErrorr   _async_bad_request_websocket_handler)r   r\   r]   wss       r   _upgrade_websocketzSocket._upgrade_websocket   st    ==<==;;k*2;;++--,T[[,##T[[2'>**r?   c                      fd}dD ]l  }t        |      st        t        |      d      s't        |      j                   j                  j                   j                  j
                  z          n  j                  rd _         |       }t        j                  |      }|j                  t        j                  k7  s|j                  dk7  r9 j                  j                  j                  d j                         d _        g S j!                  t        j                  t        j"                  d	      j%                                 j&                  j)                  t        j                  t        j*                                |       }t        j                  |      }|j                  t        j,                  k7  rAd _         j                  j                  j                  d
 j                  |       d _        g S d _        d _        nd _        d _         fd} j                  j1                  |      } j                  j                  j                  d j                         	 d}	  |       }|n)t        j                  |      }	  j9                  |       6 j&                  j)                  d       |jC                           jE                  dd j                  jF                  jH                         g S # t2        $ rP}	 j4                  s: j                  j                  j                  d j                  t7        |	             Y d}	~	d}	~	ww xY w# t:        j<                  $ r Y t:        j>                  $ r)  j                  j                  j                  d       Y 
  j                  j                  jA                  d       Y 3xY w)z*Engine.IO handler for websocket transport.c                      j                         } | r-t        |       j                  j                  kD  rt	        d      | S )Nzpacket is too large)r$   r(   r   rh   
ValueError)r.   r   r   s    r   websocket_waitz1Socket._websocket_handler.<locals>.websocket_wait   s7    779DD	DKK$D$DD !677Kr?   )_socksocket
settimeoutT)encoded_packetprobez,%s: Failed websocket upgrade, no PING packetF)r.   zK%s: Failed websocket upgrade, expected UPGRADE packet, received %s instead.c                      	 d } 	 j                         } | sn)	 | D ]!  }j                  |j	                                # 	 ?j                          y # t        j                  $ r Y &w xY w#  Y .xY wrw   )r   r   r   r6   encoder:   )r   r   r   r   s     r   writerz)Socket._websocket_handler.<locals>.writer   s|    "iikG & .

-.  HHJ ",, s   A &A, A)(A),A0z#%s: Upgrade to websocket successfulNz-%s: Unexpected error "%s", closing connectionz!Receive error -- socket is closedzUnknown receive errorr#   )%hasattrrU   r   r   r   r   	connectedrV   r   r7   r'   r|   r.   r*   r+   r,   r6   r0   r   r   r   r8   r5   rW   rx   	ExceptionrA   strr>   r   r<   rB   	exceptionru   r:   r&   TRANSPORT_CLOSE)
r   r   r   attrr   decoded_pktr   writer_taskro   es
   ``        r   r   zSocket._websocket_handler   s   	 ( 	JDr4 WWR->%MD!,,KK--0H0HHJ	J
 >>!DN "C --s;K&&&++5$$/""''BDHHN!&	GGFMM&++G<CCEFJJNN6==56 "C --s;K&&&..8 %""'',HHc# "'	 DM"DN!DN DM	" kk77?1488	= A	"$ y--q1CS!# : 	

t

T++,,<< 	 	> 	=   {{KK&&++G#a&*  00 11 ""''(KL "",,-DEs1   ;L M) 	M&AM!!M&)O!>7O!8&O!)TFN)__name__
__module____qualname____doc__r   r>   rG   r6   rb   rp   r:   r1   ry   r   r    r?   r   r	   r	   
   s=    .2* 	1.	"";2	+gr?   r	   )	rX   rD   rK   r   r   r   r   
BaseSocketr	   r   r?   r   <module>r      s+    
     v[## vr?   