U
    ;gT                     @   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)calculate_timeout_when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)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 r2   N/opt/bot/vods_filmes/script/venv/lib/python3.8/site-packages/aiohttp/web_ws.py__bool__6   s    zWebSocketReady.__bool__N)__name__
__module____qualname__bool__annotations__r   strr4   r2   r2   r2   r3   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dddddZddddZe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d0d1Z!eedd2d3Z"djee#e#d4d5d6Z$ee dd7d8Z%dke&dd:d;d<Z'dle&dd:d=d>Z(dmeee	 dd?d@dAZ)dne&ee	 dd?dBdCZ*doe+j,dDe#ee	 e-ddEdFdGZ.dddHdIZ/e0j1d9ddJe	e&eedKdLdMZ2e0ddNdOdPZ3e0ddNdQdRZ4dddSdTZ5dpee e6dUdVdWZ7ddXee edUdYdZZ8ddXee e&dUd[d\Z9e+j:dd]e;ee e#d^d_d`Z<e&ddadbdcZ=d ddddeZ>e6ddfdgZ?edddhdiZ@  ZAS )qr%   Fg      $@NTr2   i  @ )timeoutreceive_timeout	autocloseautoping	heartbeat	protocolscompressmax_msg_size)	r;   r<   r=   r>   r?   r@   rA   rB   r.   c          	         s   t  jdd || _d | _d | _d | _d| _d| _d| _d | _	d | _
d| _d | _d | _|| _|| _|| _|| _|| _d| _d | _|d k	r|d | _d | _|| _|| _d | _d S )Ne   )statusFr   g        g       @)super__init__
_protocols_ws_protocol_writer_reader_closed_closing
_conn_lost_close_code_loop_waiting_close_wait
_exception_timeout_receive_timeout
_autoclose	_autoping
_heartbeat_heartbeat_when_heartbeat_cb_pong_heartbeat_pong_response_cb	_compress_max_msg_size
_ping_task)	r1   r;   r<   r=   r>   r?   r@   rA   rB   	__class__r2   r3   rF   >   s4    
zWebSocketResponse.__init__r-   c                 C   s@   |    | jd k	r"| j  d | _| jd k	r<| j  d | _d S r/   )_cancel_pong_response_cbrY   cancelr^   r0   r2   r2   r3   _cancel_heartbeate   s    



z#WebSocketResponse._cancel_heartbeatc                 C   s   | j d k	r| j   d | _ d S r/   )r[   rb   r0   r2   r2   r3   ra   n   s    

z*WebSocketResponse._cancel_pong_response_cbc                 C   s|   | j d krd S |   | j}|d k	r,|jjnd}| j}|d k	sBt| }t|| j |}|| _	| j
d krx||| j| _
d S )Nr'   )rW   ra   _req	_protocol_timeout_ceil_thresholdrO   AssertionErrortimer   rX   rY   call_at_send_heartbeat)r1   reqtimeout_ceil_thresholdloopnowwhenr2   r2   r3   _reset_heartbeats   s    

z"WebSocketResponse._reset_heartbeatc                 C   s   d | _ | j}|d k	r| jd k	s"t| }|| jk rJ|| j| j| _ d S | j}|d k	r`|j	j
nd}t|| j|}|   ||| j| _tjdkrtj| j |dd}n|| j }| s|| _|| j n
| | d S )Nr'   )r#      T)rm   Zeager_start)rY   rO   rI   rg   rh   rX   ri   rj   rd   re   rf   r   rZ   ra   _pong_not_receivedr[   sysversion_infoasyncioTaskpingZcreate_taskdoner^   Zadd_done_callback_ping_task_done)r1   rm   rn   rk   rl   ro   Z	ping_taskr2   r2   r3   rj      s.    
 
z!WebSocketResponse._send_heartbeatzasyncio.Task[None])taskr.   c                 C   s(   |  s|  }r| | d| _dS )z*Callback for when the ping task completes.N)Z	cancelled	exception_handle_ping_pong_exceptionr^   )r1   rz   excr2   r2   r3   ry      s    
z!WebSocketResponse._ping_task_donec                 C   s(   | j d k	r$| j jd k	r$| t  d S r/   )rd   	transportr|   ru   TimeoutErrorr0   r2   r2   r3   rr      s    z$WebSocketResponse._pong_not_received)r}   r.   c                 C   sT   | j r
dS |   | tj || _| jrP| jsP| jdk	rP| j	t
tj|d dS )z5Handle exceptions raised during ping/pong processing.N)rK   _set_closed_set_code_close_transportr   ABNORMAL_CLOSURErR   rP   rL   rJ   	feed_datar   r   ERRORr1   r}   r2   r2   r3   r|      s    z-WebSocketResponse._handle_ping_pong_exceptionc                 C   s   d| _ |   dS )zdSet the connection to closed.

        Cancel any heartbeat timers and set the closed flag.
        TN)rK   rc   r0   r2   r2   r3   r      s    zWebSocketResponse._set_closed)requestr.   c                    s\   | j d k	r| j S | |\}}t |I d H }|d k	s<t| ||| | I d H  |S r/   )_payload_writer
_pre_startrE   preparerg   _post_startdrain)r1   r   r,   writerZpayload_writerr_   r2   r3   r      s    
zWebSocketResponse.preparezCIMultiDict[str]c                 C   s  |j }d|tjd  kr8td|tjdd|tjd krftd|tjdd }tj	|krdd |tj	 
d	D }|D ]}|| jkr|} qqtd
|| j |tjd}|dkrtd| d|tj}z.|rtt|dkrtd|dW n* tjk
rD   td|dd Y nX 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 r2   )r:   strip).0protor2   r2   r3   
<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)rA   r   Zserver_notakeover)"headersgetr
   UPGRADElowerr   r   formatZ
CONNECTIONZSEC_WEBSOCKET_PROTOCOLsplitrG   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   )r1   r   r   r,   Zreq_protocolsr   versionkeyZ
accept_valresponse_headers
notakeoverrA   
extensionsZ
enabledextr2   r2   r3   
_handshake   s    



     

zWebSocketResponse._handshakec                 C   sl   |j | _ | |\}}}}| d | j| |   || _|jj}|d k	sRt	t
|j|||d}||fS )NrC   )rA   r   )rO   r   Z
set_statusr   updateZforce_closer\   re   r~   rg   r   )r1   r   r   r,   rA   r   r~   r   r2   r2   r3   r   '  s    
   zWebSocketResponse._pre_start)r   r,   r   r.   c                 C   sd   || _ || _|   | j}|d k	s&tt|jd|d| _|j	t
| j| j| jd |jd d S )Ni   )rm   rA   F)rH   rI   rp   rO   rg   r   re   rJ   r,   
set_parserr   r]   r\   
keep_alive)r1   r   r,   r   rm   r2   r2   r3   r   8  s    zWebSocketResponse._post_startc                 C   sV   | j d k	rtdz| |\}}}}W n tk
rF   tdd  Y S X td|S d S )NzAlready startedFT)rI   RuntimeErrorr   r    r&   )r1   r   _r,   r2   r2   r3   can_prepareI  s    
zWebSocketResponse.can_preparec                 C   s   | j S r/   )rK   r0   r2   r2   r3   closedS  s    zWebSocketResponse.closedc                 C   s   | j S r/   )rN   r0   r2   r2   r3   
close_codeW  s    zWebSocketResponse.close_codec                 C   s   | j S r/   )rH   r0   r2   r2   r3   ws_protocol[  s    zWebSocketResponse.ws_protocolc                 C   s   | j S r/   )r\   r0   r2   r2   r3   rA   _  s    zWebSocketResponse.compress)namedefaultr.   c                 C   s0   | j }|dkr|S |j}|dkr$|S |||S )z}Get optional transport information.

        If no value associated with ``name`` is found, ``default`` is returned.
        N)rI   r~   get_extra_info)r1   r   r   r   r~   r2   r2   r3   r   c  s    z WebSocketResponse.get_extra_infoc                 C   s   | j S r/   )rR   r0   r2   r2   r3   r{   p  s    zWebSocketResponse.exception    )messager.   c                    s(   | j d krtd| j |I d H  d S NCall .prepare() first)rI   r   rw   r1   r   r2   r2   r3   rw   s  s    
zWebSocketResponse.pingc                    s(   | j d krtd| j |I d H  d S r   )rI   r   pongr   r2   r2   r3   r   x  s    
zWebSocketResponse.pong)datarA   r.   c                    sH   | j d k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binaryrA   )rI   r   
isinstancer:   	TypeErrortypesendr1   r   rA   r2   r2   r3   send_str~  s
    

zWebSocketResponse.send_strc                    sN   | j d k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   )	rI   r   r   bytes	bytearray
memoryviewr   r   r   r   r2   r2   r3   
send_bytes  s
    
zWebSocketResponse.send_bytes)dumps)r   rA   r   r.   c                   s   | j |||dI d H  d S )Nr   )r   )r1   r   rA   r   r2   r2   r3   	send_json  s    zWebSocketResponse.send_jsonc                    s4   | j r
d S | jd krtd|  I d H  d| _ d S )NzResponse has not been startedT)Z	_eof_sentr   r   closer0   r2   r2   r3   	write_eof  s    
zWebSocketResponse.write_eof)coder   r   )r   r   r   r.   c             
      s  | j dkrtd| jrdS |   z<| j ||I dH  | j}|dk	sLt|r^| I dH  W nb tj	tj
fk
r   | tj  Y n: tk
r } z|| _| tj W Y dS d}~X Y nX | j}|dk	st| jr| jdk	st| jdkst| j | _|t | jI dH  | jr0|   dS zlt| j4 I dH H | I dH }|jtjkrH| |j  W 5 Q I dH R  W dS qHW 5 Q I dH R X W n` tj	k
r   | tj  Y n< tk
r } z|| _| tj W Y dS d}~X Y nX dS )zClose websocket connection.Nr   FT)!rI   r   rK   r   r   r   rg   r   ru   ZCancelledErrorr   r   r   r   	ExceptionrR   rJ   rP   rO   rQ   Zcreate_futurer   r   rL   _close_transportasync_timeoutr;   rS   readr   r   CLOSEr   )r1   r   r   r   r   r}   readermsgr2   r2   r3   r     sT    

.zWebSocketResponse.close)r   r.   c                 C   s   d| _ || _|   dS )z6Set the close code and mark the connection as closing.TN)rL   rN   rc   r1   r   r2   r2   r3   _set_closing  s    zWebSocketResponse._set_closingc                 C   s   || _ |   dS )z+Set the close code and close the transport.N)rN   r   r   r2   r2   r3   r     s    z+WebSocketResponse._set_code_close_transportc                 C   s&   | j dk	r"| j jdk	r"| j j  dS )zClose the transport.N)rd   r~   r   r0   r2   r2   r3   r     s    z"WebSocketResponse._close_transport)r;   r.   c              
      st  | j d krtd|p| j}| jr*td| jrT|  jd7  _| jtkrPtdtS | jr^t	S z~d| _zV|rt|4 I d H  | j  I d H }W 5 Q I d H R X n| j  I d H }|   W 5 d| _| j
rt| j
d  X W  n tjk
r    Y n tk
r,   tj| _|  I d H  ttjd d  Y S  tk
r| } z2|j| _| j|jdI d H  ttj|d  W Y S d }~X Y nV tk
r } z6|| _| tj  |  I d H  ttj|d  W Y S d }~X Y nX |j!tj"kr| |j# | jsp| j$rp| jddI d H  n`|j!tj%kr,| tj nD|j!tj&krX| j'rX| (|j#I d H  qn|j!tj)krp| j'rpq|S )	Nr   z+Concurrent call to receive() is not allowedr	   zWebSocket connection is closed.TF)r   )r   )*rJ   r   rT   rP   rK   rM   r(   r   rL   r   rQ   r   r   r;   r   rp   ru   r   r   r   OKrN   r   r   r   CLOSEDr   r   r   r   rR   r   r   r   r   r   rU   CLOSINGZPINGrV   r   ZPONG)r1   r;   r<   r   r}   r2   r2   r3   receive  sd    


""$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:   r1   r;   r   r2   r2   r3   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   r2   r2   r3   receive_bytes4  s    zWebSocketResponse.receive_bytes)loadsr;   )r   r;   r.   c                   s   | j |dI d H }||S )Nr   )r   )r1   r   r;   r   r2   r2   r3   receive_json:  s    zWebSocketResponse.receive_json)r   r.   c                    s   t dd S )Nz"Cannot call .write() for websocket)r   )r1   r   r2   r2   r3   write@  s    zWebSocketResponse.writec                 C   s   | S r/   r2   r0   r2   r2   r3   	__aiter__C  s    zWebSocketResponse.__aiter__c                    s,   |   I d H }|jtjtjtjfkr(t|S r/   )r   r   r   r   r   r   StopAsyncIteration)r1   r   r2   r2   r3   	__anext__F  s    zWebSocketResponse.__anext__c                 C   s(   d| _ |   | jd k	r$t| j| d S )NT)rL   rc   rJ   r   r   r2   r2   r3   _cancelL  s    
zWebSocketResponse._cancel)N)r   )r   )N)N)N)N)Br5   r6   r7   Z_length_checkfloatr   r8   r   r:   intrF   rc   ra   rp   rj   ry   rr   BaseExceptionr|   r   r!   r   r   r   r   r   r   r   r&   r   propertyr   r   r   rA   r   r   r{   r   rw   r   r   r   jsonr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r2   r2   r_   r3   r%   :   s   '	"
U  

 	
    7E
  r%   )<ru   r   r   r   r   rs   typingr   r   r   r   r   r   attrZ	multidictr   r   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"   rt   r   __all__r(   r   r9   sr&   r%   r2   r2   r2   r3   <module>   s6     4
