o
    eD                     @   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< defddZdS )r#   okprotocolreturnc                 C      | j S N)r(   self r/   >D:\Projects\ConvertPro\env\Lib\site-packages\aiohttp/web_ws.py__bool__1      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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
d\ddZd\ddZd\ddZd\d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dee fd1d2Zd]d4e ddfd5d6Z!d]d4e ddfd7d8Z"d^d9edee ddfd:d;Z#d^d9e dee ddfd<d=Z$	d^e%j&d>d9e'dee d?e(ddfd@dAZ)d\dBdCZ*e+j,d3dDdEe	d4e defdFdGZ-d^dee de.fdHdIZ/ddJdee defdKdLZ0ddJdee de fdMdNZ1e%j2ddOdPe3dee de'fdQdRZ4d9e ddfdSdTZ5d_dUdVZ6de.fdWdXZ7dYeddfdZd[Z8  Z9S )`r"   Fg      $@NTr/   i  @ )timeoutreceive_timeout	autocloseautoping	heartbeat	protocolscompressmax_msg_sizer9   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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)	r.   r9   r:   r;   r<   r=   r>   r?   r@   	__class__r/   r0   rD   9   s.   

zWebSocketResponse.__init__c                 C   s<   | j d ur| j   d | _ | jd ur| j  d | _d S d S r,   )rW   cancelrU   r-   r/   r/   r0   _cancel_heartbeat]   s   




z#WebSocketResponse._cancel_heartbeatc                 C   s<   |    | jd ur| jd usJ t| j| j| j| _d S d S r,   )r]   rT   rM   r   _send_heartbeatrU   r-   r/   r/   r0   _reset_heartbeatf   s   

z"WebSocketResponse._reset_heartbeatc                 C   sd   | j d ur.| js0| jd usJ | j| j  | jd ur"| j  t| j	| j
| j| _d S d S d S r,   )rT   rI   rM   create_taskrG   pingrW   r\   r   _pong_not_receivedrV   r-   r/   r/   r0   r^   o   s   


z!WebSocketResponse._send_heartbeatc                 C   sF   | j d ur| j jd ur!d| _tj| _t | _| j j	  d S d S d S )NT)
Z_req	transportrI   r   ABNORMAL_CLOSURErL   asyncioTimeoutErrorrO   closer-   r/   r/   r0   rb   }   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 r,   )_payload_writer
_pre_startrC   prepare_post_startdrain)r.   rh   r)   writerZpayload_writerrZ   r/   r0   rk      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 )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/   )r8   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?   rz   Zserver_notakeover)"headersgetr	   UPGRADElowerrr   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.   rh   r{   r)   Zreq_protocolsrt   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s)J t	|j|||d}||fS )NrA   )r?   r   )
rM   r   Z
set_statusr{   updateZforce_closerX   	_protocolrc   r   )r.   rh   r{   r)   r?   r   rc   rn   r/   r/   r0   rj      s   

zWebSocketResponse._pre_startr)   rn   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.   rh   r)   rn   r   r/   r/   r0   rl      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)rG   RuntimeErrorr   r   r#   )r.   rh   _r)   r/   r/   r0   can_prepare  s   

zWebSocketResponse.can_preparec                 C   r+   r,   )rI   r-   r/   r/   r0   closed     zWebSocketResponse.closedc                 C   r+   r,   )rL   r-   r/   r/   r0   
close_code  r   zWebSocketResponse.close_codec                 C   r+   r,   )rF   r-   r/   r/   r0   ws_protocol  r   zWebSocketResponse.ws_protocolc                 C   r+   r,   )rX   r-   r/   r/   r0   r?     r   zWebSocketResponse.compressc                 C   r+   r,   )rO   r-   r/   r/   r0   	exception!  r2   zWebSocketResponse.exception    messagec                    *   | j d u r
td| j |I d H  d S NCall .prepare() first)rG   r   ra   r.   r   r/   r/   r0   ra   $  s   
zWebSocketResponse.pingc                    r   r   )rG   r   pongr   r/   r/   r0   r   )  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binaryr?   )rG   r   
isinstancer8   	TypeErrortypesendr.   r   r?   r/   r/   r0   send_str/  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   )	rG   r   r   bytes	bytearray
memoryviewr   r   r   r   r/   r/   r0   
send_bytes6  s   
zWebSocketResponse.send_bytes)dumpsr   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                    s6   | j rd S | jd u rtd|  I d H  d| _ d S )NzResponse has not been startedT)Z	_eof_sentri   r   rg   r-   r/   r/   r0   	write_eofF  s   

zWebSocketResponse.write_eof)coder   r   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sd| _z| j ||I d H  | j	}|d usEJ |
 I d H  W n) tjtjfy]   tj| _  tyv } 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 dS )Nr   r   TF)rG   r   r]   rH   rN   rI   	feed_datar   rg   ri   rm   re   CancelledErrorrf   r   rd   rL   	ExceptionrO   rJ   async_timeoutr9   rP   readr   r   CLOSEr   )r.   r   r   readerrn   excmsgr/   r/   r0   rg   O  sd   
(
zWebSocketResponse.closec              
      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 ny tjtjfy   tj| _  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|| _!d| _tj| _|  I d H  ttj|d W  Y d }~S d }~ww |j"tj#krd| _|j$| _| js| j%r|  I d H  |S |j"tj&kr+d| _|S |j"tj'kr@| j(r@| )|j$I d H  q|j"tj*krL| j(rLq|S )Nr   Tz+Concurrent call to receive() is not allowedr   zWebSocket connection is closed.)r   )+rH   r   rM   rN   rI   rK   r%   r   rJ   r   create_futurer   r9   rQ   r   r_   r   re   r   rf   r   rd   rL   r   OKrg   r   r   CLOSEDr   r   ERRORr   rO   r   r   r   rR   CLOSINGZPINGrS   r   ZPONG)r.   r9   r   r   waiterr   r/   r/   r0   receive  s~   



(


	zWebSocketResponse.receiver9   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   ZTEXTr   r   r   r   r8   r.   r9   r   r/   r/   r0   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   r/   r/   r0   receive_bytes  s
   zWebSocketResponse.receive_bytes)loadsr9   r   c                   s   | j |dI d H }||S )Nr   )r   )r.   r   r9   r   r/   r/   r0   receive_json  s   zWebSocketResponse.receive_jsonc                    s
   t d)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   c                 C   s   | j d ur| j | d S d S r,   )rH   set_exception)r.   r   r/   r/   r0   _cancel  s   
zWebSocketResponse._cancel)r*   N)r   r,   )r*   r"   ):r3   r4   r5   Z_length_checkfloatr   r6   r   r8   intrD   r]   r_   r^   rb   r    r
   rk   r   r   r   rj   rl   r#   r   propertyr   r   r   r?   BaseExceptionr   r   ra   r   r   r   jsonr   r   r   r   r   r   r   rg   r   r   r   r   r   r   r   r   r   r   r   __classcell__r/   r/   rZ   r0   r"   5   s    	

$
	
	

U




	 	7=


r"   )9re   r   r   r   r   typingr   r   r   r   r   r   attrZ	multidictr   ro   r	   abcr
   helpersr   r   httpr   r   r   r   r   r   r   r   r   r   r   logr   streamsr   r   Ztypedefsr   r   r   Zweb_exceptionsr   r   Zweb_requestr    Zweb_responser!   __all__r%   r   r7   sr#   r"   r/   r/   r/   r0   <module>   s0   
 4