U
    ~d7                     @   s4  d Z ddlmZmZmZmZmZmZmZ ddl	m
Z
 e
  ddlmZ ddlZddlZddlZddlZzddlmZmZmZmZ W n  ek
r   d Z ZZY nX ddlmZ dd	lmZ dd
lmZ G dd deZG dd deZ G dd de Z!G dd de"Z#G dd de ej$j%Z%G dd de!e%Z&dS )aj  
This module extends the functionality of `urllib.request.Request` to support multipart requests, to support passing
instances of serial models to the `data` parameter/property for `urllib.request.Request`, and to
support casting requests as `str` or `bytes` (typically for debugging purposes and/or to aid in producing
non-language-specific API documentation).
    )nested_scopes
generatorsdivisionabsolute_importwith_statementprint_functionunicode_literals   )backport)
native_strN)DictSequenceSetIterable)	serialize)Model)collections_abcc                   @   s   e Zd ZdZdd Zd#ddZdd Zd$d	d
Zd%ddZdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" ZdS )&HeaderszZ
    A dictionary of headers for a `Request`, `Part`, or `MultipartRequest` instance.
    c                 C   s   i | _ || _| | d S N)_dictrequestupdateselfitemsr    r   K/var/www/html/myproject/myenv/lib/python3.8/site-packages/serial/request.py__init__$   s    zHeaders.__init__Nc                 C   s@   |  }t| jdrd | j_t| jdr0d | j_| jj||dS N	_boundary_bytes)default)
capitalizehasattrr   r   r    r   popr   keyr!   r   r   r   r$   *   s    zHeaders.popc                 C   s2   t | jdrd | j_t | jdr(d | j_| j S Nr   r    )r#   r   r   r    r   popitemr   r   r   r   r(   3   s
    zHeaders.popitemc                 C   s@   |  }t| jdrd | j_t| jdr0d | j_| jj||dS r   )r"   r#   r   r   r    r   
setdefaultr%   r   r   r   r*   ;   s    zHeaders.setdefaultc                 K   sp   i }|d kr|}nt |f|}| D ]\}}||| < q&t| jdrPd | j_t| jdrdd | j_| j|S r'   )	dictr   r"   r#   r   r   r    r   r   )r   iterablekwargscddkvr   r   r   r   D   s    zHeaders.updatec                 C   s<   |  }t| jdrd | j_t| jdr0d | j_| j|= d S r'   )r"   r#   r   r   r    r   r   r&   r   r   r   __delitem__S   s    zHeaders.__delitem__c                 C   sJ   |  }|dkrFt| jdr$d | j_t| jdr8d | j_| j||S d S )NContent-lengthr   r    )r"   r#   r   r   r    r   __setitem__r   r&   valuer   r   r   r5   \   s    zHeaders.__setitem__c              
   C   s   |  }|dkr8| jj}|d kr&d}nt|}t|}nz| j|}W nB tk
r } z$|dkrzt| jdrz| jj	rzd}W 5 d }~X Y nX |d k	r|
  d d dkrt| jdr|d	t| jjd
d 7 }|S )Nr4   r   Content-typepartszmultipart/form-data	   	multipartboundaryz; boundary=utf-8encoding)r"   r   datalenstrr   __getitem__KeyErrorr#   r9   striplowerr<   )r   r&   r@   content_lengthr7   er   r   r   rC   f   s*    

zHeaders.__getitem__c                 C   s   dd | D S )Nc                 s   s   | ]
}|V  qd S r   r   .0r0   r   r   r   	<genexpr>   s     zHeaders.keys.<locals>.<genexpr>r   r)   r   r   r   keys   s    zHeaders.keysc                    s    fdd D S )Nc                 3   s   | ]} | V  qd S r   r   rI   r)   r   r   rK      s     z!Headers.values.<locals>.<genexpr>r   r)   r   r)   r   values   s    zHeaders.valuesc                 C   s   t t| S r   )rA   tupler)   r   r   r   __len__   s    zHeaders.__len__c                 c   sh   t  }| j D ]}|| |V  qt| jtk	rBd|krBdV  t| jdrd| jjrdd|krddV  d S )Nr4   r9   r8   )	setr   rL   addtyper   Partr#   r9   )r   rL   r0   r   r   r   __iter__   s    

zHeaders.__iter__c                 C   s   ||   krdS dS )NTF)rL   r2   r   r   r   __contains__   s    zHeaders.__contains__c                 c   s   | D ]}|| | fV  qd S r   r   )r   r0   r   r   r   r      s    zHeaders.itemsc                 C   s   | j | j| jdS N)r   )	__class__r   r   r)   r   r   r   copy   s    zHeaders.copyc                 C   s   |   S r   )rX   r)   r   r   r   __copy__   s    zHeaders.__copy__)N)N)N)__name__
__module____qualname____doc__r   r$   r(   r*   r   r3   r5   rC   rL   rM   rO   rT   rU   r   rX   rY   r   r   r   r   r      s"   
	
	
	
r   c                   @   s^   e Zd ZdZdddZedd Zejdd Zedd	 Zejd
d	 Zdd Z	dd Z
dS )Dataz-
    One of a multipart request's parts.
    Nc                 C   s"   d| _ d| _d| _|| _|| _dS )e  
        Parameters:

            - data (bytes|str|collections.Sequence|collections.Set|dict|serial.abc.Model): The payload.

            - headers ({str: str}): A dictionary of headers (for this part of the request body, not the main request).
              This should (almost) always include values for "Content-Disposition" and "Content-Type".
        N)r    _headers_dataheadersr@   )r   r@   rb   r   r   r   r      s
    zData.__init__c                 C   s   | j S r   )r`   r)   r   r   r   rb      s    zData.headersc                 C   s@   d | _ |d krti | }nt|tr,| |_n
t|| }|| _d S r   )r    r   
isinstancer   r`   )r   rb   r   r   r   rb      s    

c                 C   s   | j S r   )ra   r)   r   r   r   r@      s    z	Data.datac                 C   s   d | _ |d k	rd }d| jkrb| jd }td|d k	r:d}td|d k	rNd}td|d k	rbd}t|ttfst|tjtj	frt|t
tfst||pd}t|t
rt|dd	}|| _d S )
Nr8   z/json\bjsonz/xml\bxmlz/yaml\byamlr=   r>   )r    rb   researchrc   r   r+   r   r   r   rB   bytesr   ra   )r   r@   Zserialize_typectr   r   r   r@      s(    


c                 C   sr   | j d krlg }| j D ]"\}}|td||f dd q|d | j}|r\|| j d|d | _ | j S )Nz%s: %sr=   r>          
)r    rb   r   appendri   r@   join)r   linesr0   r1   r@   r   r   r   	__bytes__   s    



zData.__bytes__c                 C   s6   |   }t|ts2t|dd dddd}|S )N   z\r\nz
z\n
)rp   rc   r   reprreplace)r   br   r   r   __str__   s    
 zData.__str__)NN)rZ   r[   r\   r]   r   propertyrb   setterr@   rp   rw   r   r   r   r   r^      s     





r^   c                   @   sV   e Zd ZdddZedd Zedd Zejdd Zed	d
 Zejdd
 ZdS )rS   Nc                 C   s&   d| _ d| _|| _tj| ||d dS )r_   N)r@   rb   )r   _partsr9   r^   r   )r   r@   rb   r9   r   r   r   r   	  s    zPart.__init__c                 C   sx   | j dkrrd| jpdgdd | jD  }ddd tdD }||krl|tttj	tj
 d	d
7 }qD|| _ | j S )z[
        Calculates a boundary which is not contained in any of the request parts.
        Nrl   rk   c                 S   s   g | ]}t |qS r   )ri   rJ   pr   r   r   
<listcomp>$  s     z!Part.boundary.<locals>.<listcomp>c                 s   s(   | ] }t ttjtj d dV  qdS )r=   r>   N)ri   randomchoicestringdigitsascii_letters)rJ   ir   r   r   rK   &  s
   z Part.boundary.<locals>.<genexpr>   r=   r>   )r   rn   ra   r9   rangeri   r~   r   r   r   r   )r   r@   r<   r   r   r   r<     s     



zPart.boundaryc                 C   sL   | j rBd| j d | jpdgdd | j D  d| j d  }n| j}|S )Ns   
--rl   rk   c                 S   s   g | ]}t | qS r   )ri   rstripr{   r   r   r   r}   ;  s     zPart.data.<locals>.<listcomp>s   --)r9   r<   rn   ra   r   r@   r   r   r   r@   5  s    
z	Part.datac                 C   s   t j| |S r   )r^   r@   __set__r   r   r   r   r@   A  s    c                 C   s   | j S r   )rz   r)   r   r   r   r9   E  s    z
Part.partsc                 C   sD   |d krt g | d}nt|t r(| |_nt || d}d | _|| _d S rV   )Partsrc   r   r   rz   )r   r9   r   r   r   r9   J  s    
)NNN)	rZ   r[   r\   r   rx   r<   r@   ry   r9   r   r   r   r   rS     s      




rS   c                       sd   e Zd Z fddZ fddZ fddZ fddZ fd	d
Z fddZ fddZ	  Z
S )r   c                    s   || _ t | d S r   )r   superr   r   rW   r   r   r   Y  s    zParts.__init__c                    s    d | j _d | j _t | d S r   )r   r   r    r   rm   )r   itemr   r   r   rm   ^  s    zParts.appendc                    s   d | j _d | j _t   d S r   )r   r   r    r   clearr)   r   r   r   r   d  s    zParts.clearc                    s    d | j _d | j _t | d S r   )r   r   r    r   extend)r   r   r   r   r   r   j  s    zParts.extendc                    s   d | j _d | j _t   d S r   )r   r   r    r   reverser)   r   r   r   r   p  s    zParts.reversec                    s    d | j _d | j _t | d S r   )r   r   r    r   r3   r2   r   r   r   r3   v  s    zParts.__delitem__c                    s"   d | j _d | j _t || d S r   )r   r   r    r   r5   r6   r   r   r   r5   |  s    zParts.__setitem__)rZ   r[   r\   r   rm   r   r   r   r3   r5   __classcell__r   r   r   r   r   W  s   r   c                   @   s   e Zd ZdZdddZdS )Requestz
    A sub-class of `urllib.request.Request` which accommodates additional data types, and serializes `data` in
    accordance with what is indicated by the request's "Content-Type" header.
    NFc              	   C   s8   d | _ d | _d | _|| _tjjj| ||||||d d S )Nr@   rb   origin_req_hostunverifiablemethod)r    r`   ra   rb   urllibr   r   r   )r   urlr@   rb   r   r   r   r   r   r   r     s    
zRequest.__init__)NNNFNrZ   r[   r\   r]   r   r   r   r   r   r     s        r   c                   @   s   e Zd ZdZdddZdS )MultipartRequestz
    A sub-class of `Request` which adds a property (and initialization parameter) to hold the `parts` of a
    multipart request.

    https://www.w3.org/Protocols/rfc1341/7_2_Multipart.html
    NFc              	   C   s.   t j| |||d tj| ||||||d d S )N)r@   rb   r9   r   )rS   r   r   )r   r   r@   rb   r   r   r   r9   r   r   r   r     s    zMultipartRequest.__init__)NNNFNNr   r   r   r   r   r     s   
      r   )'r]   
__future__r   r   r   r   r   r   r   Zutilities.compatibilityr
   Zfuture.utilsr   r~   rg   r   urllib.requestr   typingr   r   r   r   ImportErrorZserial.marshalr   Z	abc.modelr   Z	utilitiesr   objectr   r^   rS   listr   r   r   r   r   r   r   r   <module>   s,   $ XP,