
    2BfT'                     N    d dl Z d dlZddlmZ ddlmZ ddlmZ  G d de      Zy)    N   )
exceptions)packet)payloadc                   Z    e Zd ZdZdgZd Zd Zd Zd Zd Z	d Z
d	 Zdd
Zd Zd Zd Zy)SocketzAn Engine.IO socket.	websocketc                     || _         || _        | j                   j                         | _        d | _        d| _        d| _        d| _        d| _        d| _	        i | _
        y )NF)serversidcreate_queuequeue	last_ping	connected	upgradingupgradedclosingclosedsession)selfr   r   s      O/var/www/highfloat_scraper/venv/lib/python3.12/site-packages/engineio/socket.py__init__zSocket.__init__   sU    [[--/
    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)r   get_queue_empty_exceptionr   getping_intervalping_timeout	task_doner   
QueueEmptyputappend)r   queue_emptypacketspkts       r   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(  r| j+                  dd       y	t-        j.                         )
zReceive packet from the client.UNKNOWNz%s: Received packet %s data %s<binary>message	run_asyncFTwaitabortN)packet_typelenr   packet_namesr   loggerinfor   
isinstancedatabytesPONGschedule_pingMESSAGE_trigger_eventasync_handlersUPGRADEsendPacketNOOPCLOSEcloser   UnknownPacketError)r   r'   packet_names      r   receivezSocket.receive0   s+    V%8%8!99 ))#//:?H 	 @ $+0:388U0K%/	1 ??fkk) __.KK&&y$((CHH151K1K ' M__.IIfmmFKK01__,JJEJ.//11r   c                 T   | j                   rt        j                         | j                  r|t	        j                         | j                  z
  | j
                  j                  kD  rD| j
                  j                  j                  d| j                         | j                  dd       yy)z2Make sure the client is still responding to pings.z"%s: Client is gone, closing socketFr/   T)r   r   SocketIsClosedErrorr   timer   r    r5   r6   r   rD   r   s    r   check_ping_timeoutzSocket.check_ping_timeoutD   sz    ;;0022>>		dnn,t{{/G/GGKK##$H$(HH.
 JJEJ/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+   )rL   r   r#   r   r5   r6   r   r   r4   r2   r7   r8   r9   )r   r'   s     r   r@   zSocket.sendS   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	       |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)r0   r      )r   lowersplitstripupgrade_protocolsr   r5   r6   r   getattrr   r   r   rA   rB   r(   r   r"   sysexc_inforD   with_traceback)r   environstart_responsesconnections	transportr&   excs           r   handle_get_requestzSocket.handle_get_request^   sK    [[!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JJEJ"a&''A//	0s   DD AE)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&   rG   )r   r^   lengthbodypr'   s         r   handle_post_requestzSocket.handle_post_requestu   s    W[[!1378DKK4440022<(--f5<<WED5Ayy "S!"r   c                 |   | j                   s| j                  sd| _        | j                  j                  d| 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)r   r   r   r=   r   r@   r   rA   rC   r   r#   join)r   r0   r1   s      r   rD   zSocket.close   s    {{4<<DLKK&&|TXX&O		&--56DKJJNN4 

!  $0{r   c                 F      fd} j                   j                  |       y )Nc                  <   d  _          j                  j                   j                  j                          j                  sY j
                  sLt        j                          _          j                  t        j                  t        j                               y y y N)r   r   sleepr   r   r   rJ   r@   r   rA   PINGrK   s   r   	send_pingz'Socket.schedule_ping.<locals>.send_ping   s`    !DNKKdkk778<<!%		&--45 )4<r   )r   start_background_task)r   r{   s   ` r   r;   zSocket.schedule_ping   s    	6 	)))4r   c                     | j                   rt        d      | j                  j                  d   | j                  j	                         S  | j                  j                  d   | j
                        } |||      S )z1Upgrade the connection from polling to websocket.z Socket has been upgraded alreadyr	   )r   IOErrorr   _async_bad_request_websocket_handler)r   r^   r_   wss       r   _upgrade_websocketzSocket._upgrade_websocket   sk    ==<==;;k*2;;++--,T[[,T-D-DE'>**r   c                     dD ]l  }t        |      st        t        |      d      s't        |      j                   j                  j                   j                  j
                  z          n  j                  rd _        j                         }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,                               j                         }t        j                  |      }|j                  t        j.                  k7  rAd _         j                  j                  j                  d	 j                   |       d _        g S d _        d _        nd _        d _         fd
} j                  j3                  |      } j                  j                  j                  d j                          	 d}	 j                         }|n)t        j                  |      }	  j;                  |       ? j(                  j+                  d       |jE                           jG                  dd       g S # t4        $ rP} j6                  s: j                  j                  j                  d j                   t9        |             Y d}~d}~ww xY w# t<        j>                  $ r Y t<        j@                  $ r(  j                  j                  j                  d       Y   j                  j                  jC                  d       Y xY w)z*Engine.IO handler for websocket transport.)_socksocket
settimeoutT)encoded_packetprobez,%s: Failed websocket upgrade, no PING packetF)r8   zK%s: Failed websocket upgrade, expected UPGRADE packet, received %s instead.c                      	 d } 	 j                         } | sy 	 | D ]!  }j                  |j	                                # 	 ?# t        j                  $ r Y y w xY w#  Y y xY wrx   )r(   r   r"   r@   encode)r&   r'   r   r   s     r   writerz)Socket._websocket_handler.<locals>.writer   sq    "iikG & .

-.  ",, s   A &A AAAz#%s: Upgrade to websocket successfulNz-%s: Unexpected error "%s", closing connectionz!Receive error -- socket is closedzUnknown receive errorr/   )$hasattrrZ   r   r   r   r    r   r   r0   r   rA   r2   rz   r8   r5   r6   r   r@   r:   r   r   r#   rB   r?   r   r|   	Exceptionr   strrG   r   rE   rI   	exceptionru   rD   )	r   r   attrr'   decoded_pktr   writer_taskrq   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	GGI y--q1CS!# : 	

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

T
*	;   {{KK&&++G#a&*  00 11 ""''(KL "",,-DEs1   L 1M 	MAMMO47O-&ON)TF)__name__
__module____qualname____doc__rY   r   r(   rG   rL   r@   rd   rr   rD   r;   r   r    r   r   r   r   	   sE    $
.2(	1.	"
"5+^r   r   )r[   rJ   rP   r   r   r   objectr   r   r   r   <module>r      s"    
    uV ur   