o
    h>xd7                     @   s2  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yP   d Z ZZY nw 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   6D:\rfid_django\env\Lib\site-packages\serial/request.py__init__$   s   zHeaders.__init__Nc                 C   @   |  }t| jdrd | j_t| jdrd | j_| jj||dS N	_boundary_bytes)default)
capitalizehasattrr   r    r!   r   popr   keyr"   r   r   r   r%   *      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   r   r   )r#   r$   r   r    r!   r   
setdefaultr&   r   r   r   r,   ;   r(   zHeaders.setdefaultc                 K   st   i }|d u r	|}nt |fi |}| D ]
\}}||| < qt| jdr*d | j_t| jdr4d | 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rd | 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r#t| jdrd | j_t| jdrd | j_| j||S d S )NContent-lengthr    r!   )r#   r$   r   r    r!   r   __setitem__r   r'   valuer   r   r   r7   \   s   zHeaders.__setitem__c              
   C   s   |  }|dkr| jj}|d u rd}nt|}t|}|S z| j|}W n" tyG } z|dkr=t| jdr=| jj	r=d}W Y d }~nd }~ww |d urj|
  d d dkrjt| jdrj|d	t| jjd
d 7 }|S )Nr6   r   Content-typepartszmultipart/form-data	   	multipartboundaryz; boundary=utf-8encoding)r#   r   datalenstrr   __getitem__KeyErrorr$   r;   striplowerr>   )r   r'   rB   content_lengthr9   er   r   r   rE   f   s0   
zHeaders.__getitem__c                 C   s   dd | D S )Nc                 s   s    | ]}|V  qd S r   r   .0r2   r   r   r   	<genexpr>   s    zHeaders.keys.<locals>.<genexpr>r   r+   r   r   r   keys      zHeaders.keysc                    s    fdd D S )Nc                 3   s    | ]} | V  qd S r   r   rK   r+   r   r   rM      s    z!Headers.values.<locals>.<genexpr>r   r+   r   r+   r   values   s   zHeaders.valuesc                 C   s   t t| S r   )rC   tupler+   r   r   r   __len__   s   zHeaders.__len__c                 c   sv    t  }| j D ]
}|| |V  q	t| jtur"d|vr"dV  t| jdr5| jjr7d|vr9dV  d S d S d S d S )Nr6   r;   r:   )	setr   rN   addtyper   Partr$   r;   )r   rN   r2   r   r   r   __iter__   s    


zHeaders.__iter__c                 C   s   ||   v rdS dS )NTF)rN   r4   r   r   r   __contains__   s   zHeaders.__contains__c                 c   s    | D ]	}|| | fV  qd S r   r   )r   r2   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   )r[   r+   r   r   r   __copy__   s   zHeaders.__copy__r   )__name__
__module____qualname____doc__r   r%   r*   r,   r   r5   r7   rE   rN   rP   rR   rW   rX   r   r[   r\   r   r   r   r   r      s$    
	

		
r   c                   @   sb   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headersrB   )r   rB   re   r   r   r   r      s
   
zData.__init__c                 C      | j S r   )rc   r+   r   r   r   re         zData.headersc                 C   s@   d | _ |d u rti | }nt|tr| |_nt|| }|| _d S r   )r!   r   
isinstancer   rc   )r   re   r   r   r   re      s   


c                 C   rf   r   )rd   r+   r   r   r   rB      rg   z	Data.datac                 C   s   d | _ |d urZd }d| jv r1| jd }td|d urd}td|d ur'd}td|d ur1d}t|ttfsHt|tjtj	frOt|t
tfsOt||pMd}t|t
rZt|dd	}|| _d S )
Nr:   z/json\bjsonz/xml\bxmlz/yaml\byamlr?   r@   )r!   re   researchrh   r   r-   r   r   r   rD   bytesr   rd   )r   rB   Zserialize_typectr   r   r   rB      s(   



c                 C   sr   | j d u r6g }| j D ]\}}|td||f dd q|d | j}|r.|| j d|d | _ | j S )Nz%s: %sr?   r@          
)r!   re   r   appendrn   rB   join)r   linesr2   r3   rB   r   r   r   	__bytes__   s   



zData.__bytes__c                 C   s6   |   }t|tst|dd dddd}|S )N   z\r\nz
z\n
)ru   rh   r   reprreplace)r   br   r   r   __str__   s   
 zData.__str__)NN)r]   r^   r_   r`   r   propertyre   setterrB   ru   r|   r   r   r   r   ra      s    





ra   c                   @   s\   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 )rV   Nc                 C   s&   d| _ d| _|| _tj| ||d dS )rb   N)rB   re   )r    _partsr;   ra   r   )r   rB   re   r;   r   r   r   r   	  s   zPart.__init__c                 C   s~   | j du r<d| jpdgdd | jD  }ddd tdD }||v r9|tttj	tj
 d	d
7 }||v s&|| _ | j S )z[
        Calculates a boundary which is not contained in any of the request parts.
        Nrq   rp   c                 S   s   g | ]}t |qS r   )rn   rL   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)rn   randomchoicestringdigitsascii_letters)rL   ir   r   r   rM   &  s    
z Part.boundary.<locals>.<genexpr>   r?   r@   )r    rs   rd   r;   rangern   r   r   r   r   r   )r   rB   r>   r   r   r   r>     s"   


zPart.boundaryc                 C   sN   | j r"d| j d | jpdgdd | j D  d| j d  }|S | j}|S )Ns   
--rq   rp   c                 S   s   g | ]}t | qS r   )rn   rstripr   r   r   r   r   ;  s    zPart.data.<locals>.<listcomp>s   --)r;   r>   rs   rd   r   rB   r   r   r   rB   5  s   
z	Part.datac                 C   s   t j| |S r   )ra   rB   __set__r   r   r   r   rB   A  rO   c                 C   rf   r   )r   r+   r   r   r   r;   E  s   z
Part.partsc                 C   sD   |d u rt g | d}nt|t r| |_nt || d}d | _|| _d S rY   )Partsrh   r   r    r   )r   r;   r   r   r   r;   J  s   

)NNN)	r]   r^   r_   r   r}   r>   rB   r~   r;   r   r   r   r   rV     s    




rV   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   rZ   r   r   r   Y  s   zParts.__init__c                        d | j _d | j _t | d S r   )r   r    r!   r   rr   )r   itemr   r   r   rr   ^     zParts.appendc                       d | j _d | j _t   d S r   )r   r    r!   r   clearr+   r   r   r   r   d     zParts.clearc                    r   r   )r   r    r!   r   extend)r   r   r   r   r   r   j  r   zParts.extendc                    r   r   )r   r    r!   r   reverser+   r   r   r   r   p  r   zParts.reversec                    r   r   )r   r    r!   r   r5   r4   r   r   r   r5   v  r   zParts.__delitem__c                    s"   d | j _d | j _t || d S r   )r   r    r!   r   r7   r8   r   r   r   r7   |  s   zParts.__setitem__)r]   r^   r_   r   rr   r   r   r   r5   r7   __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rB   re   origin_req_hostunverifiablemethod)r!   rc   rd   re   urllibr   r   r   )r   urlrB   re   r   r   r   r   r   r   r     s   

zRequest.__init__)NNNFNr]   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)rB   re   r;   r   )rV   r   r   )r   r   rB   re   r   r   r   r;   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   rl   r   urllib.requestr   typingr   r   r   r   ImportErrorZserial.marshalr   Z	abc.modelr   Z	utilitiesr   objectr   ra   rV   listr   r   r   r   r   r   r   r   <module>   s0    $ XP,