a
    |fD                     @   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)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 r0   HD:\Projects\storyit_web\backend\venv\Lib\site-packages\aiohttp/web_ws.py__bool__1   s    zWebSocketReady.__bool__N)__name__
__module____qualname__bool__annotations__r   strr2   r0   r0   r0   r1   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      $@NTr0   i  @ )timeoutreceive_timeout	autocloseautoping	heartbeat	protocolscompressmax_msg_size)	r9   r:   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 )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)	r/   r9   r:   r;   r<   r=   r>   r?   r@   	__class__r0   r1   rD   9   s.    
zWebSocketResponse.__init__r+   c                 C   s8   | j d ur| j   d | _ | jd ur4| j  d | _d S r-   )rW   cancelrU   r.   r0   r0   r1   _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]   rT   rM   r   _send_heartbeatrU   r.   r0   r0   r1   _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-   )rT   rI   rM   Zcreate_taskrG   pingrW   r\   r   _pong_not_receivedrV   r.   r0   r0   r1   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	transportrI   r   ABNORMAL_CLOSURErL   asyncioTimeoutErrorrO   closer.   r0   r0   r1   ra   }   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_startrC   prepare_post_startdrain)r/   rg   r*   writerZpayload_writerrZ   r0   r1   rj      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 r0   )r8   strip).0protor0   r0   r1   
<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?   ry   Zserver_notakeover)"headersgetr	   UPGRADElowerrq   r   formatZ
CONNECTIONZSEC_WEBSOCKET_PROTOCOLsplitrE   r   warningZSEC_WEBSOCKET_VERSIONZSEC_WEBSOCKET_KEYlenbase64	b64decodebinasciiError	b64encodehashlibsha1encoder   digestdecoder   ZSEC_WEBSOCKET_ACCEPTrX   ZSEC_WEBSOCKET_EXTENSIONSr   r   )r/   rg   rz   r*   Zreq_protocolsrs   versionkeyZ
accept_valresponse_headers
notakeoverr?   
extensionsZ
enabledextr0   r0   r1   
_handshake   s~    





zWebSocketResponse._handshakec                 C   sl   |j | _ | |\}}}}| d | j| |   || _|jj}|d usRJ t	|j|||d}||fS )NrA   )r?   r   )
rM   r   Z
set_statusrz   updateZforce_closerX   	_protocolrb   r   )r/   rg   rz   r*   r?   r   rb   rm   r0   r0   r1   ri      s    

zWebSocketResponse._pre_start)rg   r*   rm   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)rF   rG   r_   rM   r   r   rH   r*   
set_parserr   rY   rX   
keep_alive)r/   rg   r*   rm   r   r0   r0   r1   rk      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)rG   RuntimeErrorr   r   r#   )r/   rg   _r*   r0   r0   r1   can_prepare  s    
zWebSocketResponse.can_preparec                 C   s   | j S r-   )rI   r.   r0   r0   r1   closed  s    zWebSocketResponse.closedc                 C   s   | j S r-   )rL   r.   r0   r0   r1   
close_code  s    zWebSocketResponse.close_codec                 C   s   | j S r-   )rF   r.   r0   r0   r1   ws_protocol  s    zWebSocketResponse.ws_protocolc                 C   s   | j S r-   )rX   r.   r0   r0   r1   r?     s    zWebSocketResponse.compressc                 C   s   | j S r-   )rO   r.   r0   r0   r1   	exception!  s    zWebSocketResponse.exception    )messager,   c                    s(   | j d u rtd| j |I d H  d S NCall .prepare() first)rG   r   r`   r/   r   r0   r0   r1   r`   $  s    
zWebSocketResponse.pingc                    s(   | j d u rtd| j |I d H  d S r   )rG   r   pongr   r0   r0   r1   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?   )rG   r   
isinstancer8   	TypeErrortypesendr/   r   r?   r0   r0   r1   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   )	rG   r   r   bytes	bytearray
memoryviewr   r   r   r   r0   r0   r1   
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   r0   r0   r1   	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_sentrh   r   rf   r.   r0   r0   r1   	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sd| _z8| j ||I d H  | j	}|d usJ |
 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 rd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)rG   r   r]   rH   rN   rI   Z	feed_datar   rf   rh   rl   rd   CancelledErrorre   r   rc   rL   	ExceptionrO   rJ   async_timeoutr9   rP   readr   r   CLOSEr   )r/   r   r   readerrm   excmsgr0   r0   r1   rf   O  sV    
@
zWebSocketResponse.close)r9   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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(rq$|S )Nr   z+Concurrent call to receive() is not allowedr   zWebSocket connection is closed.T)r   )+rH   r   rM   rN   rI   rK   r%   r   rJ   r   Zcreate_futurer   r9   rQ   r   r_   r   rd   r   re   r   rc   rL   r   OKrf   r   r   CLOSEDr   r   ERRORr   rO   r   r   r   rR   CLOSINGZPINGrS   r   ZPONG)r/   r9   r   r   waiterr   r0   r0   r1   receive  sn    



:


"$zWebSocketResponse.receiver9   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   r8   r/   r9   r   r0   r0   r1   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   r0   r0   r1   receive_bytes  s    zWebSocketResponse.receive_bytes)loadsr9   )r   r9   r,   c                   s   | j |dI d H }||S )Nr   )r   )r/   r   r9   r   r0   r0   r1   receive_json  s    zWebSocketResponse.receive_json)r   r,   c                    s   t dd S )Nz"Cannot call .write() for websocket)r   )r/   r   r0   r0   r1   write  s    zWebSocketResponse.writec                 C   s   | S r-   r0   r.   r0   r0   r1   	__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   r0   r0   r1   	__anext__  s    zWebSocketResponse.__anext__)r   r,   c                 C   s   | j d ur| j | d S r-   )rH   Zset_exception)r/   r   r0   r0   r1   _cancel  s    
zWebSocketResponse._cancel)r   )r   )N)N)N)N):r3   r4   r5   Z_length_checkfloatr   r6   r   r8   intrD   r]   r_   r^   ra   r    r
   rj   r   r   r   ri   rk   r#   r   propertyr   r   r   r?   BaseExceptionr   r   r`   r   r   r   jsonr   r   r   r   r   r   r   rf   r   r   r   r   r   r   r   r   r   r   r   __classcell__r0   r0   rZ   r1   r"   5   s   $		U

 		7=
r"   )9rd   r   r   r   r   typingr   r   r   r   r   r   attrZ	multidictr   rn   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   r7   sr#   r"   r0   r0   r0   r1   <module>   s.   
4