
    `eH                        U d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZmZm	Z	m
Z
mZm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mZ ddlmZmZmZmZmZmZmZmZm Z m!Z!m"Z" dd	l#m$Z$ dd
l%m&Z&m'Z' ddl(m)Z)m*Z* ddl+m,Z,m-Z- ddl.m/Z/ ddl0m1Z1 ej2        dk    rd dl Z3nd dl3Z3dZ4dZ5ee6         e7d<    ej8        ddd           G d d                      Z9 G d de1          Z:dS )    N)AnyFinalIterableOptionalTuplecast)CIMultiDict   )hdrs)AbstractStreamWriter)
call_later
set_result)WS_CLOSED_MESSAGEWS_CLOSING_MESSAGEWS_KEYWebSocketErrorWebSocketReaderWebSocketWriterWSCloseCode	WSMessage	WSMsgType
ws_ext_genws_ext_parse)	ws_logger)	EofStreamFlowControlDataQueue)JSONDecoderJSONEncoder)HTTPBadRequestHTTPException)BaseRequest)StreamResponse)      )WebSocketResponseWebSocketReadyr      THRESHOLD_CONNLOST_ACCESST)auto_attribsfrozenslotsc                   <    e Zd ZU eed<   ee         ed<   defdZdS )r&   okprotocolreturnc                     | j         S N)r-   selfs    .lib/python3.11/site-packages/aiohttp/web_ws.py__bool__zWebSocketReady.__bool__6   s	    w    N)__name__
__module____qualname__bool__annotations__r   strr5    r6   r4   r&   r&   1   sJ         HHHsm$      r6   r&   c                       e Zd ZdZdddddddddded	ee         d
ededee         dee         dede	ddf fdZ
dCdZdCdZdCdZdCdZdedef fdZdededeeef         fdZdedeeef         fdZdedededdfdZdedefdZedefd            Zedee	         fd             Zedee         fd!            Zedefd"            ZdDd#ed$edefd%Zdee          fd&Z!dEd(e"ddfd)Z#dEd(e"ddfd*Z$dDd+edee         ddfd,Z%dDd+e"dee         ddfd-Z&	 dDe'j(        d.d+edee         d/e)ddfd0Z*dCd1Z+e,j-        d'dd2d3e	d(e"d4edefd5Z.d3e,ddfd6Z/dDdee         de0fd7Z1dd8dee         defd9Z2dd8dee         de"fd:Z3e'j4        dd;d<e5dee         defd=Z6d+e"ddfd>Z7dFd?Z8de0fd@Z9dAe ddfdBZ: xZ;S )Gr%   Fg      $@NTr=   i  @ )timeoutreceive_timeout	autocloseautoping	heartbeat	protocolscompressmax_msg_sizer?   r@   rA   rB   rC   rD   rE   rF   r/   c                |   t                                          d           || _        d | _        d | _        d | _        d| _        d| _        d| _        d | _	        d | _
        d | _        d | _        || _        || _        || _        || _        || _        d | _        |
|dz  | _        d | _        || _        || _        d S )Ne   )statusFr   g       @)super__init__
_protocols_ws_protocol_writer_reader_closed_closing
_conn_lost_close_code_loop_waiting
_exception_timeout_receive_timeout
_autoclose	_autoping
_heartbeat_heartbeat_cb_pong_heartbeat_pong_response_cb	_compress_max_msg_size)
r3   r?   r@   rA   rB   rC   rD   rE   rF   	__class__s
            r4   rK   zWebSocketResponse.__init__>   s     	$$$#+/26BF*.:>
8<37 /#!#<@ #,s?D @D!)r6   c                     | j          | j                                          d | _         | j        "| j                                         d | _        d S d S r1   )r^   cancelr\   r2   s    r4   _cancel_heartbeatz#WebSocketResponse._cancel_heartbeatb   s\    !-"))+++%)D")%%'''!%D *)r6   c                     |                                   | j        J| j        J t          | j        | j        | j        | j        | j        j        j        nd          | _        d S d S Nr'   )timeout_ceil_threshold)	rd   r[   rT   r   _send_heartbeat_req	_protocol_timeout_ceil_thresholdr\   r2   s    r4   _reset_heartbeatz"WebSocketResponse._reset_heartbeatk   sz       ?&:)))!+$
9( (,y':'R'R" " "D '&r6   c                 \   | j         | j        s| j        J | j                            | j                                                   | j        | j                                         t          | j	        | j
        | j        | j        | j        j        j        nd          | _        d S d S d S rf   )r[   rP   rT   create_taskrN   pingr^   rc   r   _pong_not_receivedr]   ri   rj   rk   r2   s    r4   rh   z!WebSocketResponse._send_heartbeaty   s    ?&t|&:))) J""4<#4#4#6#6777%1&--///%/'$
9( (,y':'R'R& & &D""" '&&&r6   c                     | j         L| j         j        Bd| _        |                     t          j                   t          j                    | _        d S d S d S )NT)	ri   	transportrP   _set_code_close_transportr   ABNORMAL_CLOSUREasyncioTimeoutErrorrV   r2   s    r4   rp   z$WebSocketResponse._pong_not_received   sT    9 TY%8%DDL**;+GHHH%244DOOO ! %D%Dr6   requestc                   K   | j         | j         S |                     |          \  }}t                                          |           d {V }|J |                     |||           |                                 d {V  |S r1   )_payload_writer
_pre_startrJ   prepare_post_startdrain)r3   rw   r.   writerpayload_writerra   s        r4   r{   zWebSocketResponse.prepare   s      +''??733&$www77777777)))(F333""$$$$$$$$$r6   zCIMultiDict[str]c                 p   |j         }d|                    t          j        d                                                                          k    r@t          d                    |                    t          j                                      d|                    t          j        d                                          vr@t          d                    |                    t          j                                      d }t          j	        |v r\d |t          j	                 
                    d          D             }|D ]}|| j        v r|} nt          j        d	|| j                   |                    t          j        d          }|d
vrt          d|           |                    t          j                  }	 |r%t!          t#          j        |                    dk    rt          d|          n'# t&          j        $ r t          d|          d w xY wt#          j        t-          j        |                                t2          z                                                                                       }t9          t          j        dt          j        dt          j        |i          }	d}
d}| j        rV|                    t          j                  }tA          |d          \  }}
|r!tC          |d|
          }||	t          j        <   |r||	t          j	        <   |	|||
fS )N	websocket z@No WebSocket UPGRADE hdr: {}
 Can "Upgrade" only to "WebSocket".)textupgradezNo CONNECTION upgrade hdr: {}c                 P    g | ]#}t          |                                          $S r=   )r<   strip).0protos     r4   
<listcomp>z0WebSocketResponse._handshake.<locals>.<listcomp>   s8        EKKMM""  r6   ,u8   Client protocols %r don’t overlap server-known ones %r)1387zUnsupported version:    zHandshake error: Fr   T)isserver)rE   r   server_notakeover)"headersgetr   UPGRADElowerr   r   format
CONNECTIONSEC_WEBSOCKET_PROTOCOLsplitrL   r   warningSEC_WEBSOCKET_VERSIONSEC_WEBSOCKET_KEYlenbase64	b64decodebinasciiError	b64encodehashlibsha1encoder   digestdecoder	   SEC_WEBSOCKET_ACCEPTr_   SEC_WEBSOCKET_EXTENSIONSr   r   )r3   rw   r   r.   req_protocolsr   versionkey
accept_valresponse_headers
notakeoverrE   
extensions
enabledexts                 r4   
_handshakezWebSocketResponse._handshake   sg    /'++dlB77==??EEGGGG 5&T\2233	    GKK<<BBDDDD 4;;KK00     &'11 $T%@AGGLL  M
 ' 
 
DO++$HE ,
 !N!O   ++d8"==*** &Gg&G&GHHHH kk$011	M G#f.s3344::$*Ec*E*EFFFF ;~ 	M 	M 	M &A#&A&ABBBL	M %L.//6688
 

&(( 	 'k):
 
 
> 		M T%BCCJ $0
T#J#J#J Hj M'%
  
 CM !>? 	E<DT89	
 	
s   :H $H&c                 :   |j         | _         |                     |          \  }}}}|                     d           | j                            |           |                                  || _        |j        j        }|J t          |j        |||          }||fS )NrH   )rE   r   )
rT   r   
set_statusr   updateforce_closer_   rj   rr   r   )r3   rw   r   r.   rE   r   rr   r~   s           r4   rz   zWebSocketResponse._pre_start   s    ]
26//'2J2J/8ZG$$$!%/	$$$ y8

 
 
 r6   r.   r~   c                 >   || _         || _        |                                  | j        }|J t	          |j        d|          | _        |j                            t          | j        | j
        | j                             |j                            d           d S )Ni   )looprE   F)rM   rN   rl   rT   r   rj   rO   r.   
set_parserr   r`   r_   
keep_alive)r3   rw   r.   r~   r   s        r4   r|   zWebSocketResponse._post_start  s     %z+G,=u4PPP##DL$*<t~VVV	
 	
 	
 	##E*****r6   c                     | j         t          d          	 |                     |          \  }}}}t          d|          S # t          $ r t          dd           cY S w xY w)NzAlready startedTF)rN   RuntimeErrorr   r&   r    )r3   rw   _r.   s       r4   can_preparezWebSocketResponse.can_prepare  s}    <#0111	2 $ 8 8AxA "$111  	/ 	/ 	/!%.....	/s   A AAc                     | j         S r1   )rP   r2   s    r4   closedzWebSocketResponse.closed  s
    |r6   c                     | j         S r1   )rS   r2   s    r4   
close_codezWebSocketResponse.close_code#  s    r6   c                     | j         S r1   )rM   r2   s    r4   ws_protocolzWebSocketResponse.ws_protocol'  s      r6   c                     | j         S r1   )r_   r2   s    r4   rE   zWebSocketResponse.compress+  s
    ~r6   namedefaultc                 Z    | j         }||S |j        }||S |                    ||          S )z}Get optional transport information.

        If no value associated with ``name`` is found, ``default`` is returned.
        )rN   rr   get_extra_info)r3   r   r   r~   rr   s        r4   r   z WebSocketResponse.get_extra_info/  s>    
 >N$	N''g666r6   c                     | j         S r1   )rV   r2   s    r4   	exceptionzWebSocketResponse.exception<  s
    r6   r6   messagec                 v   K   | j         t          d          | j                             |           d {V  d S NCall .prepare() first)rN   r   ro   r3   r   s     r4   ro   zWebSocketResponse.ping?  sK      <6777l(((((((((((r6   c                 v   K   | j         t          d          | j                             |           d {V  d S r   )rN   r   pongr   s     r4   r   zWebSocketResponse.pongD  sK      <6777l(((((((((((r6   datac                    K   | j         t          d          t          |t                    st	          dt          |          z            | j                             |d|           d {V  d S )Nr   zdata argument must be str (%r)FbinaryrE   )rN   r   
isinstancer<   	TypeErrortypesendr3   r   rE   s      r4   send_strzWebSocketResponse.send_strJ  s      <6777$$$ 	K<tDzzIJJJlUXFFFFFFFFFFFr6   c                    K   | j         t          d          t          |t          t          t
          f          st          dt          |          z            | j                             |d|           d {V  d S )Nr   z#data argument must be byte-ish (%r)Tr   )	rN   r   r   bytes	bytearray
memoryviewr   r   r   r   s      r4   
send_byteszWebSocketResponse.send_bytesQ  s      <6777$	: >?? 	PADJJNOOOlTHEEEEEEEEEEEr6   )dumpsr   c                V   K   |                       ||          |           d {V  d S )Nr   )r   )r3   r   rE   r   s       r4   	send_jsonzWebSocketResponse.send_jsonX  s>       mmEE$KK(m;;;;;;;;;;;r6   c                    K   | j         rd S | j        t          d          |                                  d {V  d| _         d S )NzResponse has not been startedT)	_eof_sentry   r   closer2   s    r4   	write_eofzWebSocketResponse.write_eofa  sX      > 	F'>???jjllr6   )coder   r}   r   r}   c                  K   | j         t          d          |                                  | j        }|J | j        /| j        s(|                    t          d           | j         d{V  | j        rdS d| _        	 | j                             ||           d{V  | j	        }|J |r|
                                 d{V  nx# t          j        t          j        f$ r! |                     t          j                    t"          $ r1}|| _        |                     t          j                   Y d}~dS d}~ww xY w| j        rdS | j        }|J 	 t)          j        | j                  4 d{V  |                                 d{V }ddd          d{V  n# 1 d{V swxY w Y   nl# t          j        $ r! |                     t          j                    t"          $ r1}|| _        |                     t          j                   Y d}~dS d}~ww xY w|j        t2          j        k    r|                     |j                   dS |                     t          j                   t          j                    | _        dS )zClose websocket connection.Nr   r   FT)rN   r   rd   rO   rU   rP   	feed_datar   r   ry   r}   ru   CancelledErrorrv   rs   r   rt   	ExceptionrV   rQ   async_timeoutr?   rW   readr   r   CLOSEr   )r3   r   r   r}   readerr~   excmsgs           r4   r   zWebSocketResponse.closej  se      <6777   !!! =$T\$/333-< 	5	,$$T7333333333)F%%% %llnn$$$$$$$&(<= 	 	 	**;+GHHH 	 	 	!DO**;+GHHH44444	
 = 	4!!!		$,T];; * * * * * * * *"KKMM))))))* * * * * * * * * * * * * * * * * * * * * * * * * * *% 	 	 	**;+GHHH 	 	 	!DO**;+GHHH44444	
 8y&&**384444&&{'CDDD!.00tsV   ?AC AD=&D88D=F3 4F!F3 !
F++F3 .F+/F3 38H+&HHc                 ~    || _         | j        ,| j        j        "| j        j                                         dS dS dS )z+Set the close code and close the transport.N)rS   ri   rr   r   )r3   r   s     r4   rs   z+WebSocketResponse._set_code_close_transport  sG    9 TY%8%DI%%''''' ! %D%Dr6   c                   K   | j         t          d          | j        }|J 	 | j        t          d          | j        r6| xj        dz  c_        | j        t          k    rt          d          t          S | j        rt          S 	 |
                                | _        	 t          j        |p| j                  4 d {V  | j                                          d {V }d d d           d {V  n# 1 d {V swxY w Y   |                                  | j        }t!          |d           d | _        n## | j        }t!          |d           d | _        w xY wnP# t"          j        t"          j        f$ r! |                     t*          j                    t.          $ rI t*          j        | _        |                                  d {V  t7          t8          j        d d           cY S t<          $ rR}|j        | _        |                     |j                   d {V  t7          t8          j         |d           cY d }~S d }~wtB          $ r^}|| _"        d| _        t*          j        | _        |                                  d {V  t7          t8          j         |d           cY d }~S d }~ww xY w|j#        t8          j$        k    r>d| _        |j%        | _        | j        s#| j&        r|                     d           d {V  ny|j#        t8          j'        k    rd| _        n\|j#        t8          j(        k    r)| j)        r"| *                    |j%                   d {V  7|j#        t8          j+        k    r	| j)        rU|S )	Nr   Tz+Concurrent call to receive() is not allowedr
   zWebSocket connection is closed.)r   F)r}   ),rO   r   rT   rU   rP   rR   r(   r   rQ   r   create_futurer   r?   rX   r   rl   r   ru   r   rv   rs   r   rt   r   OKrS   r   r   r   CLOSEDr   r   ERRORr   rV   r   r   r   rY   CLOSINGPINGrZ   r   PONG)r3   r?   r   r   waiterr   s         r4   receivezWebSocketResponse.receive  sL     <6777z:	}("#PQQQ| *1$?&???&'HIII(( *))= $ 2 2 4 4),4W5U@UVV 8 8 8 8 8 8 8 8$(L$5$5$7$77777778 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8))+++!]Fvt,,,$(DMM "]Fvt,,,$(DM((((M*G,@A   ..{/KLLL ? ? ?#.> jjll""""""" !14>>>>>! = = =#&8 jjchj///////// #t<<<<<<<< = = ="% $#.#? jjll""""""" #t<<<<<<<<= x9?** $#&8 | 2 2
 **5*111111111Y... $Y^+++ii)))))))))Y^+++Jsu   E !!D8  C4"D8 4
C>>D8 C>D8 E 8 EE B
J*)	J*2AH?9J*?J*AJ%J*%J*r?   c                   K   |                      |           d {V }|j        t          j        k    r-t	          d                    |j        |j                            t          t          |j                  S )Nz.Received message {}:{!r} is not WSMsgType.TEXT)	r   r   r   TEXTr   r   r   r   r<   r3   r?   r   s      r4   receive_strzWebSocketResponse.receive_str  sz      LL))))))))8y~%%@GGHch   
 C"""r6   c                   K   |                      |           d {V }|j        t          j        k    r t	          d|j         d|j        d          t          t          |j                  S )NzReceived message :z is not bytes)r   r   r   BINARYr   r   r   r   r  s      r4   receive_byteszWebSocketResponse.receive_bytes  sq      LL))))))))8y'''TTT38TTTUUUE38$$$r6   )loadsr?   r  c                T   K   |                      |           d {V } ||          S )Nr   )r  )r3   r  r?   r   s       r4   receive_jsonzWebSocketResponse.receive_json  s>       %%g%66666666uT{{r6   c                 $   K   t          d          )Nz"Cannot call .write() for websocket)r   )r3   r   s     r4   writezWebSocketResponse.write  s      ?@@@r6   c                     | S r1   r=   r2   s    r4   	__aiter__zWebSocketResponse.__aiter__  s    r6   c                    K   |                                   d {V }|j        t          j        t          j        t          j        fv rt          |S r1   )r   r   r   r   r   r   StopAsyncIteration)r3   r   s     r4   	__anext__zWebSocketResponse.__anext__	  sL      LLNN""""""8	):I<LMMM$$
r6   r   c                 L    | j         | j                             |           d S d S r1   )rO   set_exception)r3   r   s     r4   _cancelzWebSocketResponse._cancel  s.    <#L&&s+++++ $#r6   )r/   Nr1   )r6   )r/   r%   )<r7   r8   r9   _length_checkfloatr   r:   r   r<   intrK   rd   rl   rh   rp   r!   r   r{   r   r   r   rz   r|   r&   r   propertyr   r   r   rE   r   r   BaseExceptionr   r   ro   r   r   r   jsonr   r   r   r   r   r   r   rs   r   r   r  r  r  r   r
  r  r  r  r  __classcell__)ra   s   @r4   r%   r%   :   s       M
 +/%)#%+"* "* "* "* "%	"*
 "* "* E?"* C="* "* "* 
"* "* "* "* "* "*H& & & &      &5 5 5 5
[ 
5I 
 
 
 
 
 
S
"S
	!3d2	3S
 S
 S
 S
j +  %_8L2M        "+"+.1+;J+	+ + + +"2; 2> 2 2 2 2     X  HSM       X  !Xc] ! ! ! X! $    X7 73 7 7 7 7 7 78M2    ) )% )$ ) ) ) )
) )% )$ ) ) ) )G G3 G(4. GD G G G GF FU Fhtn FPT F F F F $(<
 "Z< < << 4.<
 < 
< < < <    )^cQU9 9 996;9JN9	9 9 9 9v(k (d ( ( ( (@ @Xe_ @	 @ @ @ @D ?C # # #HUO #s # # # # AE % % %huo % % % % % '+jT  #;CE?	   A A$ A A A A       ,= ,T , , , , , , , ,r6   r%   );ru   r   r   r   r  systypingr   r   r   r   r   r   attr	multidictr	   r   r   abcr   helpersr   r   httpr   r   r   r   r   r   r   r   r   r   r   logr   streamsr   r   typedefsr   r   web_exceptionsr   r    web_requestr!   web_responser"   version_infor   __all__r(   r  r;   sr&   r%   r=   r6   r4   <module>r,     s        



 > > > > > > > > > > > > > > > >  ! ! ! ! ! !       % % % % % % + + + + + + + +                                4 4 4 4 4 4 4 4 . . . . . . . . 9 9 9 9 9 9 9 9 $ $ $ $ $ $ ( ( ( ( ( (w##### )* 5: ) ) ) T$d333       43W, W, W, W, W, W, W, W, W, W,r6   