a
     ÑOcøB  ã                   @   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mZmZmZm	Z	m
Z
 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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)m*Z* ddl+m,Z,m-Z- ddl.m/Z/ ddl0m1Z1 dZ2dZ3e(e4 e5d< ej6dddd�G dd„ dƒƒZ7G dd„ de1ƒZ8dS )é    N)ÚAnyÚ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)ÚFinalÚJSONDecoderÚJSONEncoder)ÚHTTPBadRequestÚHTTPException)ÚBaseRequest)ÚStreamResponse)ÚWebSocketResponseÚWebSocketReadyr   é   ÚTHRESHOLD_CONNLOST_ACCESST)Z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© r/   úE/var/www/html/gsl.tools/lib/python3.9/site-packages/aiohttp/web_ws.pyÚ__bool__1   s    zWebSocketReady.__bool__N)Ú__name__Ú
__module__Ú__qualname__ÚboolÚ__annotations__r   Ústrr1   r/   r/   r/   r0   r#   ,   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ee dœd)d*„ZdVe dd,œd-d.„Z!dWe dd,œd/d0„Z"dXeee dd1œd2d3„Z#dYe ee dd1œd4d5„Z$dZe%j&d6œe'ee e(dd7œd8d9„Z)ddœd:d;„Z*e+j,d+d<œe	e ed=œd>d?„Z-d[ee e.d@œdAdB„Z/ddCœee ed@œdDdE„Z0ddCœee e d@œdFdG„Z1e%j2ddHœe3ee e'dIœdJdK„Z4e ddLœdMdN„Z5d dœdOdP„Z6e.dœdQdR„Z7eddSœdTdU„Z8‡  Z9S )\r"   Fg      $@NTr/   i  @ )ÚtimeoutÚreceive_timeoutÚ	autocloseÚautopingÚ	heartbeatÚ	protocolsÚcompressÚmax_msg_size)	r8   r9   r:   r;   r<   r=   r>   r?   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 )Née   )Ú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)	r.   r8   r9   r:   r;   r<   r=   r>   r?   ©Ú	__class__r/   r0   rC   9   s.    
zWebSocketResponse.__init__r*   c                 C   s8   | j d ur| j  ¡  d | _ | jd ur4| j ¡  d | _d S r,   )rV   ÚcancelrT   r-   r/   r/   r0   Ú_cancel_heartbeat]   s    



z#WebSocketResponse._cancel_heartbeatc                 C   s8   |   ¡  | jd ur4| jd us J ‚t| j| j| jƒ| _d S r,   )r\   rS   rL   r   Ú_send_heartbeatrT   r-   r/   r/   r0   Ú_reset_heartbeatf   s    
ÿz"WebSocketResponse._reset_heartbeatc                 C   s\   | j d urX| jsX| jd usJ ‚| j | j ¡ ¡ | jd urD| j ¡  t| j	| j
| jƒ| _d S r,   )rS   rH   rL   Zcreate_taskrF   ÚpingrV   r[   r   Ú_pong_not_receivedrU   r-   r/   r/   r0   r]   o   s    

ÿz!WebSocketResponse._send_heartbeatc                 C   s>   | j d ur:| j jd ur:d| _tj| _t ¡ | _| j j 	¡  d S )NT)
Z_reqÚ	transportrH   r   ÚABNORMAL_CLOSURErK   ÚasyncioÚTimeoutErrorrN   Úcloser-   r/   r/   r0   r`   }   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 r,   )Ú_payload_writerÚ
_pre_startrB   ÚprepareÚ_post_startÚdrain)r.   rf   r)   ÚwriterZpayload_writerrY   r/   r0   ri   „   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 rºdd„ |tj	  
d	¡D ƒ}|D ]}|| jv r’|} qºq’t d
|| j¡ | tjd¡}|dvràt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�\}}
|�rÈt!|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 r/   )r7   Ústrip)Ú.0Úprotor/   r/   r0   Ú
<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)r>   rx   Zserver_notakeover)"ÚheadersÚgetr	   ÚUPGRADEÚlowerrp   r   ÚformatZ
CONNECTIONZSEC_WEBSOCKET_PROTOCOLÚsplitrD   r   ÚwarningZSEC_WEBSOCKET_VERSIONZSEC_WEBSOCKET_KEYÚlenÚbase64Ú	b64decodeÚbinasciiÚErrorÚ	b64encodeÚhashlibÚsha1Úencoder   ÚdigestÚdecoder   ZSEC_WEBSOCKET_ACCEPTrW   ZSEC_WEBSOCKET_EXTENSIONSr   r   )r.   rf   ry   r)   Zreq_protocolsrr   ÚversionÚkeyZ
accept_valÚresponse_headersÚ
notakeoverr>   Ú
extensionsZ
enabledextr/   r/   r0   Ú
_handshake�   s~    ÿ
ýÿ
ÿÿ
þ
ýÿýÿÿ

üzWebSocketResponse._handshakec                 C   sl   |j | _ |  |¡\}}}}|  d¡ | j |¡ |  ¡  || _|jj}|d usRJ ‚t	|j|||d�}||fS )Nr@   )r>   rŽ   )
rL   r�   Z
set_statusry   ÚupdateZforce_closerW   Ú	_protocolra   r   )r.   rf   ry   r)   r>   rŽ   ra   rl   r/   r/   r0   rh   å   s    

ÿzWebSocketResponse._pre_start)rf   r)   rl   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©r>   F)rE   rF   r^   rL   r   r’   rG   r)   Ú
set_parserr   rX   rW   Ú
keep_alive)r.   rf   r)   rl   r“   r/   r/   r0   rj   ö   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)rF   ÚRuntimeErrorr�   r   r#   )r.   rf   Ú_r)   r/   r/   r0   Úcan_prepare  s    
zWebSocketResponse.can_preparec                 C   s   | j S r,   )rH   r-   r/   r/   r0   Úclosed  s    zWebSocketResponse.closedc                 C   s   | j S r,   )rK   r-   r/   r/   r0   Ú
close_code  s    zWebSocketResponse.close_codec                 C   s   | j S r,   )rE   r-   r/   r/   r0   Úws_protocol  s    zWebSocketResponse.ws_protocolc                 C   s   | j S r,   )rW   r-   r/   r/   r0   r>     s    zWebSocketResponse.compressc                 C   s   | j S r,   )rN   r-   r/   r/   r0   Ú	exception!  s    zWebSocketResponse.exceptionó    )Úmessager+   c                 Ã   s(   | j d u rtdƒ‚| j  |¡I d H  d S ©NúCall .prepare() first)rF   r—   r_   ©r.   rŸ   r/   r/   r0   r_   $  s    
zWebSocketResponse.pingc                 Ã   s(   | j d u rtdƒ‚| j  |¡I d H  d S r    )rF   r—   Úpongr¢   r/   r/   r0   r£   )  s    
zWebSocketResponse.pong)Údatar>   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©Úbinaryr>   )rF   r—   Ú
isinstancer7   Ú	TypeErrorÚtypeÚsend©r.   r¤   r>   r/   r/   r0   Úsend_str/  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¥   )	rF   r—   r§   ÚbytesÚ	bytearrayÚ
memoryviewr¨   r©   rª   r«   r/   r/   r0   Ú
send_bytes6  s
    
zWebSocketResponse.send_bytes)Údumps)r¤   r>   r±   r+   c                Ã   s   | j ||ƒ|d�I d H  d S )Nr”   )r¬   )r.   r¤   r>   r±   r/   r/   r0   Ú	send_json=  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_sentrg   r—   re   r-   r/   r/   r0   Ú	write_eofF  s    
zWebSocketResponse.write_eof)ÚcoderŸ   )r´   rŸ   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�sîd| _z8| j  ||¡I d H  | j	}|d usŠJ ‚| 
¡ I d H  W nV tjtjfy¾   tj| _‚ Y n4 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  �qf1 I d H �s\0    Y  W nT tj�yˆ   tj| _‚ Y n6 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 dS d S )Nr¡   r   TF)rF   r—   r\   rG   rM   rH   Z	feed_datar   re   rg   rk   rc   ÚCancelledErrorrd   r   rb   rK   Ú	ExceptionrN   rI   Úasync_timeoutr8   rO   Úreadr©   r   ÚCLOSEr¤   )r.   r´   rŸ   Úreaderrl   ÚexcÚmsgr/   r/   r0   re   O  sV    
@
zWebSocketResponse.close)r8   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  qÌ1 I d H sÂ0    Y  |  ¡  W | j}t|dƒ d | _n| j}t|dƒ d | _0 W � nþ tjtjf�y0   tj| _‚ Y nÚ t�yf   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<|| _!d| _tj| _|  ¡ I d H  ttj|d ƒW  Y d }~S d }~0 0 |j"tj#k�rFd| _|j$| _| j�s | j%�r |  ¡ I d H  nZ|j"tj&k�r\d| _nD|j"tj'k�rˆ| j(�rˆ|  )|j$¡I d H  q$n|j"tj*k�r | j(�r q$|S )Nr¡   z+Concurrent call to receive() is not allowedr   zWebSocket connection is closed.T)r´   )+rG   r—   rL   rM   rH   rJ   r%   r   rI   r   Zcreate_futurer·   r8   rP   r¸   r^   r   rc   rµ   rd   r   rb   rK   r   ÚOKre   r   r   ÚCLOSEDr   r´   ÚERRORr¶   rN   r©   r¹   r¤   rQ   ÚCLOSINGZPINGrR   r£   ZPONG)r.   r8   r“   r¼   Úwaiterr»   r/   r/   r0   Úreceive†  sn    



:

þ
"$zWebSocketResponse.receive©r8   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   r7   ©r.   r8   r¼   r/   r/   r0   Ú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   ÚBINARYr¨   r¤   r   r­   rÄ   r/   r/   r0   Úreceive_bytesÍ  s    zWebSocketResponse.receive_bytes)Úloadsr8   )rÉ   r8   r+   c                Ã   s   | j |d�I d H }||ƒS )NrÃ   )rÅ   )r.   rÉ   r8   r¤   r/   r/   r0   Úreceive_jsonÓ  s    zWebSocketResponse.receive_json)r¤   r+   c                 Ã   s   t dƒ‚d S )Nz"Cannot call .write() for websocket)r—   )r.   r¤   r/   r/   r0   ÚwriteÙ  s    zWebSocketResponse.writec                 C   s   | S r,   r/   r-   r/   r/   r0   Ú	__aiter__Ü  s    zWebSocketResponse.__aiter__c                 Ã   s,   |   ¡ I d H }|jtjtjtjfv r(t‚|S r,   )rÂ   r©   r   r¹   rÀ   r¾   ÚStopAsyncIteration)r.   r¼   r/   r/   r0   Ú	__anext__ß  s    zWebSocketResponse.__anext__)r»   r+   c                 C   s   | j d ur| j  |¡ d S r,   )rG   Zset_exception)r.   r»   r/   r/   r0   Ú_cancelå  s    
zWebSocketResponse._cancel)rž   )rž   )N)N)N)N):r2   r3   r4   Z_length_checkÚfloatr   r5   r   r7   ÚintrC   r\   r^   r]   r`   r    r
   ri   r   r�   r   rh   rj   r#   r™   Úpropertyrš   r›   rœ   r>   ÚBaseExceptionr�   r­   r_   r£   r¬   r°   Újsonr±   r   r   r²   r³   r   r½   re   r   rÂ   rÅ   rÈ   rÉ   r   rÊ   rË   rÌ   rÎ   rÏ   Ú__classcell__r/   r/   rY   r0   r"   5   sŠ   öõ$		þUþ

 ýûú		7=
ÿþr"   )9rc   r�   rƒ   r†   rÔ   Útypingr   r   r   r   r   r·   ÚattrZ	multidictr   rm   r	   Úabcr
   Zhelpersr   r   Úhttpr   r   r   r   r   r   r   r   r   r   r   Úlogr   Zstreamsr   r   Ztypedefsr   r   r   Zweb_exceptionsr   r   Zweb_requestr    Zweb_responser!   Ú__all__r%   rÑ   r6   Úsr#   r"   r/   r/   r/   r0   Ú<module>   s.   
4