o
    `gW                     @   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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 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. ddl/m0Z0 ddl1m2Z2m3Z3 ddl4m5Z5m6Z6 ddl7m8Z8 ddl9m:Z: ej;dkrd dl Z<nd dl<Z<dZ=dZ>ee? e@d< ejAddddG dd dZBG dd de:ZCdS )    N)AnyFinalIterableOptionalTupleUnioncast)CIMultiDict   )hdrs)WebSocketDataQueue)DEFAULT_LIMIT)AbstractStreamWriter)WSMessageTypeError)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)_INTERNAL_RECEIVE_TYPES)	ws_logger)	EofStream)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)r0   self r7   I/var/www/html/propose/venv/lib/python3.10/site-packages/aiohttp/web_ws.py__bool__:      zWebSocketReady.__bool__N)__name__
__module____qualname__bool__annotations__r   strr9   r7   r7   r7   r8   r*   5   s   
 r*   c                       s~  e Zd ZU dZeed< dZee ed< dZ	ee
 ed< dZee ed< dZeed< dZeed< d	Zeed
< dZee ed< dZeej ed< dZeed< dZeejd  ed< dZee ed< dZeed< dZeej ed< dZeej ed< dZeej d  ed< dddddddde!d	dedee dededee de"e d ed!ed"ed#df fd$d%Z#dd&d'Z$dd(d)Z%dd*d+Z&dd,d-Z'dd0d1Z(dd2d3Z)d4ed#dfd5d6Z*dd7d8Z+d9e,d#e-f fd:d;Z.d9e,d#e/d<ee eef fd=d>Z0d9e,d#e/ee e
f fd?d@Z1d9e,dAee dBe
d#dfdCdDZ2d9e,d#e3fdEdFZ4e5d#efdGdHZ6e5d#ee fdIdJZ7e5d#ee fdKdLZ8e5d#e9eef fdMdNZ:ddOedPe;d#e;fdQdRZ<d#ee fdSdTZ=ddVe>d#dfdWdXZ?ddVe>d#dfdYdZZ@	ddVe>d[eAd ee d#dfd\d]ZBdd^ed ee d#dfd_d`ZCdd^e>d ee d#dfdadbZD	deEjFdcd^e;d ee ddeGd#dfdedfZHddgdhZIeJjKdUddidjedVe>dked#efdldmZLdjeJd#dfdndoZMdjeJd#dfdpdqZNddrdsZOddee d#ePfdtduZQddvdee d#efdwdxZRddvdee d#e>fdydzZSeEjTdd{d|eUdee d#e;fd}d~ZVd^e>d#dfddZWdddZXd#ePfddZYd4ed#dfddZZ  Z[S )r)   F_length_checkN_ws_protocol_writer_reader_closed_closingr   
_conn_lost_close_code_loop_waiting_close_wait
_exceptiong        _heartbeat_when_heartbeat_cb_pong_response_cb
_ping_taskg      $@Tr7   i  @ )	timeoutreceive_timeout	autocloseautoping	heartbeat	protocolscompressmax_msg_sizewriter_limitrQ   rR   rS   rT   rU   rV   rW   rX   rY   r2   c       	   
         sZ   t  jdd || _|| _|| _|| _|| _|| _|d ur"|d | _|| _	|| _
|	| _d S )Ne   )statusg       @)super__init__
_protocols_timeout_receive_timeout
_autoclose	_autoping
_heartbeat_pong_heartbeat	_compress_max_msg_size_writer_limit)
r6   rQ   rR   rS   rT   rU   rV   rW   rX   rY   	__class__r7   r8   r]   Q   s   

zWebSocketResponse.__init__c                 C   sD   |    | jd ur| j  d | _| jd ur | j  d | _d S d S r4   )_cancel_pong_response_cbrN   cancelrP   r5   r7   r7   r8   _cancel_heartbeatk   s   




z#WebSocketResponse._cancel_heartbeatc                 C   s"   | j d ur| j   d | _ d S d S r4   )rO   rk   r5   r7   r7   r8   rj   t   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+   )rc   rj   _req	_protocol_timeout_ceil_thresholdrI   timer   rM   rN   call_at_send_heartbeat)r6   reqtimeout_ceil_thresholdloopnowwhenr7   r7   r8   _reset_heartbeaty   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| _| jdtj}tjdkr[tj||dd}n||}| so|| _|| j d S | | d S )Nr+       )r'      T)ru   eager_start)rN   rI   rC   rp   rM   rq   rr   rm   rn   ro   r   rd   rj   _pong_not_receivedrO   
send_framer   PINGsysversion_infoasyncioTaskcreate_taskdonerP   add_done_callback_ping_task_done)r6   ru   rv   rs   rt   rw   coro	ping_taskr7   r7   r8   rr      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_exceptionrP   )r6   r   excr7   r7   r8   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 r4   )rm   	transportr   r   TimeoutErrorr5   r7   r7   r8   r|      s   z$WebSocketResponse._pong_not_receivedr   c                 C   sb   | j rdS |   | tj || _| jr+| js-| jdur/| j	t
tj|dd dS dS dS dS )z5Handle exceptions raised during ping/pong processing.Nr   )rE   _set_closed_set_code_close_transportr   ABNORMAL_CLOSURErL   rJ   rF   rD   	feed_datar   r   ERRORr6   r   r7   r7   r8   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)rE   rl   r5   r7   r7   r8   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 r4   )_payload_writer
_pre_startr\   prepare_post_startdrain)r6   r   r1   writerpayload_writerrh   r7   r8   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 r7   )r@   strip).0protor7   r7   r8   
<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)rW   r   server_notakeover)"headersgetr   UPGRADElowerr   r#   format
CONNECTIONSEC_WEBSOCKET_PROTOCOLsplitr^   r   warningSEC_WEBSOCKET_VERSIONSEC_WEBSOCKET_KEYlenbase64	b64decodebinasciiError	b64encodehashlibsha1encoder   digestdecoder	   SEC_WEBSOCKET_ACCEPTre   SEC_WEBSOCKET_EXTENSIONSr   r   )r6   r   r   r1   req_protocolsr   versionkey
accept_valresponse_headers
notakeoverrW   
extensions
enabledextr7   r7   r8   
_handshake   s   




zWebSocketResponse._handshakec                 C   sp   |j | _ | |\}}}}| d | j| |   || _|jj}|d us)J t	|j|||| j
d}||fS )NrZ   )rW   r   limit)rI   r   
set_statusr   updateforce_closere   rn   r   r   rg   )r6   r   r   r1   rW   r   r   r   r7   r7   r8   r   .  s    
zWebSocketResponse._pre_startr1   r   c                 C   sh   || _ || _|   | j}|d usJ t|jd|d| _|jt	| j| j
t| jd |jd d S )Ni   )ru   rW   F)rB   rC   rx   rI   r   rn   rD   r1   
set_parserr   rf   r>   re   
keep_alive)r6   r   r1   r   ru   r7   r7   r8   r   C  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)rC   RuntimeErrorr   r$   r*   )r6   r   _r1   r7   r7   r8   can_prepareV  s   

zWebSocketResponse.can_preparec                 C   r3   r4   )rE   r5   r7   r7   r8   closed`     zWebSocketResponse.closedc                 C   r3   r4   )rH   r5   r7   r7   r8   
close_coded  r   zWebSocketResponse.close_codec                 C   r3   r4   )rB   r5   r7   r7   r8   ws_protocolh  r   zWebSocketResponse.ws_protocolc                 C   r3   r4   )re   r5   r7   r7   r8   rW   l  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)rC   r   get_extra_info)r6   r   r   r   r   r7   r7   r8   r   p  s   z WebSocketResponse.get_extra_infoc                 C   r3   r4   )rL   r5   r7   r7   r8   r   }  r:   zWebSocketResponse.exceptionry   messagec                    .   | j d u r
td| j |tjI d H  d S NCall .prepare() first)rC   r   r}   r   r~   r6   r   r7   r7   r8   ping  s   
zWebSocketResponse.pingc                    r   r   )rC   r   r}   r   PONGr   r7   r7   r8   pong  s   
zWebSocketResponse.pongopcodec                    s.   | j du r
td| j |||I dH  dS )z Send a frame over the websocket.Nr   )rC   r   r}   )r6   r   r   rW   r7   r7   r8   r}     s   
zWebSocketResponse.send_framedatac                    sR   | j d u r
tdt|tstdt| | j j|dtj	|dI d H  d S )Nr   zdata argument must be str (%r)zutf-8r   )
rC   r   
isinstancer@   	TypeErrortyper}   r   r   TEXTr6   r   rW   r7   r7   r8   send_str  s   

zWebSocketResponse.send_strc                    sR   | j d u r
tdt|tttfstdt| | j j|t	j
|dI d H  d S )Nr   z#data argument must be byte-ish (%r)r   )rC   r   r   bytes	bytearray
memoryviewr   r   r}   r   BINARYr   r7   r7   r8   
send_bytes  s   
zWebSocketResponse.send_bytes)dumpsr   c                   s   | j |||dI d H  d S )Nr   )r   )r6   r   rW   r   r7   r7   r8   	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   closer5   r7   r7   r8   	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d | jI dH  | jr|   dS z;t| j4 I dH # 	 | I dH }|jtju r| 
|j 	 W d  I dH  W dS q1 I dH sw   Y  W dS  tjy   | 
tj   ty } z|| _| 
tj W Y d}~dS d}~ww )zClose websocket connection.Nr   FTr   ) rC   r   rE   r   r   r   r   r   CancelledErrorr   r   r   r   	ExceptionrL   rD   rJ   rI   rK   create_futurer   r   rF   _close_transportasync_timeoutrQ   r_   readr   r   CLOSEr   )r6   r   r   r   r   r   readermsgr7   r7   r8   r     sh   
zWebSocketResponse.closec                 C   s   d| _ || _|   dS )z6Set the close code and mark the connection as closing.TN)rF   rH   rl   r6   r   r7   r7   r8   _set_closing  s   zWebSocketResponse._set_closingc                 C   s   || _ |   dS )z+Set the close code and close the transport.N)rH   r   r  r7   r7   r8   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)rm   r   r   r5   r7   r7   r8   r     s   z"WebSocketResponse._close_transportc              
      s  | j d u r
td|p| j}	 | jrtd| jr,|  jd7  _| jtkr*tdtS | jr1t	S zXd| _zD|r`t
|4 I d H  | j  I d H }W d   I d H  n1 I d H sZw   Y  n| j  I d H }|   W d| _| jryt| jd  nd| _| jrt| jd  w w W nq 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"vr|S |j!tj#u r#| |j$ | js!| j%r!| jddI d H  |S |j!tj&u r2| tj |S |j!tj'u rG| j(rG| )|j$I d H  q|j!tj*u rS| j(rSq|S )	Nr   Tz+Concurrent call to receive() is not allowedr
   zWebSocket connection is closed.F)r   )r   )+rD   r   r`   rJ   rE   rG   r,   r   rF   r   r   rQ   r   rx   rK   r   r   r   r    r   OKrH   r   r   r   CLOSEDr   r   r   r   rL   r  r   r   r   r  r   ra   CLOSINGr~   rb   r   r   )r6   rQ   rR   r  r   r7   r7   r8   receive  s   


(
	zWebSocketResponse.receiverQ   c                   D   |  |I d H }|jtjurtd|j d|jdtt|jS )NReceived message :z is not WSMsgType.TEXT)r	  r   r   r   r   r   r   r@   r6   rQ   r  r7   r7   r8   receive_strF     zWebSocketResponse.receive_strc                   r  )Nr  r  z is not WSMsgType.BINARY)r	  r   r   r   r   r   r   r   r  r7   r7   r8   receive_bytesN  r  zWebSocketResponse.receive_bytes)loadsrQ   r  c                   s   | j |dI d H }||S )Nr
  )r  )r6   r  rQ   r   r7   r7   r8   receive_jsonV  s   zWebSocketResponse.receive_jsonc                    s
   t d)Nz"Cannot call .write() for websocket)r   )r6   r   r7   r7   r8   write\  s   zWebSocketResponse.writec                 C   s   | S r4   r7   r5   r7   r7   r8   	__aiter___  s   zWebSocketResponse.__aiter__c                    s.   |   I d H }|jtjtjtjfv rt|S r4   )r	  r   r   r  r  r  StopAsyncIteration)r6   r  r7   r7   r8   	__anext__b  s
   zWebSocketResponse.__anext__c                 C   s,   d| _ |   | jd urt| j| d S d S )NT)rF   rl   rD   r   r   r7   r7   r8   _cancelh  s
   
zWebSocketResponse._cancel)r2   N)r   r   r2   Nr4   )ry   )r2   r)   )\r;   r<   r=   rA   r>   r?   rB   r   r@   rC   r   rD   r   rE   rF   rG   intrH   rI   r   AbstractEventLooprJ   rK   FuturerL   BaseExceptionrM   floatrN   TimerHandlerO   rP   r   r   r   r]   rl   rj   rx   rr   r   r|   r   r   r%   r   r   r   r   r   r   r*   r   propertyr   r   r   r   rW   r   r   r   r   r   r   r   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__r7   r7   rh   r8   r)   >   s  
 	


	


#



U


	


	

7
J	

r)   )Dr   r   r   r   r   r   typingr   r   r   r   r   r   r   attr	multidictr	   r   r   _websocket.readerr   _websocket.writerr   abcr   client_exceptionsr   helpersr   r   r   httpr   r   r   r   r   r   r   r   r   r   r   http_websocketr   logr   streamsr    typedefsr!   r"   web_exceptionsr#   r$   web_requestr%   web_responser&   r   r   __all__r,   r  r?   sr*   r)   r7   r7   r7   r8   <module>   s>   
 $4

