U
    R¹Öh9  ã                   @  sŒ   d dl mZ d dlZd dlZd dlmZ G dd„ deƒZdddœd	d
„Z	dddœdd„Z
dddœdd„Zdddœdd„Zdddœdd„ZdS )é    )ÚannotationsN)ÚWWWScopec                   @  s   e Zd ZdS )ÚClientDisconnectedN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú=./venv/lib/python3.8/site-packages/uvicorn/protocols/utils.pyr   	   s    r   zasyncio.Transportztuple[str, int] | None)Ú	transportÚreturnc                 C  s¢   |   d¡}|d k	rZz0| ¡ }t|tƒr>t|d ƒt|d ƒfnd W S  tk
rX   Y d S X |   d¡}|d k	ržt|ttfƒržt|ƒdkržt|d ƒt|d ƒfS d S )NÚsocketr   é   Zpeernameé   )	Úget_extra_infoZgetpeernameÚ
isinstanceÚtupleÚstrÚintÚOSErrorÚlistÚlen©r
   Zsocket_infoÚinfor   r   r	   Úget_remote_addr   s    
(
"r   c                 C  sˆ   |   d¡}|d k	r@| ¡ }t|tƒr<t|d ƒt|d ƒfS d S |   d¡}|d k	r„t|ttfƒr„t|ƒdkr„t|d ƒt|d ƒfS d S )Nr   r   r   Zsocknamer   )r   Zgetsocknamer   r   r   r   r   r   r   r   r   r	   Úget_local_addr   s    
&
"r   Úboolc                 C  s   t |  d¡ƒS )NZ
sslcontext)r   r   )r
   r   r   r	   Úis_ssl)   s    r   r   r   )Úscoper   c                 C  s   |   d¡}|sdS d| S )NÚclientÚ z%s:%d)Úget)r   r   r   r   r	   Úget_client_addr-   s    
r!   c                 C  s2   t j | d ¡}| d r.d || d  d¡¡}|S )NÚpathZquery_stringz{}?{}Úascii)ÚurllibÚparseZquoteÚformatÚdecode)r   Zpath_with_query_stringr   r   r	   Úget_path_with_query_string4   s    r(   )Z
__future__r   ZasyncioZurllib.parser$   Zuvicorn._typesr   r   r   r   r   r   r!   r(   r   r   r   r	   Ú<module>   s   