o
    DRh@4                     @  sD  d dl m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	 ddl
mZ ddlmZ ddlmZ g dZd	jej Zejd
de de Zejdde de ZeejddZeejddZeejddZd(ddZedZedZej G dd dZ!ej G dd dZ"d)d#d$Z#d*d&d'Z$dS )+    )annotationsN)Callable	Generator   )Headers)SecurityError)version)SERVER
USER_AGENTRequestResponsez{}.{}WEBSOCKETS_USER_AGENTzPython/z websockets/WEBSOCKETS_SERVERWEBSOCKETS_MAX_NUM_HEADERS128WEBSOCKETS_MAX_LINE_LENGTH8192WEBSOCKETS_MAX_BODY_SIZE	1_048_576valuebytesreturnstrc                 C  s   | j ddS )zG
    Decode a bytestring for interpolating into an error message.

    backslashreplace)errors)decode)r    r   S/home/air/sanwanet/backup_V2/venv/lib/python3.10/site-packages/websockets/http11.pyd,   s   r   s   [-!#$%&\'*+.^_`|~0-9a-zA-Z]+s   [\x09\x20-\x7e\x80-\xff]*c                   @  sT   e Zd ZU dZded< ded< dZded< edd
dZedddZ	dddZ
dS )r   z
    WebSocket handshake request.

    Attributes:
        path: Request path, including optional query.
        headers: Request headers.
    r   pathr   headersNException | None
_exceptionr   c                 C     t dt | jS )NzIRequest.exception is deprecated; use ServerProtocol.handshake_exc insteadwarningswarnDeprecationWarningr"   selfr   r   r   	exceptionX   
   zRequest.exception	read_line-Callable[[int], Generator[None, None, bytes]]Generator[None, None, Request]c           	   
   c  s    z	t |E dH }W n ty } ztd|d}~ww z|dd\}}}W n ty8   tdt| dw |dkrFtdt| |dkrStd	t| |d
d}t|E dH }d|v rhtdd|v rptd| ||S )a  
        Parse a WebSocket handshake request.

        This is a generator-based coroutine.

        The request path isn't URL-decoded or validated in any way.

        The request path and headers are expected to contain only ASCII
        characters. Other characters are represented with surrogate escapes.

        :meth:`parse` doesn't attempt to read the request body because
        WebSocket handshake requests don't have one. If the request contains a
        body, it may be read from the data stream after :meth:`parse` returns.

        Args:
            read_line: Generator-based coroutine that reads a LF-terminated
                line or raises an exception if there isn't enough data

        Raises:
            EOFError: If the connection is closed without a full HTTP request.
            SecurityError: If the request exceeds a security limit.
            ValueError: If the request isn't well formatted.

        Nz1connection closed while reading HTTP request line       zinvalid HTTP request line:    HTTP/1.1)unsupported protocol; expected HTTP/1.1: s   GETz+unsupported HTTP method; expected GET; got asciisurrogateescapeTransfer-Encoding!transfer codings aren't supportedContent-Lengthzunsupported request body)
parse_lineEOFErrorsplit
ValueErrorr   r   parse_headersNotImplementedError)	clsr,   request_lineexcmethodraw_pathprotocolr   r    r   r   r   parsea   s2   #

zRequest.parser   c                 C  s$   d| j  d }|| j 7 }|S )z;
        Serialize a WebSocket handshake request.

        zGET z HTTP/1.1
)r   encoder    	serialize)r)   requestr   r   r   rF      s   zRequest.serializer   r!   )r,   r-   r   r.   r   r   )__name__
__module____qualname____doc____annotations__r"   propertyr*   classmethodrD   rF   r   r   r   r   r   H   s   
 ?r   c                   @  sh   e Zd ZU dZded< ded< ded< dZd	ed
< dZded< edddZe	dddZ
dddZdS )r   z
    WebSocket handshake response.

    Attributes:
        status_code: Response code.
        reason_phrase: Response reason.
        headers: Response headers.
        body: Response body, if any.

    intstatus_coder   reason_phraser   r    Nzbytes | Nonebodyr!   r"   r   c                 C  r#   )NzJResponse.exception is deprecated; use ClientProtocol.handshake_exc insteadr$   r(   r   r   r   r*      r+   zResponse.exceptionr,   r-   
read_exactread_to_eofGenerator[None, None, Response]c              
   c  s   z	t |E dH }W n ty } ztd|d}~ww z|dd\}}}W n ty8   tdt| dw |dkrFtdt| zt|}	W n ty]   tdt| dw d	|	  krhd
k srn tdt| t|stdt| |dd}
t	|E dH }d|v rt
dd	|	  krdk sn |	dks|	dkrd}nFz|d }W n ty   d}Y nw t|}|du rz	|tE dH }W n" ty   tdt dw |tkrtd| d||E dH }| |	|
||S )a  
        Parse a WebSocket handshake response.

        This is a generator-based coroutine.

        The reason phrase and headers are expected to contain only ASCII
        characters. Other characters are represented with surrogate escapes.

        Args:
            read_line: Generator-based coroutine that reads a LF-terminated
                line or raises an exception if there isn't enough data.
            read_exact: Generator-based coroutine that reads the requested
                bytes or raises an exception if there isn't enough data.
            read_to_eof: Generator-based coroutine that reads until the end
                of the stream.

        Raises:
            EOFError: If the connection is closed without a full HTTP response.
            SecurityError: If the response exceeds a security limit.
            LookupError: If the response isn't well formatted.
            ValueError: If the response isn't well formatted.

        Nz0connection closed while reading HTTP status liner/   r0   zinvalid HTTP status line: r1   r2   z+invalid status code; expected integer; got d   iX  u-   invalid status code; expected 100–599; got zinvalid HTTP reason phrase: r3   r4   r5   r6         i0  r7   zbody too large: over z byteszbody too large: )r8   r9   r:   r;   r   rQ   	_value_re	fullmatchr   r<   r=   KeyErrorMAX_BODY_SIZERuntimeErrorr   )r>   r,   rU   rV   status_liner@   rC   raw_status_code
raw_reasonrR   reasonr    rT   raw_content_lengthcontent_lengthr   r   r   rD      sj    

&zResponse.parser   c                 C  s@   d| j  d| j d }|| j 7 }| jdur|| j7 }|S )z<
        Serialize a WebSocket handshake response.

        z	HTTP/1.1  z
N)rR   rS   rE   r    rF   rT   )r)   responser   r   r   rF   (  s
   

zResponse.serializerH   )r,   r-   rU   r-   rV   r-   r   rW   rI   )rJ   rK   rL   rM   rN   rT   r"   rO   r*   rP   rD   rF   r   r   r   r   r      s   
 ]r   r,   r-   Generator[None, None, Headers]c           	      c  s    t  }ttd D ]p}z	t| E dH }W n ty& } ztd|d}~ww |dkr. |S z
|dd\}}W n tyI   tdt| dw t	|sXtdt| |
d}t	|sktd	t| |d
}|d
d}|||< q
td)a  
    Parse HTTP headers.

    Non-ASCII characters are represented with surrogate escapes.

    Args:
        read_line: Generator-based coroutine that reads a LF-terminated line
            or raises an exception if there isn't enough data.

    Raises:
        EOFError: If the connection is closed without complete headers.
        SecurityError: If the request exceeds a security limit.
        ValueError: If the request isn't well formatted.

    r   Nz,connection closed while reading HTTP headers       :zinvalid HTTP header line: zinvalid HTTP header name: s    	zinvalid HTTP header value: r3   r4   ztoo many HTTP headers)r   rangeMAX_NUM_HEADERSr8   r9   r:   r;   r   	_token_rer\   stripr[   r   r   )	r,   r    _liner@   raw_name	raw_valuenamer   r   r   r   r<   6  s4   





r<   Generator[None, None, bytes]c                 c  sJ    z	| t E dH }W n ty   tdw |dstd|dd S )ao  
    Parse a single line.

    CRLF is stripped from the return value.

    Args:
        read_line: Generator-based coroutine that reads a LF-terminated line
            or raises an exception if there isn't enough data.

    Raises:
        EOFError: If the connection is closed without a CRLF.
        SecurityError: If the response exceeds a security limit.

    Nzline too longs   
zline without CRLF)MAX_LINE_LENGTHr_   r   endswithr9   )r,   rp   r   r   r   r8   i  s   
r8   )r   r   r   r   )r,   r-   r   rh   )r,   r-   r   rt   )%
__future__r   dataclassesosresysr%   typingr   r   datastructuresr   
exceptionsr   r   websockets_version__all__formatversion_infoPYTHON_VERSIONenvirongetr
   r	   rQ   rl   rv   r^   r   compilerm   r[   	dataclassr   r   r<   r8   r   r   r   r   <module>   sB    


d 
	3