B
    EDb/  ã               @   sæ   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 e  de j	¡a
e  de j	¡add„ ZG dd„ deƒZG d	d
„ d
eƒZG dd„ deƒZedkrâeddƒZeddeƒZe ¡  xejsÄe ¡  q´W eeejƒƒ eeejƒƒ dS )é    N)ÚPORTABLE_BYTESÚPORTABLE_STRINGs   

|

s   ^([-_a-zA-Z0-9]+): (.*)$c             C   s   | d   ¡  dd¡| d fS )Nr   ó   -ó   _é   )ÚupperÚreplace)Zpair© r	   ú<G:\easytimepro\master/mysite/ladon\tools\multiparthandler.pyÚupperkey   s    r   c               @   s(   e Zd Zd	dd„Zd
dd„Zdd„ ZdS )ÚMultiPartReaderNc             C   s²   || _ || _|| _t |¡}t d d|¡tj¡| _t	|ƒd | _
d| _d| _|| _i | _i | _d| _d| _d| _d| _d| _d | _d | _d| _d| _d| _d| _d| _d| _d S )Ns3   --<b>
|
--<b>
|
--<b>--|--<b>
|
--<b>
|
--<b>--s   <b>é   ó    Fr   )Ú
chunk_sizeÚcontent_sizeÚboundaryÚreÚescapeÚcompiler   ÚMÚrx_boundary_splitÚlenÚlen_rest_chunkÚ
rest_chunkÚdataÚreqÚattachmentsÚattachments_by_idÚeosÚinterface_requestÚ
part_countÚattachment_headersÚattachment_headers_parsedÚtmpdirÚfdÚrequest_bytes_readÚattachment_bytes_sizeZraw_dump_restZattachment_count)Úselfr   r   r   r   Zrx_boundaryr	   r	   r
   Ú__init__   s0    
zMultiPartReader.__init__Fc             C   s’  | j dkrT|  j|7  _t | j¡}|rT| j| ¡ d… }| jd| ¡ … | _d| _ | j dkrŽ|  jt|ƒ7  _| jdkr¤|  j	|7  _	t
ttt | j¡ƒƒ| _nt | j|¡ |dkrŽ| jdkr8t | j¡ t
ttt | j¡ƒƒ}| j| j| jd  d< || j| jd  d< d|kr8| j| jd  | j|d < | js|i | j| j< t d	d
| j¡\| _| j| j d< |  jd7  _d| _d| _d| _ dS )z
		@param eop: End of parts
		FNTr   r   ÚsizeÚheaderss
   CONTENT_IDÚ Zcontent_Úpathr   )r"   r!   Úrx_2linefeedsÚsearchÚendÚstartr&   r   r    r   ÚdictÚmapr   Ú
rx_headersÚfindallÚinterface_request_headersÚosÚwriter$   Úcloser   r   r   ÚtempfileZmkstempr#   )r'   r   ZeopÚmZheaders_dictr	   r	   r
   r7   1   s8    



"zMultiPartReader.writec             C   sN  d}| j }| jr,| j| j| k r,| j| j }| j |¡}|  jt|ƒ7  _|dks`t|ƒ| j k rdd}| j| }| j |¡}t|ƒdkrÎ|  j	|d 7  _	|  
| j	d¡ x |dd… D ]}|  
|d¡ q´W d| _	|dkrÜd| _|  
|dd … d d | j … ¡ | jr,t | j¡ t | j| jd  d ¡ |dd … d | j d … | _d S )	NFr+   Tr   r   éÿÿÿÿr   r,   )r   r   r%   r   Úreadr   r   r   Úsplitr   r7   r   r   r6   r8   r$   Úunlinkr   r    )r'   Zread_to_endZ	read_sizeÚchunkZfocusÚpartsÚpartr	   r	   r
   Ú
read_chunkW   s.    
"zMultiPartReader.read_chunk)N)F)Ú__name__Ú
__module__Ú__qualname__r(   r7   rB   r	   r	   r	   r
   r      s   

&r   c               @   s*   e Zd Zd	dd„Zi fdd„Zdd„ ZdS )
ÚMultiPartWriteréPÃ  Nc             C   sH   || _ |s8t ¡ }| tt ¡ ƒ d¡¡ | ¡  d¡}|| _|| _	d S )Nz
iso-8859-1)
r   ÚhashlibÚmd5ÚupdateÚstrÚtimeÚencodeZ	hexdigestr   r   )r'   r   r   r   rI   r	   r	   r
   r(   u   s    zMultiPartWriter.__init__c             C   sf  t |ƒtkr| d¡}t |ƒtkr,| d¡}| j d| j d ¡ | j d| d ¡ | j d| d ¡ xr| ¡ D ]f\}}yHt |ƒtkr”| d¡}t |ƒtkrª| d¡}| j |d | d ¡ W qt   tdƒ Y qtX qtW | j d¡ t|dƒr<x6| 	| j
¡}| j |¡ |d	ks(t|ƒ| j
k røP qøW | j d¡ n&t |ƒtkrb| j |¡ | j d¡ d
S )a¯  
		Add an attachment. Data must be binary meaning str for Python 2,
		bytes for Python 3 or a file-like object opened in binary mode.
		Content-type, content-id and strings in the headers dict can be
		strings but if they cannot be encoded to iso-8859-1 an exception
		is raised.
		Why? Because the result of this method is a binary object that
		will ultimately be inserted in a multipart message stream which
		is pure binary.
		z
iso-8859-1s   --ó   
s   Content-Type: s   Content-ID: s   : zFailed headerr<   r+   N)Útyper   rM   r   r7   r   ÚitemsÚprintÚhasattrr<   r   r   r   )r'   r   Zcontent_typeZ
content_idr*   Zh_nameZh_valuer?   r	   r	   r
   Úadd_attachment~   s8    




zMultiPartWriter.add_attachmentc             C   s   | j  d| j d ¡ d S )Ns   --)r   r7   r   )r'   r	   r	   r
   Údone¨   s    zMultiPartWriter.done)rG   N)rC   rD   rE   r(   rS   rT   r	   r	   r	   r
   rF   t   s   
	*rF   c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚAttachmentHandlerc             C   s   d| _ i | _i | _d S )Nr   )Úcid_seqÚattachments_by_cidÚfs_attachments_map_cid)r'   r	   r	   r
   r(   ­   s    zAttachmentHandler.__init__c             C   s   |  j d7  _ d| j  S )Nr   zladon-attachment-%d)rV   )r'   r	   r	   r
   Úget_next_cid²   s    zAttachmentHandler.get_next_cidc             C   sˆ   t |jdƒrjtj |jj¡r„tj |jj¡}|| jkrZ|  ¡ }|| j|< || j	|< d| S d| j|  S n|  ¡ }|| j	|< d| S d S )NÚnamezcid:%s)
rR   Z	bufferobjr6   r,   ÚexistsrZ   ÚabspathrX   rY   rW   )r'   Z
attachmentZ
fs_abspathZcidr	   r	   r
   rS   ·   s    



z AttachmentHandler.add_attachmentN)rC   rD   rE   r(   rY   rS   r	   r	   r	   r
   rU   ¬   s   rU   Ú__main__z	test.jsonÚrbi N  s    493f4e46b6690ac551db9d306e7c5458)r   r9   r6   rL   rH   Zmysite.ladon.compatr   r   r   r   r-   r3   r   Úobjectr   rF   rU   rC   ÚopenÚfZmhrB   r   rQ   rK   r5   r   r	   r	   r	   r
   Ú<module>   s   (^8
