o
    RhT                     @   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rd 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)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 r3   P/home/air/sanwanet/backup_V2/venv/lib/python3.10/site-packages/aiohttp/web_ws.py__bool__6      zWebSocketReady.__bool__N)__name__
__module____qualname__bool__annotations__r   strr5   r3   r3   r3   r4   r&   1   s   
 r&   c                       sJ  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
dqddZdqddZdqddZdqddZdrddZdqdd Zd!eddfd"d#Zdqd$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d0d1Zd&edefd2d3Zedefd4d5Zedee	 fd6d7Z edee fd8d9Z!edefd:d;Z"dsd<ed=e#de#fd>d?Z$dee fd@dAZ%dtdCe&ddfdDdEZ'dtdCe&ddfdFdGZ(dsdHedee ddfdIdJZ)dsdHe&dee ddfdKdLZ*	dse+j,dMdHe#dee dNe-ddfdOdPZ.dqdQdRZ/e0j1dBddSdTe	dCe&dUedefdVdWZ2dTe0ddfdXdYZ3dTe0ddfdZd[Z4dqd\d]Z5dsdee de6fd^d_Z7dd`dee defdadbZ8dd`dee de&fdcddZ9e+j:ddedfe;dee de#fdgdhZ<dHe&ddfdidjZ=dudkdlZ>de6fdmdnZ?d!eddfdodpZ@  ZAS )vr%   Fg      $@NTr3   i  @ )timeoutreceive_timeout	autocloseautoping	heartbeat	protocolscompressmax_msg_sizer=   r>   r?   r@   rA   rB   rC   rD   r.   c          	         s   t  jdd || _d | _d | _d | _d| _d| _d| _d | _	d | _
d| _d | _d | _|| _|| _|| _|| _|| _d| _d | _|d urI|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)	r2   r=   r>   r?   r@   rA   rB   rC   rD   	__class__r3   r4   rH   >   s4   

zWebSocketResponse.__init__c                 C   sD   |    | jd ur| j  d | _| jd ur | j  d | _d S d S r0   )_cancel_pong_response_cbr[   cancelr`   r1   r3   r3   r4   _cancel_heartbeate   s   




z#WebSocketResponse._cancel_heartbeatc                 C   s"   | j d ur| j   d | _ d S d S r0   )r]   rd   r1   r3   r3   r4   rc   n   s   


z*WebSocketResponse._cancel_pong_response_cbc                 C   s   | j d u rd S |   | j}|d ur|jjnd}| j}|d us!J | }t|| j |}|| _| j	d u r>|
|| j| _	d S d S )Nr'   )rY   rc   _req	_protocol_timeout_ceil_thresholdrQ   timer   rZ   r[   call_at_send_heartbeat)r2   reqtimeout_ceil_thresholdloopnowwhenr3   r3   r4   _reset_heartbeats   s   

z"WebSocketResponse._reset_heartbeatc                 C   s   d | _ | j}|d ur| jd usJ | }|| jk r%|| j| j| _ d S | j}|d ur0|jj	nd}t
|| j|}|   ||| j| _tjdkrVtj| j |dd}n|| j }| sm|| _|| j d S | | d S )Nr'   )r#      T)rn   eager_start)r[   rQ   rK   ri   rZ   rj   rk   rf   rg   rh   r   r\   rc   _pong_not_receivedr]   sysversion_infoasyncioTaskpingcreate_taskdoner`   add_done_callback_ping_task_done)r2   rn   ro   rl   rm   rp   	ping_taskr3   r3   r4   rk      s,   

z!WebSocketResponse._send_heartbeattaskasyncio.Task[None]c                 C   s(   |  s|  }r| | d| _dS )z*Callback for when the ping task completes.N)	cancelled	exception_handle_ping_pong_exceptionr`   )r2   r   excr3   r3   r4   r}      s   

z!WebSocketResponse._ping_task_donec                 C   s0   | j d ur| j jd ur| t  d S d S d S r0   )rf   	transportr   rw   TimeoutErrorr1   r3   r3   r4   rt      s   z$WebSocketResponse._pong_not_receivedr   c                 C   s`   | j rdS |   | tj || _| jr*| js,| jdur.| j	t
tj|d dS dS dS dS )z5Handle exceptions raised during ping/pong processing.N)rM   _set_closed_set_code_close_transportr   ABNORMAL_CLOSURErT   rR   rN   rL   	feed_datar   r   ERRORr2   r   r3   r3   r4   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)rM   re   r1   r3   r3   r4   r      s   zWebSocketResponse._set_closedrequestc                    s^   | j d ur	| j S | |\}}t |I d H }|d usJ | ||| | I d H  |S r0   )_payload_writer
_pre_startrG   prepare_post_startdrain)r2   r   r-   writerpayload_writerra   r3   r4   r      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 )N	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)1387zUnsupported version:    zHandshake error: Fr   T)isserver)rC   r   server_notakeover)"headersgetr
   UPGRADElowerr   r   format
CONNECTIONSEC_WEBSOCKET_PROTOCOLsplitrI   r   warningSEC_WEBSOCKET_VERSIONSEC_WEBSOCKET_KEYlenbase64	b64decodebinasciiError	b64encodehashlibsha1encoder   digestdecoder   SEC_WEBSOCKET_ACCEPTr^   SEC_WEBSOCKET_EXTENSIONSr   r   )r2   r   r   r-   req_protocolsr   versionkey
accept_valresponse_headers
notakeoverrC   
extensions
enabledextr3   r3   r4   
_handshake   s   




zWebSocketResponse._handshakec                 C   sl   |j | _ | |\}}}}| d | j| |   || _|jj}|d us)J t	|j|||d}||fS )NrE   )rC   r   )
rQ   r   
set_statusr   updateforce_closer^   rg   r   r   )r2   r   r   r-   rC   r   r   r   r3   r3   r4   r   '  s   

zWebSocketResponse._pre_startr-   r   c                 C   sd   || _ || _|   | j}|d usJ t|jd|d| _|jt	| j| j
| jd |jd d S )Ni   )rn   rC   F)rJ   rK   rq   rQ   r   rg   rL   r-   
set_parserr   r_   r^   
keep_alive)r2   r   r-   r   rn   r3   r3   r4   r   8  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)rK   RuntimeErrorr   r    r&   )r2   r   _r-   r3   r3   r4   can_prepareI  s   

zWebSocketResponse.can_preparec                 C   r/   r0   )rM   r1   r3   r3   r4   closedS     zWebSocketResponse.closedc                 C   r/   r0   )rP   r1   r3   r3   r4   
close_codeW  r   zWebSocketResponse.close_codec                 C   r/   r0   )rJ   r1   r3   r3   r4   ws_protocol[  r   zWebSocketResponse.ws_protocolc                 C   r/   r0   )r^   r1   r3   r3   r4   rC   _  r   zWebSocketResponse.compressnamedefaultc                 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)rK   r   get_extra_info)r2   r   r   r   r   r3   r3   r4   r   c  s   z WebSocketResponse.get_extra_infoc                 C   r/   r0   )rT   r1   r3   r3   r4   r   p  r6   zWebSocketResponse.exception    messagec                    *   | j d u r
td| j |I d H  d S NCall .prepare() first)rK   r   ry   r2   r   r3   r3   r4   ry   s  s   
zWebSocketResponse.pingc                    r   r   )rK   r   pongr   r3   r3   r4   r   x  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binaryrC   )rK   r   
isinstancer<   	TypeErrortypesendr2   r   rC   r3   r3   r4   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   )	rK   r   r   bytes	bytearray
memoryviewr   r   r   r   r3   r3   r4   
send_bytes  s   
zWebSocketResponse.send_bytes)dumpsr   c                   s   | j |||dI d H  d S )Nr   )r   )r2   r   rC   r   r3   r3   r4   	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)	_eof_sentr   r   closer1   r3   r3   r4   	write_eof  s   

zWebSocketResponse.write_eof)coder   r   r   r   c             
      s  | j du r
td| jrdS |   z| j ||I dH  | j}|dus'J |r0| I dH  W n- tjtj	fyC   | 
tj   ty^ } z|| _| 
tj W Y d}~dS d}~ww | j}|dushJ | jr| jdusrJ | jdu syJ | j | _|t | jI dH  | jr|   dS 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u r| 
|j dS | 
tj t	 | _dS )zClose websocket connection.Nr   FT) rK   r   rM   r   r   r   r   rw   CancelledErrorr   r   r   r   	ExceptionrT   rL   rR   rQ   rS   create_futurer   r   rN   _close_transportasync_timeoutr=   rU   readr   r   CLOSEr   )r2   r   r   r   r   r   readermsgr3   r3   r4   r     sj   

(
zWebSocketResponse.closec                 C   s   d| _ || _|   dS )z6Set the close code and mark the connection as closing.TN)rN   rP   re   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)rP   r   r   r3   r3   r4   r     s   z+WebSocketResponse._set_code_close_transportc                 C   s.   | j dur| j jdur| j j  dS dS dS )zClose the transport.N)rf   r   r   r1   r3   r3   r4   r     s   z"WebSocketResponse._close_transportc              
      s  | j d u r
td| j}|d usJ |p| j}	 | jr td| jr5|  jd7  _| jtkr3tdtS | j	r:t
S zXd| _zD|rit|4 I d H  | j  I d H }W d   I d H  n1 I d H scw   Y  n| j  I d H }|   W d| _| jrt| jd  nd| _| jrt| jd  w w W nr tjy     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|| _|  tj! |  I d H  ttj|d W  Y d }~S d }~ww |j"tj#u r%|  |j$ | js#| j%r#| jddI d H  |S |j"tj&u r4|  tj |S |j"tj'u rI| j(rI| )|j$I d H  q|j"tj*u rU| j(rUq|S )	Nr   Tz+Concurrent call to receive() is not allowedr	   zWebSocket connection is closed.F)r   )r   )+rL   r   rQ   rV   rR   rM   rO   r(   r   rN   r   r   r=   r   rq   rS   r   rw   r   r   r   OKrP   r   r   r   CLOSEDr   r   r   r   rT   r   r   r   r   r   rW   CLOSINGPINGrX   r   PONG)r2   r=   rn   r>   r   r   r3   r3   r4   receive  s   


(
	zWebSocketResponse.receiver=   c                   s>   |  |I d H }|jtjurtd|j|jtt|jS )Nz.Received message {}:{!r} is not WSMsgType.TEXT)	r   r   r   TEXTr   r   r   r   r<   r2   r=   r   r3   r3   r4   receive_str0  s   zWebSocketResponse.receive_strc                   sD   |  |I d H }|jtju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  r3   r3   r4   receive_bytes:  s
   zWebSocketResponse.receive_bytes)loadsr=   r  c                   s   | j |dI d H }||S )Nr   )r  )r2   r  r=   r   r3   r3   r4   receive_json@  s   zWebSocketResponse.receive_jsonc                    s
   t d)Nz"Cannot call .write() for websocket)r   )r2   r   r3   r3   r4   writeF  s   zWebSocketResponse.writec                 C   s   | S r0   r3   r1   r3   r3   r4   	__aiter__I  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__L  s
   zWebSocketResponse.__anext__c                 C   s,   d| _ |   | jd urt| j| d S d S )NT)rN   re   rL   r   r   r3   r3   r4   _cancelR  s
   
zWebSocketResponse._cancel)r.   N)r   r   r.   Nr0   )r   )r.   r%   )Br7   r8   r9   _length_checkfloatr   r:   r   r<   intrH   re   rc   rq   rk   r}   rt   BaseExceptionr   r   r!   r   r   r   r   r   r   r   r&   r   propertyr   r   r   rC   r   r   r   r   ry   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__r3   r3   ra   r4   r%   :   s    	

'
	


"



U




	

;
G


r%   )<rw   r   r   r   r  ru   typingr   r   r   r   r   r   attr	multidictr   r   r
   abcr   helpersr   r   r   httpr   r   r   r   r   r   r   r   r   r   r   logr   streamsr   r   typedefsr   r   web_exceptionsr   r    web_requestr!   web_responser"   rv   r   __all__r(   r  r;   sr&   r%   r3   r3   r3   r4   <module>   s6   
  4

