B
    0*™\X`  ã               @   sæ   d ddgZ ddlZddlZddlZddlZddlmZ ddlmZ	 e	j
Z
dZdZd	Zd
ZdZdZdZe
dƒZe
dƒZe dejejB ¡Ze d¡Ze d¡ZejjZdd„ Zddd„ZG dd „ d ƒZG dd„ dƒZG dd„ de ƒZ!dS )ÚHeaderÚdecode_headerÚmake_headeré    N)ÚHeaderParseError)ÚcharsetÚ
ú ó    z        Ú éN   z 	zus-asciizutf-8ai  
  =\?                   # literal =?
  (?P<charset>[^?]*?)   # non-greedy up to the next ? is the charset
  \?                    # literal ?
  (?P<encoding>[qQbB])  # either a "q" or a "b", case insensitive
  \?                    # literal ?
  (?P<encoded>.*?)      # non-greedy up to the next ?= is the encoded string
  \?=                   # literal ?=
  z[\041-\176]+:$z
\n[^ \t]+:c          	   C   s°  t | dƒrdd„ | jD ƒS t | ¡s.| d fgS g }x|  ¡ D ]„}t |¡}d}xp|r¾| d¡}|rn| ¡ }d}|r‚| |d d f¡ |rP| d¡ 	¡ }| d¡ 	¡ }| d¡}| |||f¡ qPW q<W g }	xVt
|ƒD ]J\}
}|
dkrÒ|d rÒ||
d  d rÒ||
d  d  ¡ rÒ|	 |
d ¡ qÒW xt|	ƒD ]}||= q*W g }xÒ|D ]Ê\}}}|d krh| ||f¡ n¤|d	krŽtj |¡}| ||f¡ n~|d
kr t|ƒd }|r¾|dd d| … 7 }ytj |¡}W n  tjk
rî   tdƒ‚Y nX | ||f¡ ntd| ƒ‚qDW g }d  }}x~|D ]v\}}t|tƒrBt|dƒ}|d krV|}|}nB||krx| ||f¡ |}|}n |d kr|t| 7 }n||7 }q$W | ||f¡ |S )NÚ_chunksc             S   s(   g | ] \}}t  |t|ƒ¡t|ƒf‘qS © )Ú_charsetZ_encodeÚstr)Ú.0Ústringr   r   r   ú7C:\ALexclude\prg\programme\Python37\Lib\email\header.pyú
<listcomp>M   s   z!decode_header.<locals>.<listcomp>Tr   Fé   é   ÚqÚbé   z===zBase64 decoding errorzUnexpected encoding: zraw-unicode-escape)Úhasattrr   ÚecreÚsearchÚ
splitlinesÚsplitÚpopÚlstripÚappendÚlowerÚ	enumerateÚisspaceÚreversedÚemailÚ
quoprimimeZheader_decodeÚlenZ
base64mimeÚdecodeÚbinasciiÚErrorr   ÚAssertionErrorÚ
isinstancer   ÚbytesÚBSPACE)ÚheaderZwordsÚlineÚpartsÚfirstZ	unencodedr   ÚencodingZencodedZdroplistÚnÚwÚdZdecoded_wordsZencoded_stringZwordZpaderrZ	collapsedZ	last_wordÚlast_charsetr   r   r   r   =   sz    






4






c             C   sJ   t |||d}x6| D ].\}}|d k	r6t|tƒs6t|ƒ}| ||¡ qW |S )N)Ú
maxlinelenÚheader_nameÚcontinuation_ws)r   r,   ÚCharsetr    )Zdecoded_seqr8   r9   r:   ÚhÚsr   r   r   r   r   œ   s    c               @   sJ   e Zd Zddd„Zdd„ Zdd	„ Zdd
d„Zdd„ Zddd„Zdd„ Z	dS )r   Nr   Ústrictc             C   s|   |d krt }nt|tƒs t|ƒ}|| _|| _g | _|d k	rH|  |||¡ |d krTt}|| _|d krjd| _	nt
|ƒd | _	d S )Nr   r   )ÚUSASCIIr,   r;   r   Ú_continuation_wsr   r    Ú
MAXLINELENÚ_maxlinelenÚ
_headerlenr'   )Úselfr=   r   r8   r9   r:   Úerrorsr   r   r   Ú__init__´   s    
zHeader.__init__c       	      C   sÈ   |   ¡  g }d }d }x¨| jD ]ž\}}|}|tjkrJ| dd¡}| dd¡}|rš|o^|  |d ¡}|dkr„|dkrš|sš| t¡ d }n|dkrš|sš| t¡ |oª|  |d ¡}|}| |¡ qW t	 
|¡S )NÚasciiÚsurrogateescapeÚreplacer   )Nzus-asciiéÿÿÿÿ)Ú
_normalizer   r   ÚUNKNOWN8BITÚencoder(   Ú	_nonctextr    ÚSPACEÚEMPTYSTRINGÚjoin)	rD   ZuchunksÚlastcsÚ	lastspacer   r   ZnextcsZoriginal_bytesÚhasspacer   r   r   Ú__str__ã   s*    


zHeader.__str__c             C   s   |t | ƒkS )N)r   )rD   Úotherr   r   r   Ú__eq__  s    zHeader.__eq__c             C   s¶   |d kr| j }nt|tƒs"t|ƒ}t|tƒsZ|jp4d}|t jkrN| dd¡}n| ||¡}|jpbd}|t jkr¢y| ||¡ W n" t	k
r    |dkr˜‚ t
}Y nX | j ||f¡ d S )Nzus-asciirH   )r   r,   r;   r   Zinput_codecrL   r(   Zoutput_codecrM   ÚUnicodeEncodeErrorÚUTF8r   r    )rD   r=   r   rE   Zinput_charsetÚoutput_charsetr   r   r   r    	  s$    






zHeader.appendc             C   s   |  ¡ p|dkS )N)ú(ú)ú\)r#   )rD   r=   r   r   r   rN   4  s    zHeader._nonctextú;, 	r   c             C   sª  |   ¡  |d kr| j}|dkr"d}t| j|| j|ƒ}d }d  }}x.| jD ]"\}}	|d k	r |ol|  |d ¡}|dkrŒ|r‚|	dkr | ¡  n|	dkr |s | ¡  |o°|  |d ¡}|	}d}| ¡ }
|
rÚ| 	d|
d |	¡ n| 	dd|	¡ xp|
dd … D ]`}| 
¡  |	jd k	r(| 	| jd| ¡  |	¡ qö| ¡ }|d t|ƒt|ƒ … }| 	|||	¡ qöW t|
ƒdkrJ| 
¡  qJW | jr‚| ¡  | |¡}t |¡r¦td	 |¡ƒ‚|S )
Nr   i@B )Nzus-asciirJ   Fr
   r   r   z8header value appears to contain an embedded header: {!r})rK   rB   Ú_ValueFormatterrC   r@   r   rN   Úadd_transitionr   ÚfeedÚnewlineÚheader_encodingr   r'   Ú_strÚ_embedded_headerr   r   Úformat)rD   Ú
splitcharsr8   ÚlinesepÚ	formatterrR   rT   rS   r   r   Úlinesr0   ZslineÚfwsÚvaluer   r   r   rM   9  sR    !


zHeader.encodec             C   s|   g }d }g }xL| j D ]B\}}||kr0| |¡ q|d k	rL| t |¡|f¡ |g}|}qW |rr| t |¡|f¡ || _ d S )N)r   r    rO   rQ   )rD   Zchunksr7   Z
last_chunkr   r   r   r   r   rK   ‰  s    zHeader._normalize)NNNNr   r>   )Nr>   )r^   Nr   )
Ú__name__Ú
__module__Ú__qualname__rF   rU   rW   r    rN   rM   rK   r   r   r   r   r   ³   s     
- 
+
Pc               @   sT   e Z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 )r_   c             C   s0   || _ || _t|ƒ| _|| _g | _t|ƒ| _d S )N)Ú_maxlenr@   r'   Ú_continuation_ws_lenÚ_splitcharsÚ_linesÚ_AccumulatorÚ_current_line)rD   Z	headerlenÚmaxlenr:   rg   r   r   r   rF   ž  s    
z_ValueFormatter.__init__c             C   s   |   ¡  | | j¡S )N)rb   rQ   rs   )rD   rh   r   r   r   rd   ¦  s    z_ValueFormatter._strc             C   s
   |   t¡S )N)rd   ÚNL)rD   r   r   r   rU   ª  s    z_ValueFormatter.__str__c             C   sp   | j  ¡ }|dkr| j j|Ž  t| j ƒdkrb| j  ¡ rP| jd  t| j ƒ7  < n| j t| j ƒ¡ | j  ¡  d S )N)r   r
   r   rJ   )	ru   r   Úpushr'   Ú	is_onlywsrs   r   r    Úreset)rD   Zend_of_liner   r   r   rb   ­  s    

z_ValueFormatter.newlinec             C   s   | j  dd¡ d S )Nr   r
   )ru   rx   )rD   r   r   r   r`   ¸  s    z_ValueFormatter.add_transitionc             C   sÄ   |j d kr|  ||| j¡ d S | ||  ¡ ¡}y| d¡}W n tk
rP   d S X |d k	rf|  ||¡ y| ¡ }W n tk
r†   d S X |  ¡  | j	 
| j|¡ x|D ]}| j | j| ¡ q¦W d S )Nr   )rc   Ú_ascii_splitrr   Zheader_encode_linesÚ_maxlengthsr   Ú
IndexErrorÚ_append_chunkrb   ru   rx   r@   rs   r    )rD   rk   r   r   Zencoded_linesZ
first_lineÚ	last_liner0   r   r   r   ra   »  s$    

z_ValueFormatter.feedc             c   s*   | j t| jƒ V  x| j | j V  qW d S )N)rp   r'   ru   rq   )rD   r   r   r   r|   à  s    z_ValueFormatter._maxlengthsc             C   sj   t  dt d || ¡}|d r0dg|d d…< n
| d¡ x*tt|ƒgd Ž D ]\}}|  ||¡ qNW d S )Nz([z]+)r   r
   r   )Úrer   ÚFWSr   ÚzipÚiterr~   )rD   rk   r   rg   r1   Úpartr   r   r   r{   æ  s    
z_ValueFormatter._ascii_splitc             C   s
  | j  ||¡ t| j ƒ| jkrxº| jD ]t}xlt| j  ¡ d ddƒD ]P}| ¡ rp| j | d }|rp|d |krpP | j |d  d }|rD|d |krDP qDW q(P q(W | j  ¡ \}}| j j	dkrÊ|  
¡  |sÊd}| j  ||¡ d S | j  |¡}| j t| j ƒ¡ | j  |¡ d S )Nr   r   rJ   r   )ru   rx   r'   rp   rr   ÚrangeÚ
part_countr#   r   Ú_initial_sizerb   Úpop_fromrs   r    r   rz   )rD   rk   r   ZchÚiZprevpartr„   Z	remainderr   r   r   r~   ü  s.    z_ValueFormatter._append_chunkN)rm   rn   ro   rF   rd   rU   rb   r`   ra   r|   r{   r~   r   r   r   r   r_     s   %r_   c                   sj   e Zd Zd‡ fdd„	Zdd„ Zddd„Z‡ fdd	„Zd
d„ Zdd„ Zddd„Z	dd„ Z
‡ fdd„Z‡  ZS )rt   r   c                s   || _ tƒ  ¡  d S )N)r‡   ÚsuperrF   )rD   Zinitial_size)Ú	__class__r   r   rF     s    z_Accumulator.__init__c             C   s   |   ||f¡ d S )N)r    )rD   rk   r   r   r   r   rx   #  s    z_Accumulator.pushc             C   s   | |d … }g | |d …< |S )Nr   )rD   r‰   Zpoppedr   r   r   rˆ   &  s    z_Accumulator.pop_fromc                s   |   ¡ dkrdS tƒ  ¡ S )Nr   )r
   r
   )r†   rŠ   r   )rD   )r‹   r   r   r   +  s    z_Accumulator.popc             C   s   t dd„ | D ƒ| jƒS )Nc             s   s"   | ]\}}t |ƒt |ƒ V  qd S )N)r'   )r   rk   r„   r   r   r   ú	<genexpr>1  s    z'_Accumulator.__len__.<locals>.<genexpr>)Úsumr‡   )rD   r   r   r   Ú__len__0  s    z_Accumulator.__len__c             C   s   t  dd„ | D ƒ¡S )Nc             s   s    | ]\}}t  ||f¡V  qd S )N)rP   rQ   )r   rk   r„   r   r   r   rŒ   5  s   z'_Accumulator.__str__.<locals>.<genexpr>)rP   rQ   )rD   r   r   r   rU   4  s    
z_Accumulator.__str__Nc             C   s"   |d krg }|| d d …< d| _ d S )Nr   )r‡   )rD   Zstartvalr   r   r   rz   8  s    z_Accumulator.resetc             C   s   | j dko|  pt| ƒ ¡ S )Nr   )r‡   r   r#   )rD   r   r   r   ry   >  s    z_Accumulator.is_onlywsc                s
   t ƒ  ¡ S )N)rŠ   rŽ   )rD   )r‹   r   r   r†   A  s    z_Accumulator.part_count)r   )r   )N)rm   rn   ro   rF   rx   rˆ   r   rŽ   rU   rz   ry   r†   Ú__classcell__r   r   )r‹   r   rt     s   

rt   )NNr   )"Ú__all__r€   r)   Zemail.quoprimimer%   Zemail.base64mimeZemail.errorsr   r   r   r;   rw   rO   r.   ZSPACE8rP   rA   r   r?   rY   ÚcompileÚVERBOSEÚ	MULTILINEr   Zfcrere   r&   Z_max_appendr   r   r   r_   Úlistrt   r   r   r   r   Ú<module>   s>   

_ 
 k 