a
    nJh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r0d 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< edddZdS )r&   okprotocolreturnc                 C   s   | j S N)r,   self r3   @/var/www/shaz/venv/lib/python3.9/site-packages/aiohttp/web_ws.py__bool__6   s    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eee eeee ee ee	dd	 fd	d
Z
ddddZddddZddddZddddZeed fddZeedeeef dddZeeeef dddZeeeddddZeeddd Zeedd!d"Zeee	 dd#d$Zeee dd%d&Zeedd'd(Zd`eeed)d*d+Zee  dd,d-Z!dae"dd/d0d1Z#dbe"dd/d2d3Z$dceee dd4d5d6Z%dde"ee dd4d7d8Z&dee'j(d9eee e)dd:d;d<Z*ddd=d>Z+e,j-d.dd?e	e"eed@dAdBZ.e,ddCdDdEZ/e,ddCdFdGZ0dddHdIZ1dfee e2dJdKdLZ3ddMee edJdNdOZ4ddMee e"dJdPdQZ5e'j6ddRe7ee edSdTdUZ8e"ddVdWdXZ9d ddYdZZ:e2dd[d\Z;e dd]d^d_Z<  Z=S )gr%   Fg      $@NTr3   i  @ )timeoutreceive_timeout	autocloseautoping	heartbeat	protocolscompressmax_msg_size)	r<   r=   r>   r?   r@   rA   rB   rC   r/   c          	         s   t  jdd || _d | _d | _d | _d| _d| _d| _d | _	d | _
d | _d | _|| _|| _|| _|| _|| _d | _|d ur|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?   r@   rA   rB   rC   	__class__r3   r4   rG   >   s.    
zWebSocketResponse.__init__r.   c                 C   s8   | j d ur| j   d | _ | jd ur4| j  d | _d S r0   )rZ   cancelrX   r1   r3   r3   r4   _cancel_heartbeatb   s    



z#WebSocketResponse._cancel_heartbeatc                 C   sP   |    | jd urL| jd us J t| j| j| j| jd urB| jjjndd| _d S Nr'   )Ztimeout_ceil_threshold)	r`   rW   rP   r   _send_heartbeat_req	_protocol_timeout_ceil_thresholdrX   r1   r3   r3   r4   _reset_heartbeatk   s    
z"WebSocketResponse._reset_heartbeatc                 C   st   | j d urp| jsp| jd usJ | j| j  | jd urD| j  t| j	| j
| j| jd urf| jjjndd| _d S ra   )rW   rL   rP   Zcreate_taskrJ   pingrZ   r_   r   _pong_not_receivedrY   rc   rd   re   r1   r3   r3   r4   rb   y   s    

z!WebSocketResponse._send_heartbeatc                 C   s6   | j d ur2| j jd ur2d| _| tj t | _d S NT)	rc   	transportrL   _set_code_close_transportr   ABNORMAL_CLOSUREasyncioTimeoutErrorrR   r1   r3   r3   r4   rh      s    z$WebSocketResponse._pong_not_received)requestr/   c                    s\   | j d ur| j S | |\}}t |I d H }|d us<J | ||| | I d H  |S r0   )_payload_writer
_pre_startrF   prepare_post_startdrain)r2   ro   r-   writerZpayload_writerr]   r3   r4   rr      s    
zWebSocketResponse.preparezCIMultiDict[str]c                 C   s  |j }d|tjd  kr8td|tjdd|tjd vrftd|tjdd }tj	|v rdd |tj	 
d	D }|D ]}|| jv r|} qqtd
|| j |tjd}|dvrtd| d|tj}z.|rtt|dkrtd|dW n( tjyB   td|dd Y n0 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 )NZ	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)Z1387zUnsupported version:    zHandshake error: Fr   T)isserver)rB   r   Zserver_notakeover)"headersgetr
   UPGRADElowerry   r   formatZ
CONNECTIONZSEC_WEBSOCKET_PROTOCOLsplitrH   r   warningZSEC_WEBSOCKET_VERSIONZSEC_WEBSOCKET_KEYlenbase64	b64decodebinasciiError	b64encodehashlibsha1encoder   digestdecoder   ZSEC_WEBSOCKET_ACCEPTr[   ZSEC_WEBSOCKET_EXTENSIONSr   r   )r2   ro   r   r-   Zreq_protocolsr{   versionkeyZ
accept_valresponse_headers
notakeoverrB   
extensionsZ
enabledextr3   r3   r4   
_handshake   s~    





zWebSocketResponse._handshakec                 C   sl   |j | _ | |\}}}}| d | j| |   || _|jj}|d usRJ t	|j|||d}||fS )NrD   )rB   r   )
rP   r   Z
set_statusr   updateZforce_closer[   rd   rj   r   )r2   ro   r   r-   rB   r   rj   ru   r3   r3   r4   rq      s    

zWebSocketResponse._pre_start)ro   r-   ru   r/   c                 C   sd   || _ || _|   | j}|d us&J t|jd|d| _|jt	| j| j
| jd |jd d S )Ni   )looprB   F)rI   rJ   rf   rP   r   rd   rK   r-   
set_parserr   r\   r[   
keep_alive)r2   ro   r-   ru   r   r3   r3   r4   rs     s    zWebSocketResponse._post_startc                 C   sT   | j d urtdz| |\}}}}W n tyD   tdd  Y S 0 td|S d S )NzAlready startedFT)rJ   RuntimeErrorr   r    r&   )r2   ro   _r-   r3   r3   r4   can_prepare  s    
zWebSocketResponse.can_preparec                 C   s   | j S r0   )rL   r1   r3   r3   r4   closed  s    zWebSocketResponse.closedc                 C   s   | j S r0   )rO   r1   r3   r3   r4   
close_code#  s    zWebSocketResponse.close_codec                 C   s   | j S r0   )rI   r1   r3   r3   r4   ws_protocol'  s    zWebSocketResponse.ws_protocolc                 C   s   | j S r0   )r[   r1   r3   r3   r4   rB   +  s    zWebSocketResponse.compress)namedefaultr/   c                 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)rJ   rj   get_extra_info)r2   r   r   ru   rj   r3   r3   r4   r   /  s    z WebSocketResponse.get_extra_infoc                 C   s   | j S r0   )rR   r1   r3   r3   r4   	exception<  s    zWebSocketResponse.exception    )messager/   c                    s(   | j d u rtd| j |I d H  d S NCall .prepare() first)rJ   r   rg   r2   r   r3   r3   r4   rg   ?  s    
zWebSocketResponse.pingc                    s(   | j d u rtd| j |I d H  d S r   )rJ   r   pongr   r3   r3   r4   r   D  s    
zWebSocketResponse.pong)datarB   r/   c                    sH   | 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binaryrB   )rJ   r   
isinstancer;   	TypeErrortypesendr2   r   rB   r3   r3   r4   send_strJ  s
    

zWebSocketResponse.send_strc                    sN   | j d u rtdt|tttfs2tdt| | j j|d|dI d H  d S )Nr   z#data argument must be byte-ish (%r)Tr   )	rJ   r   r   bytes	bytearray
memoryviewr   r   r   r   r3   r3   r4   
send_bytesQ  s
    
zWebSocketResponse.send_bytes)dumps)r   rB   r   r/   c                   s   | j |||dI d H  d S )Nr   )r   )r2   r   rB   r   r3   r3   r4   	send_jsonX  s    zWebSocketResponse.send_jsonc                    s4   | j r
d S | jd u rtd|  I d H  d| _ d S )NzResponse has not been startedT)Z	_eof_sentrp   r   closer1   r3   r3   r4   	write_eofa  s    
zWebSocketResponse.write_eof)coder   rt   )r   r   rt   r/   c             
      s  | j du rtd|   | j}|dus,J | jdurT| jsT|td | jI dH  | jr^dS d| _z<| j ||I dH  | j	}|dusJ |r|
 I dH  W n` tjtjfy   | tj  Y n: ty  } z || _| tj W Y d}~dS d}~0 0 | jr|   dS | j}|dus*J zVt| j4 I dH & | I dH }W d  I dH  q~1 I dH st0    Y  W n\ tjy   | tj  Y n: ty } z || _| tj W Y d}~dS d}~0 0 |jtjkr| |j dS | tj t | _dS )zClose websocket connection.Nr   r   FT)rJ   r   r`   rK   rQ   rL   Z	feed_datar   r   rp   rt   rm   ZCancelledErrorrn   rk   r   rl   	ExceptionrR   rM   _close_transportasync_timeoutr<   rS   readr   r   CLOSEr   )r2   r   r   rt   readerru   excmsgr3   r3   r4   r   j  sZ    
@
zWebSocketResponse.close)r   r/   c                 C   s   d| _ || _dS )z6Set the close code and mark the connection as closing.TN)rM   rO   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)rO   r   r   r3   r3   r4   rk     s    z+WebSocketResponse._set_code_close_transportc                 C   s&   | j dur"| j jdur"| j j  dS )zClose the transport.N)rc   rj   r   r1   r3   r3   r4   r     s    z"WebSocketResponse._close_transport)r<   r/   c              
      s  | j d u rtd| j}|d us$J | jd ur6td| jr`|  jd7  _| jtkr\tdtS | jrjt	S z|
 | _zvt|p| j4 I d H & | j  I d H }W d   I d H  q1 I d H s0    Y  |   W | j}t|d d | _n| j}t|d d | _0 W  n tjy"    Y n tyX   tj| _|  I d H  ttjd d  Y S  ty } z6|j| _| j|jdI d H  ttj|d W  Y d }~S d }~0  ty } z:|| _|  tj! |  I d H  ttj|d W  Y d }~S d }~0 0 |j"tj#kr8|  |j$ | js| j%r| jddI d H  n`|j"tj&krT|  tj nD|j"tj'kr| j(r| )|j$I d H  q$n|j"tj*kr| j(rq$|S )	Nr   z+Concurrent call to receive() is not allowedr	   zWebSocket connection is closed.T)r   F)rt   )+rK   r   rP   rQ   rL   rN   r(   r   rM   r   Zcreate_futurer   r<   rT   r   rf   r   rm   rn   r   r   OKrO   r   r   r   CLOSEDr   r   ERRORr   rR   r   rl   r   r   r   rU   CLOSINGZPINGrV   r   ZPONG)r2   r<   r   r   waiterr   r3   r3   r4   receive  sh    



:


"$zWebSocketResponse.receiver<   c                   s<   |  |I d H }|jtjkr0td|j|jtt|jS )Nz.Received message {}:{!r} is not WSMsgType.TEXT)	r   r   r   ZTEXTr   r   r   r   r;   r2   r<   r   r3   r3   r4   receive_str  s    zWebSocketResponse.receive_strc                   sB   |  |I d H }|jtjkr6td|j d|jdtt|jS )NzReceived message :z is not bytes)r   r   r   ZBINARYr   r   r   r   r   r3   r3   r4   receive_bytes  s    zWebSocketResponse.receive_bytes)loadsr<   )r   r<   r/   c                   s   | j |dI d H }||S )Nr   )r   )r2   r   r<   r   r3   r3   r4   receive_json  s    zWebSocketResponse.receive_json)r   r/   c                    s   t dd S )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   r/   c                 C   s    d| _ | jd urt| j| d S ri   )rM   rK   r   )r2   r   r3   r3   r4   _cancel  s    
zWebSocketResponse._cancel)N)r   )r   )N)N)N)N)>r6   r7   r8   Z_length_checkfloatr   r9   r   r;   intrG   r`   rf   rb   rh   r!   r   rr   r   r   r   rq   rs   r&   r   propertyr   r   r   rB   r   r   BaseExceptionr   r   rg   r   r   r   jsonr   r   r   r   r   r   r   r   rk   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r3   r3   r]   r4   r%   :   s   $	U

 	
<?
r%   )<rm   r   r   r   r   systypingr   r   r   r   r   r   attrZ	multidictr   rv   r
   abcr   Zhelpersr   r   r   httpr   r   r   r   r   r   r   r   r   r   r   logr   streamsr   r   Ztypedefsr   r   Zweb_exceptionsr   r    Zweb_requestr!   Zweb_responser"   version_infor   __all__r(   r   r:   sr&   r%   r3   r3   r3   r4   <module>   s4   
 4
