o
    +ifJ                     @   s|  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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/m0Z0 ddl1m2Z2 ej3dkrd dl Z4nd dl4Z4dZ5dZ6ee7 e8d< ej9ddddG dd dZ:G dd de2Z;dS )    N)AnyFinalIterableOptionalTuplecast)CIMultiDict   )hdrs)AbstractStreamWriter)
call_laterset_exception
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                   @   s0   e Zd ZU eed< ee ed< defddZdS )r&   okprotocolreturnc                 C      | j S N)r,   self r3   G/var/www/html/corbot_env/lib/python3.10/site-packages/aiohttp/web_ws.py__bool__6      zWebSocketReady.__bool__N)__name__
__module____qualname__bool__annotations__r   strr5   r3   r3   r3   r4   r&   1   s   
 r&   c                       s  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dZ
dgddZdgddZdgddZdgddZdedef fddZdededeeef fdd Zdedeeef fd!d"Zded#ed$eddfd%d&Zdedefd'd(Zedefd)d*Zedee	 fd+d,Zedee fd-d.Zedefd/d0Zdhd1ed2edefd3d4Zdee  fd5d6Z!did8e"ddfd9d:Z#did8e"ddfd;d<Z$dhd=edee ddfd>d?Z%dhd=e"dee ddfd@dAZ&	dhe'j(dBd=edee dCe)ddfdDdEZ*dgdFdGZ+e,j-d7ddHdIe	d8e"dJedefdKdLZ.dIe,ddfdMdNZ/dIe,ddfdOdPZ0dgdQdRZ1dhdee de2fdSdTZ3ddUdee defdVdWZ4ddUdee de"fdXdYZ5e'j6ddZd[e7dee defd\d]Z8d=e"ddfd^d_Z9djd`daZ:de2fdbdcZ;dde ddfdedfZ<  Z=S )kr%   Fg      $@NTr3   i  @ )timeoutreceive_timeout	autocloseautoping	heartbeat	protocolscompressmax_msg_sizer=   r>   r?   r@   rA   rB   rC   rD   r.   c          	         s   t  jdd || _d | _d | _d | _d| _d| _d| _d | _	d | _
d | _d | _|| _|| _|| _|| _|| _d | _|d urC|d | _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)	r2   r=   r>   r?   r@   rA   rB   rC   rD   	__class__r3   r4   rH   >   s.   

zWebSocketResponse.__init__c                 C   s<   | j d ur| j   d | _ | jd ur| j  d | _d S d S r0   )r[   cancelrY   r1   r3   r3   r4   _cancel_heartbeatb   s   




z#WebSocketResponse._cancel_heartbeatc                 C   sT   |    | jd ur(| jd usJ t| j| j| j| jd ur!| jjjndd| _d S d S Nr'   )timeout_ceil_threshold)	ra   rX   rQ   r   _send_heartbeat_req	_protocol_timeout_ceil_thresholdrY   r1   r3   r3   r4   _reset_heartbeatk   s   


z"WebSocketResponse._reset_heartbeatc                 C   s|   | j d ur:| js<| jd usJ | j| j  | jd ur"| j  t| j	| j
| j| jd ur3| jjjndd| _d S d S d S rb   )rX   rM   rQ   create_taskrK   pingr[   r`   r   _pong_not_receivedrZ   re   rf   rg   r1   r3   r3   r4   rd   y   s   



z!WebSocketResponse._send_heartbeatc                 C   s>   | j d ur| j jd urd| _| tj t | _d S d S d S NT)	re   	transportrM   _set_code_close_transportr   ABNORMAL_CLOSUREasyncioTimeoutErrorrS   r1   r3   r3   r4   rk      s
   z$WebSocketResponse._pong_not_receivedrequestc                    s^   | j d ur	| j S | |\}}t |I d H }|d usJ | ||| | I d H  |S r0   )_payload_writer
_pre_startrG   prepare_post_startdrain)r2   rr   r-   writerpayload_writerr^   r3   r4   ru      s   
zWebSocketResponse.preparezCIMultiDict[str]c                 C   s  |j }d|tjd  krtd|tjdd|tjd vr3td|tjdd }tj	|v r]dd |tj	 
d	D }|D ]}|| jv rT|} n	qItd
|| j |tjd}|dvrptd| d|tj}z|rtt|dkrtd|dW n tjy   td|dd w tt| t   }ttjdtjdtj|i}	d}
d}| jr|tj}t |dd\}}
|rt!|d|
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                 S   s   g | ]}t | qS r3   )r<   strip).0protor3   r3   r4   
<listcomp>   s    
z0WebSocketResponse._handshake.<locals>.<listcomp>,u8   Client protocols %r don’t overlap server-known ones %r)1387zUnsupported version:    zHandshake error: Fr   T)isserver)rC   r   server_notakeover)"headersgetr
   UPGRADElowerr~   r   format
CONNECTIONSEC_WEBSOCKET_PROTOCOLsplitrI   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   )r2   rr   r   r-   req_protocolsr   versionkey
accept_valresponse_headers
notakeoverrC   
extensions
enabledextr3   r3   r4   
_handshake   s   




zWebSocketResponse._handshakec                 C   sl   |j | _ | |\}}}}| d | j| |   || _|jj}|d us)J t	|j|||d}||fS )NrE   )rC   r   )
rQ   r   
set_statusr   updateforce_closer\   rf   rm   r   )r2   rr   r   r-   rC   r   rm   rx   r3   r3   r4   rt      s   

zWebSocketResponse._pre_startr-   rx   c                 C   sd   || _ || _|   | j}|d usJ t|jd|d| _|jt	| j| j
| jd |jd d S )Ni   )looprC   F)rJ   rK   rh   rQ   r   rf   rL   r-   
set_parserr   r]   r\   
keep_alive)r2   rr   r-   rx   r   r3   r3   r4   rv     s   zWebSocketResponse._post_startc                 C   sP   | j d ur	tdz| |\}}}}W n ty"   tdd  Y S w td|S )NzAlready startedFT)rK   RuntimeErrorr   r    r&   )r2   rr   _r-   r3   r3   r4   can_prepare  s   

zWebSocketResponse.can_preparec                 C   r/   r0   )rM   r1   r3   r3   r4   closed     zWebSocketResponse.closedc                 C   r/   r0   )rP   r1   r3   r3   r4   
close_code#  r   zWebSocketResponse.close_codec                 C   r/   r0   )rJ   r1   r3   r3   r4   ws_protocol'  r   zWebSocketResponse.ws_protocolc                 C   r/   r0   )r\   r1   r3   r3   r4   rC   +  r   zWebSocketResponse.compressnamedefaultc                 C   s0   | j }|du r	|S |j}|du r|S |||S )z}Get optional transport information.

        If no value associated with ``name`` is found, ``default`` is returned.
        N)rK   rm   get_extra_info)r2   r   r   rx   rm   r3   r3   r4   r   /  s   z WebSocketResponse.get_extra_infoc                 C   r/   r0   )rS   r1   r3   r3   r4   	exception<  r6   zWebSocketResponse.exception    messagec                    *   | j d u r
td| j |I d H  d S NCall .prepare() first)rK   r   rj   r2   r   r3   r3   r4   rj   ?  s   
zWebSocketResponse.pingc                    r   r   )rK   r   pongr   r3   r3   r4   r   D  s   
zWebSocketResponse.pongdatac                    sJ   | j d u r
tdt|tstdt| | j j|d|dI d H  d S )Nr   zdata argument must be str (%r)FbinaryrC   )rK   r   
isinstancer<   	TypeErrortypesendr2   r   rC   r3   r3   r4   send_strJ  s   

zWebSocketResponse.send_strc                    sP   | j d u r
tdt|tttfstdt| | j j|d|dI d H  d S )Nr   z#data argument must be byte-ish (%r)Tr   )	rK   r   r   bytes	bytearray
memoryviewr   r   r   r   r3   r3   r4   
send_bytesQ  s   
zWebSocketResponse.send_bytes)dumpsr   c                   s   | j |||dI d H  d S )Nr   )r   )r2   r   rC   r   r3   r3   r4   	send_jsonX  s   zWebSocketResponse.send_jsonc                    s6   | j rd S | jd u rtd|  I d H  d| _ d S )NzResponse has not been startedT)	_eof_sentrs   r   closer1   r3   r3   r4   	write_eofa  s   

zWebSocketResponse.write_eof)coder   rw   r   rw   c             
      s   | j du r
td|   | j}|dusJ | jdur+| js+|td | jI dH  | jr0dS d| _z| j ||I dH  | j	}|dusGJ |rP|
 I dH  W n- tjtjfyc   | tj   ty~ } z|| _| tj W Y d}~dS d}~ww | jr|   dS | j}|dusJ z)t| j4 I dH  | I dH }W d  I dH  n1 I dH sw   Y  W n* tjy   | tj   ty } z|| _| tj W Y d}~dS d}~ww |jtjkr| |j dS | tj t | _dS )zClose websocket connection.Nr   r   FT)rK   r   ra   rL   rR   rM   	feed_datar   r   rs   rw   rp   CancelledErrorrq   rn   r   ro   	ExceptionrS   rN   _close_transportasync_timeoutr=   rT   readr   r   CLOSEr   )r2   r   r   rw   readerrx   excmsgr3   r3   r4   r   j  sj   
(
zWebSocketResponse.closec                 C   s   d| _ || _dS )z6Set the close code and mark the connection as closing.TN)rN   rP   r2   r   r3   r3   r4   _set_closing  s   
zWebSocketResponse._set_closingc                 C   s   || _ |   dS )z+Set the close code and close the transport.N)rP   r   r   r3   r3   r4   rn     s   z+WebSocketResponse._set_code_close_transportc                 C   s.   | j dur| j jdur| j j  dS dS dS )zClose the transport.N)re   rm   r   r1   r3   r3   r4   r     s   z"WebSocketResponse._close_transportc              
      s  | j d u r
td| j}|d usJ 	 | jd urtd| jr2|  jd7  _| jtkr0tdtS | jr7t	S zO|
 | _z;t|pD| j4 I d H  | j  I d H }W d   I d H  n1 I d H scw   Y  |   W | j}t|d d | _n| j}t|d d | _w W nq tjy     ty   tj| _|  I d H  ttjd d  Y S  ty } z|j| _| j|jdI d H  ttj|d W  Y d }~S d }~w ty } z|| _|  tj! |  I d H  ttj|d W  Y d }~S d }~ww |j"tj#kr|  |j$ | js| j%r| jddI d H  |S |j"tj&kr'|  tj |S |j"tj'kr<| j(r<| )|j$I d H  q|j"tj*krH| j(rHq|S )	Nr   Tz+Concurrent call to receive() is not allowedr	   zWebSocket connection is closed.)r   F)rw   )+rL   r   rQ   rR   rM   rO   r(   r   rN   r   create_futurer   r=   rU   r   rh   r   rp   rq   r   r   OKrP   r   r   r   CLOSEDr   r   ERRORr   rS   r   ro   r   r   r   rV   CLOSINGPINGrW   r   PONG)r2   r=   r   r   waiterr   r3   r3   r4   receive  sx   



(


	zWebSocketResponse.receiver=   c                   s>   |  |I d H }|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<   r2   r=   r   r3   r3   r4   receive_str  s   zWebSocketResponse.receive_strc                   sD   |  |I d H }|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   r3   r3   r4   receive_bytes  s
   zWebSocketResponse.receive_bytes)loadsr=   r   c                   s   | j |dI d H }||S )Nr   )r   )r2   r   r=   r   r3   r3   r4   receive_json  s   zWebSocketResponse.receive_jsonc                    s
   t d)Nz"Cannot call .write() for websocket)r   )r2   r   r3   r3   r4   write
  s   zWebSocketResponse.writec                 C   s   | S r0   r3   r1   r3   r3   r4   	__aiter__  s   zWebSocketResponse.__aiter__c                    s.   |   I d H }|jtjtjtjfv rt|S r0   )r   r   r   r   r   r   StopAsyncIteration)r2   r   r3   r3   r4   	__anext__  s
   zWebSocketResponse.__anext__r   c                 C   s$   d| _ | jd urt| j| d S d S rl   )rN   rL   r   )r2   r   r3   r3   r4   _cancel  s   
zWebSocketResponse._cancel)r.   Nr0   )r   )r.   r%   )>r7   r8   r9   _length_checkfloatr   r:   r   r<   intrH   ra   rh   rd   rk   r!   r   ru   r   r   r   rt   rv   r&   r   propertyr   r   r   rC   r   r   BaseExceptionr   r   rj   r   r   r   jsonr   r   r   r   r   r   r   r   rn   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r3   r3   r^   r4   r%   :   s    	

$
	


U




	

<
?


r%   )<rp   r   r   r   r   systypingr   r   r   r   r   r   attr	multidictr   r{   r
   abcr   helpersr   r   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%   r3   r3   r3   r4   <module>   s6   
  4

