o
    ùT·jO*  ã                   @  sF  d dl mZ d dlZd dlZd dlZd dl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mZ ddlmZmZ dd	lmZ d
dlmZmZ eeejf Zeeejf Zejg eje f Zejegej d f Z!ejeee!gej d f Z"G dd„ de#ƒZ$G dd„ de$ƒZ%G dd„ de$ƒZ&G dd„ dƒZ'G dd„ deƒZ(dS )é    )ÚannotationsN)ÚTracebackType)ÚStapledObjectStream)ÚCloseReasoné   )ÚRequestÚResponse)ÚASGITransportÚ_ASGIApp)ÚAsyncByteStreamé   )ÚWebSocketDisconnectÚWebSocketUpgradeError©NNNc                   @  s   e Zd ZdS )ÚASGIWebSocketTransportErrorN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú_/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/httpx2/websockets/_transport.pyr      s    r   c                   @  ó   e Zd Zddd„ZdS )	ÚUnhandledASGIMessageTypeÚmessageÚMessageÚreturnÚNonec                 C  ó
   || _ d S ©N)r   ©Úselfr   r   r   r   Ú__init__   ó   
z!UnhandledASGIMessageType.__init__N©r   r   r   r   ©r   r   r   r    r   r   r   r   r      ó    r   c                   @  r   )	ÚUnhandledWebSocketEventÚeventúwsproto.events.Eventr   r   c                 C  r   r   )r&   )r   r&   r   r   r   r    #   r!   z UnhandledWebSocketEvent.__init__N)r&   r'   r   r   r#   r   r   r   r   r%   "   r$   r%   c                   @  sz   e Zd Z	d1d2dd„Zd3dd„Zd4dd„Zd5d6d d!„Zd5d7d#d$„Zd8d%d&„Zd9d)d*„Z	d5d:d+d,„Z
d8d-d.„Zd;d/d0„ZdS )<ÚASGIWebSocketAsyncNetworkStreamç      ð?ÚappÚASGIAppÚscopeÚScopeÚ
task_groupúanyio.abc.TaskGroupÚinitial_receive_timeoutÚfloatr   r   c                 C  sx   || _ || _ttjt tjd�Ž | _ttjt tjd�Ž | _	|| _
|| _t tjj¡| _| j |d |d ¡ d| _d S )N)Úmax_buffer_sizeÚheadersÚpathF)r*   r,   r   ÚanyioÚcreate_memory_object_streamr   ÚmathÚinfÚ_receive_queueÚ_send_queueÚ_task_groupÚ_initial_receive_timeoutÚwsprotoÚWSConnectionÚConnectionTypeÚSERVERÚ
connectionÚinitiate_upgrade_connectionÚ	_aentered)r   r*   r,   r.   r0   r   r   r   r    (   s   
z(ASGIWebSocketAsyncNetworkStream.__init__ú-tuple[ASGIWebSocketAsyncNetworkStream, bytes]c                 Ã  sš  �| j rtdƒ‚d| _ | j | j¡ t ¡ 4 I d H š¦}| | j¡ |  	ddi¡I d H  z|  
| j¡I d H }W n tyG } ztdƒ|‚d }~ww |d dkr_| ¡ I d H  t|d | d¡ƒ‚|d d	kr¡|d
 }|d }g }	 |  
¡ I d H }|d dksJ ‚| |d ¡ | dd¡s�nqp| ¡ I d H  tt||d |¡d�ƒ‚|d dks©J ‚| |  |¡f}| ¡ | _W d   ƒI d H  |S 1 I d H sÆw   Y  |S )NzECannot use ASGIWebSocketAsyncNetworkStream in a context manager twiceTÚtypezwebsocket.connectzPWebSocket didn't accept the connection in time. Did you forget to call accept()?úwebsocket.closeÚcodeÚreasonzwebsocket.http.response.startÚstatusr3   zwebsocket.http.response.bodyÚbodyÚ	more_bodyFó    )r3   Úcontentzwebsocket.accept)rC   ÚRuntimeErrorr;   Ú
start_soonÚ_runÚ
contextlibÚAsyncExitStackÚpush_async_callbackÚacloseÚsendÚreceiver<   ÚTimeoutErrorr   ÚgetÚappendr   r   ÚjoinÚ_build_accept_responseÚpop_allÚ_exit_stack)r   Ústackr   ÚeÚstatus_coder3   rJ   Úretvalr   r   r   Ú
__aenter__9   sR   €ÿþ€ÿûß"Þ"z*ASGIWebSocketAsyncNetworkStream.__aenter__Úexc_typeútype[BaseException] | NoneÚexc_valúBaseException | NoneÚexc_tbúTracebackType | Noneúbool | Nonec                 Ã  s   �| j  |||¡I d H S r   )r]   Ú	__aexit__©r   rc   re   rg   r   r   r   rj   d   s   €z)ASGIWebSocketAsyncNetworkStream.__aexit__NÚ	max_bytesÚintÚtimeoutúfloat | NoneÚbytesc                 Ã  sœ   �| j |d�I d H }|d }|dvrt|ƒ‚|dkr9| d¡}|d ur)tj |¡}| d¡}|d ur8tj |¡}n|dkrHtj |d |d	 ¡}| j 	|¡S )
N)rn   rE   >   úwebsocket.sendrF   rq   Útextrp   rF   rG   rH   )
rV   r   rX   r=   ÚeventsÚTextMessageÚBytesMessageÚCloseConnectionrA   rU   )r   rl   rn   r   rE   Údata_strr&   Ú
data_bytesr   r   r   Úreadl   s    €

€z$ASGIWebSocketAsyncNetworkStream.readÚbufferc                 Ã  s´   �| j  |¡ | j  ¡ D ]K}t|tjjƒrqt|tjjƒr,|  d|j|j	dœ¡I d H  qt|tjj
ƒr@|  d|jdœ¡I d H  qt|tjjƒrT|  d|jdœ¡I d H  qt|ƒ‚d S )Núwebsocket.disconnect©rE   rG   rH   zwebsocket.receive)rE   rr   )rE   rp   )rA   Úreceive_datars   Ú
isinstancer=   r   rv   rU   rG   rH   rt   Údataru   r%   )r   rz   rn   r&   r   r   r   Úwrite€   s$   €ýÿðz%ASGIWebSocketAsyncNetworkStream.writec                 Ã  sf   �t  tj¡� |  ddi¡I d H  W d   ƒ n1 sw   Y  | j ¡ I d H  | j ¡ I d H  d S )NrE   r{   )rQ   Úsuppressr5   ÚClosedResourceErrorrU   r9   rT   r:   )r   r   r   r   rT   ”   s   €ÿz&ASGIWebSocketAsyncNetworkStream.acloser   r   c                 Ã  s   �| j  |¡I d H  d S r   )r9   rU   r   r   r   r   rU   š   s   €z$ASGIWebSocketAsyncNetworkStream.sendc                 Ã  sN   �|d u rt j}t |¡� | j ¡ I d H W  d   ƒ S 1 s w   Y  d S r   )r7   r8   r5   Ú
fail_afterr:   rV   )r   rn   r   r   r   rV   �   s   €$ÿz'ASGIWebSocketAsyncNetworkStream.receivec                 Ã  s´   �| j }| jj}| jj}z|  |||¡I dH  W dS  tyY } z4dtjt	|ƒdœ}t
 tj¡� ||ƒI dH  W d  ƒ n1 sBw   Y  W Y d}~dS W Y d}~dS d}~ww )zE
        The sub-thread in which the websocket session runs.
        NrF   r|   )r,   r9   rV   r:   rU   r*   Ú	Exceptionr   ÚINTERNAL_ERRORÚstrrQ   r�   r5   r‚   )r   r,   rV   rU   r_   r   r   r   r   rP   £   s    €ý8ÿ€úz$ASGIWebSocketAsyncNetworkStream._runc                 C  s0   |  dd ¡}|  dg ¡}| j tjj||d�¡S )NÚsubprotocolr3   )r‡   Úextra_headers)rX   rA   rU   r=   rs   ÚAcceptConnection)r   r   r‡   r3   r   r   r   r[   µ   s   þÿz6ASGIWebSocketAsyncNetworkStream._build_accept_response)r)   )
r*   r+   r,   r-   r.   r/   r0   r1   r   r   )r   rD   )rc   rd   re   rf   rg   rh   r   ri   r   )rl   rm   rn   ro   r   rp   )rz   rp   rn   ro   r   r   )r   r   r"   )rn   ro   r   r   )r   r   r   rp   )r   r   r   r    rb   rj   ry   r€   rT   rU   rV   rP   r[   r   r   r   r   r(   '   s    û

+


r(   c                      sj   e Zd Z				d+d,‡ fdd„Zd-dd„Z			d.d/‡ fdd„Zd0‡ fd!d"„Zd1d%d&„Zd2d)d*„Z‡  Z	S )3ÚASGIWebSocketTransportTÚ ©z	127.0.0.1é{   r)   r*   r
   Úraise_app_exceptionsÚboolÚ	root_pathr†   Úclientútuple[str, int]r0   r1   r   r   c                   s"   t ƒ  ||||¡ d | _|| _d S r   )Úsuperr    r]   r<   )r   r*   rŽ   r�   r‘   r0   ©Ú	__class__r   r   r    Á   s   
zASGIWebSocketTransport.__init__c              	   Ã  sd   �t  ¡ 4 I d H š}| t ¡ ¡I d H | _| ¡ | _W d   ƒI d H  | S 1 I d H s+w   Y  | S r   )rQ   rR   Úenter_async_contextr5   Úcreate_task_groupr;   r\   r]   )r   r^   r   r   r   rb   Í   s   €þüz!ASGIWebSocketTransport.__aenter__Nrc   rd   re   rf   rg   rh   c                 ƒ  s@   �t ƒ  |||¡I d H  | jd usJ ‚| j |||¡I d H  d S r   )r“   rj   r]   rk   r”   r   r   rj   Ô   s   €z ASGIWebSocketTransport.__aexit__Úrequestr   r   c                 ƒ  s®   �|j j}|j}|dv s| d¡dkrNg }| d¡ }d ur#| d¡}d|j j|j j| j||j jdd„ |jj	D ƒ| j
|j j|j jf|dœ
}|  ||¡I d H S tƒ  |¡I d H S )	N>   ÚwsÚwssÚupgradeÚ	websocketzsec-websocket-protocolú,c                 S  s   g | ]
\}}|  ¡ |f‘qS r   )Úlower)Ú.0ÚkÚvr   r   r   Ú
<listcomp>î   s    z?ASGIWebSocketTransport.handle_async_request.<locals>.<listcomp>)
rE   r4   Úraw_pathr�   ÚschemeÚquery_stringr3   r‘   ÚserverÚsubprotocols)Úurlr¤   r3   rX   Úsplitr4   r£   r�   ÚqueryÚrawr‘   ÚhostÚportÚ_handle_ws_requestr“   Úhandle_async_request)r   r˜   r¤   r3   r§   Úsubprotocols_headerr,   r”   r   r   r¯   Þ   s(   €
öz+ASGIWebSocketTransport.handle_async_requestÚtask_statusúCanyio.abc.TaskStatus[tuple[ASGIWebSocketAsyncNetworkStream, bytes]]c                Ã  sF   �t | j| j| j| jƒ}| jd usJ ‚| j |¡I d H }| |¡ d S r   )r(   r*   r,   r;   r<   r]   r–   Ústarted)r   r±   ÚstreamÚresultr   r   r   Ú+_create_asgi_websocket_async_network_stream÷   s   €üzBASGIWebSocketTransport._create_asgi_websocket_async_network_streamr,   r-   c                 Ã  sf   �t |jtƒs	J ‚|| _| j | j¡I d H \}}| d¡ ¡ }dd„ |dd … D ƒ}t	d|d|id�S )Nzutf-8c              	   S  s4   g | ]}|  ¡ d krt tttf | dd¡¡‘qS )r‹   z: r   )ÚstripÚtypingÚcastÚtupler†   r©   )rŸ   Úliner   r   r   r¢     s
    þz=ASGIWebSocketTransport._handle_ws_request.<locals>.<listcomp>r   ée   Únetwork_stream)r`   r3   Ú
extensions)
r~   r´   r   r,   r;   Ústartr¶   ÚdecodeÚ
splitlinesr   )r   r˜   r,   r´   Úaccept_responseÚaccept_response_linesr3   r   r   r   r®     s   €
þýz)ASGIWebSocketTransport._handle_ws_request)Tr‹   rŒ   r)   )r*   r
   rŽ   r�   r�   r†   r‘   r’   r0   r1   r   r   )r   rŠ   r   )rc   rd   re   rf   rg   rh   r   r   )r˜   r   r   r   )r±   r²   r   r   )r˜   r   r,   r-   r   r   )
r   r   r   r    rb   rj   r¯   r¶   r®   Ú__classcell__r   r   r”   r   rŠ   À   s    ú
	ü

rŠ   ))Ú
__future__r   rQ   r7   r¸   Útypesr   r5   r=   Úanyio.streams.stapledr   Úwsproto.frame_protocolr   Ú_modelsr   r   Ú_transports.asgir	   r
   Ú_typesr   Ú_exceptionsr   r   Údictr†   ÚAnyr-   r   ÚCallableÚ	AwaitableÚReceiveÚ	CoroutineÚSendr+   r„   r   r   r%   r(   rŠ   r   r   r   r   Ú<module>   s0     