U
    wi                     @   s   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 d	e je
eZd
ZG dd deddddgZG dd dZeG dd dZeG dd dZG dd dZdS )    N)	dataclass)
namedtuple)Optional   )	__title____version__   )
ReplyErrorzPython/{0[0]}.{0[1]} {1}/{2}z
c                       sT   e Zd ZdZdeeed d fddZedeed ddd	Zed
ddZ  Z	S )	BasicAuthz!Http basic authentication helper. latin1)loginpasswordencodingreturnc                    sB   |d krt d|d kr t dd|kr0t dt | |||S )Nz"None is not allowed as login valuez%None is not allowed as password value:z5A ":" is not allowed in login (RFC 1945#section-11.1))
ValueErrorsuper__new__)clsr   r   r   	__class__ @/tmp/pip-unpacked-wheel-kpmwgv_b/python_socks/_protocols/http.pyr      s    zBasicAuth.__new__)auth_headerr   r   c                 C   s   z| dd\}}W n tk
r0   tdY nX | dkrJtd| ztj|ddd|}W n tjk
r   td	Y nX z| d
d\}}W n tk
r   tdY nX | |||dS )z<Create a BasicAuth object from an Authorization HTTP header. r   z%Could not parse authorization header.basiczUnknown authorization method %sasciiT)validatezInvalid base64 encoding.r   zInvalid credentials.r   )	splitr   lowerbase64	b64decodeencodedecodebinasciiError)r   r   r   Z	auth_typeZencoded_credentialsdecodedusernamer   r   r   r   r%   %   s"    zBasicAuth.decoder   c                 C   s.   d| j | jf | j}dt|| j S )zEncode credentials.z%s:%szBasic %s)r   r   r$   r   r"   	b64encoder%   )selfcredsr   r   r   r$   C   s    zBasicAuth.encode)r   r   )r   )
__name__
__module____qualname____doc__strr   classmethodr%   r$   __classcell__r   r   r   r   r
      s
   r
   r   r   r   c                   @   s:   e Zd ZdedddZdedddZed	d
dZdS )_Bufferutf-8r   c                 C   s   || _ t | _d S N)	_encoding	bytearray_buffer)r,   r   r   r   r   __init__J   s    z_Buffer.__init__r   )linec                 C   s.   |r| j || j | j td d S )Nr   )r:   extendr$   r8   CRLF)r,   r<   r   r   r   append_lineN   s    z_Buffer.append_liner*   c                 C   s
   t | jS r7   )bytesr:   )r,   r   r   r   dumpsT   s    z_Buffer.dumpsN)r6   )r   )r.   r/   r0   r2   r;   r?   r@   rA   r   r   r   r   r5   I   s   r5   c                   @   sD   e Zd ZU eed< eed< ee ed< ee ed< edddZdS )	ConnectRequesthostportr)   r   r*   c                 C   s   t  }|d| j d| j d |d| j d| j  |dt  | jrz| jrzt| j| j}|d|   |  |	 S )NzCONNECT r   z	 HTTP/1.1zHost: zUser-Agent: zProxy-Authorization: )
r5   r?   rC   rD   DEFAULT_USER_AGENTr)   r   r
   r$   rA   )r,   Zbuffauthr   r   r   rA   _   s    zConnectRequest.dumpsN)	r.   r/   r0   r2   __annotations__intr   r@   rA   r   r   r   r   rB   X   s
   
rB   c                   @   s2   e Zd ZU eed< eed< eed dddZdS )ConnectReplystatus_codemessagedatar   c           	      C   s   |st d|tddd }|dd}z| ^}}}W n" tk
rb   t d| Y nX zt|}W n" tk
r   t d| Y nX d	|}|d
kr| d	| }t ||d| ||dS )NzInvalid proxy responser   r   r   r6   surrogateescapezInvalid status line: zInvalid status code: r      )Z
error_code)rJ   rK   )r	   r    r>   r$   r%   r   rH   join)	r   rM   r<   versioncodereasonrJ   Zstatus_messagemsgr   r   r   loadss   s"    
zConnectReply.loadsN)	r.   r/   r0   rH   rG   r2   r3   r@   rU   r   r   r   r   rI   n   s   
rI   c                   @   s,   e Zd ZeedddZeedddZdS )
Connection)requestr   c                 C   s   |  S r7   )rA   )r,   rW   r   r   r   send   s    zConnection.sendrL   c                 C   s
   t |S r7   )rI   rU   )r,   rM   r   r   r   receive   s    zConnection.receiveN)r.   r/   r0   rB   r@   rX   rI   rY   r   r   r   r   rV      s   rV   )sysZdataclassesr   r"   r&   collectionsr   typingr   _versionr   r   errorsr	   formatversion_inforE   r>   r
   r5   rB   rI   rV   r   r   r   r   <module>   s(   4 