U
    nËjP*  ã                   @  sH  d dl mZ d dlZd dlmZmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZmZmZ ejr€d dlZd dlmZmZmZ ndzFzd dlZd d	lmZ W n( ek
rÂ   d dlZd d	lmZ Y nX W n ek
râ   dZdZY nX G d
d„ deƒZeG dd„ dƒƒZddddœdd„ZG dd„ deƒZG dd„ dƒZG dd„ dƒZdS )é    )ÚannotationsN)Ú	dataclassÚfield)ÚEnum)ÚSpooledTemporaryFile)Úunquote_plus)ÚFormDataÚHeadersÚ
UploadFile)ÚMultipartCallbacksÚQuerystringCallbacksÚparse_options_header)r   c                   @  s    e Zd ZdZdZdZdZdZdS )ÚFormMessageé   é   é   é   é   N)Ú__name__Ú
__module__Ú__qualname__ÚFIELD_STARTÚ
FIELD_NAMEÚ
FIELD_DATAÚ	FIELD_ENDÚEND© r   r   ú9/tmp/pip-unpacked-wheel-pzfrzqh9/starlette/formparsers.pyr      s
   r   c                   @  sV   e Zd ZU dZded< dZded< eed�Zded	< dZ	d
ed< ee
d�Zded< dS )ÚMultipartPartNzbytes | NoneÚcontent_dispositionÚ ÚstrÚ
field_name)Údefault_factoryÚ	bytearrayÚdatazUploadFile | NoneÚfilezlist[tuple[bytes, bytes]]Úitem_headers)r   r   r   r   Ú__annotations__r"   r   r$   r%   r&   Úlistr'   r   r   r   r   r   #   s
   
r   zbytes | bytearrayr!   )ÚsrcÚcodecÚreturnc              	   C  s4   z|   |¡W S  ttfk
r.   |   d¡ Y S X d S )Núlatin-1)ÚdecodeÚUnicodeDecodeErrorÚLookupError)r*   r+   r   r   r   Ú_user_safe_decode,   s    r1   c                   @  s   e Zd Zdddœdd„ZdS )ÚMultiPartExceptionr!   ÚNone)Úmessager,   c                 C  s
   || _ d S ©N)r4   ©Úselfr4   r   r   r   Ú__init__4   s    zMultiPartException.__init__N)r   r   r   r8   r   r   r   r   r2   3   s   r2   c                   @  s~   e Zd Zddddœdd„Zddœdd	„Zd
ddddœdd„Zd
ddddœdd„Zddœdd„Zddœdd„Zddœdd„Z	dS )Ú
FormParserr	   ú"typing.AsyncGenerator[bytes, None]r3   )ÚheadersÚstreamr,   c                 C  s&   t d k	stdƒ‚|| _|| _g | _d S )NúEThe `python-multipart` library must be installed to use form parsing.)Ú	multipartÚAssertionErrorr;   r<   Úmessages)r7   r;   r<   r   r   r   r8   9   s    zFormParser.__init__©r,   c                 C  s   t jdf}| j |¡ d S ©Nó    )r   r   r@   Úappendr6   r   r   r   Úon_field_start?   s    
zFormParser.on_field_startÚbytesÚint©r%   ÚstartÚendr,   c                 C  s"   t j|||… f}| j |¡ d S r5   )r   r   r@   rD   ©r7   r%   rI   rJ   r4   r   r   r   Úon_field_nameC   s    zFormParser.on_field_namec                 C  s"   t j|||… f}| j |¡ d S r5   )r   r   r@   rD   rK   r   r   r   Úon_field_dataG   s    zFormParser.on_field_datac                 C  s   t jdf}| j |¡ d S rB   )r   r   r@   rD   r6   r   r   r   Úon_field_endK   s    
zFormParser.on_field_endc                 C  s   t jdf}| j |¡ d S rB   )r   r   r@   rD   r6   r   r   r   Úon_endO   s    
zFormParser.on_endr   c                 Ã  sø   | j | j| j| j| jdœ}t |¡}d}d}g }| j2 z¶3 d H W }|rR| |¡ n| 	¡  t
| jƒ}| j ¡  |D ]x\}}	|tjkrŽd}d}qr|tjkr¢||	7 }qr|tjkr¶||	7 }qr|tjkrrt| d¡ƒ}
t| d¡ƒ}| |
|f¡ qrq66 t|ƒS )N)rE   rL   rM   rN   rO   rC   r-   )rE   rL   rM   rN   rO   r>   ZQuerystringParserr<   ÚwriteÚfinalizer)   r@   Úclearr   r   r   r   r   r   r.   rD   r   )r7   Ú	callbacksÚparserr"   Zfield_valueÚitemsÚchunkr@   Zmessage_typeÚmessage_bytesÚnameÚvaluer   r   r   ÚparseS   s:    û	








zFormParser.parseN)
r   r   r   r8   rE   rL   rM   rN   rO   rZ   r   r   r   r   r9   8   s   r9   c                   @  sÂ   e Zd ZdZddddœddddddd	œd
d„Zddœdd„Zdddddœdd„Zddœdd„Zdddddœdd„Zdddddœdd„Z	ddœdd„Z
ddœdd„Zddœdd„Zddœd d!„Zd"S )#ÚMultiPartParseri   iè  )Ú	max_filesÚ
max_fieldsÚmax_part_sizer	   r:   zint | floatrG   r3   )r;   r<   r\   r]   r^   r,   c                C  sp   t d k	stdƒ‚|| _|| _|| _|| _g | _d| _d| _d| _	d| _
tƒ | _d| _g | _g | _g | _|| _d S )Nr=   r   rC   r    )r>   r?   r;   r<   r\   r]   rU   Ú_current_filesÚ_current_fieldsÚ_current_partial_header_nameÚ_current_partial_header_valuer   Ú_current_partÚ_charsetÚ_file_parts_to_writeÚ_file_parts_to_finishÚ_files_to_close_on_errorr^   )r7   r;   r<   r\   r]   r^   r   r   r   r8      s     	zMultiPartParser.__init__rA   c                 C  s   t ƒ | _d S r5   )r   rc   ©r7   r   r   r   Úon_part_begin™   s    zMultiPartParser.on_part_beginrF   rH   c                 C  sr   |||… }| j jd kr\t| j jƒt|ƒ | jkrLtdt| jd ƒ› d�ƒ‚| j j |¡ n| j 	| j |f¡ d S )NzPart exceeded maximum size of i   zKB.)
rc   r&   Úlenr%   r^   r2   rG   Úextendre   rD   )r7   r%   rI   rJ   rW   r   r   r   Úon_part_dataœ   s    zMultiPartParser.on_part_datac                 C  sX   | j jd kr.| j | j jt| j j| jƒf¡ n&| j | j ¡ | j | j j| j jf¡ d S r5   )	rc   r&   rU   rD   r"   r1   r%   rd   rf   rh   r   r   r   Úon_part_end¥   s    þÿzMultiPartParser.on_part_endc                 C  s   |  j |||… 7  _ d S r5   )ra   ©r7   r%   rI   rJ   r   r   r   Úon_header_field´   s    zMultiPartParser.on_header_fieldc                 C  s   |  j |||… 7  _ d S r5   )rb   rn   r   r   r   Úon_header_value·   s    zMultiPartParser.on_header_valuec                 C  s@   | j  ¡ }|dkr| j| j_| jj || jf¡ d| _ d| _d S )Ns   content-dispositionrC   )ra   Úlowerrb   rc   r   r'   rD   )r7   r   r   r   r   Úon_header_endº   s    

zMultiPartParser.on_header_endc                 C  sú   t | jjƒ\}}zt|d | jƒ| j_W n tk
rD   tdƒ‚Y nX d|krÂ|  jd7  _| j| j	krztd| j	› d�ƒ‚t|d | jƒ}t
| jd�}| j |¡ t|d|t| jjd	�d
�| j_n4|  jd7  _| j| jkrîtd| j› d�ƒ‚d | j_d S )Ns   namez=The Content-Disposition header field "name" must be provided.s   filenamer   z+Too many files. Maximum number of files is Ú.)Úmax_sizer   )Úraw)r&   ÚsizeÚfilenamer;   z-Too many fields. Maximum number of fields is )r   rc   r   r1   rd   r"   ÚKeyErrorr2   r_   r\   r   Úmax_file_sizerg   rD   r
   r	   r'   r&   r`   r]   )r7   ÚdispositionÚoptionsrw   Útempfiler   r   r   Úon_headers_finishedÂ   s,    üz#MultiPartParser.on_headers_finishedc                 C  s   d S r5   r   rh   r   r   r   rO   Û   s    zMultiPartParser.on_endr   c              
   Ã  sr  t | jd ƒ\}}| dd¡}t|tƒr2| d¡}|| _z|d }W n tk
r`   tdƒ‚Y nX | j	| j
| j| j| j| j| j| jdœ}t ||¡}zŒ| j2 z~3 d H W }| |¡ | jD ]$\}}	|jsÊt‚|j |	¡I d H  q¸| jD ] }|jsòt‚|j d¡I d H  qä| j ¡  | j ¡  qœ6 W n> tk
�r^ }
 z| jD ]}| ¡  �q:|
‚W 5 d }
~
X Y nX | ¡  t| jƒS )	NzContent-Types   charsetzutf-8r-   s   boundaryzMissing boundary in multipart.)ri   rl   rm   ro   rp   rr   r}   rO   r   ) r   r;   ÚgetÚ
isinstancerF   r.   rd   rx   r2   ri   rl   rm   ro   rp   rr   r}   rO   r>   ZMultipartParserr<   rP   re   r&   r?   rf   ÚseekrR   rg   ÚcloserQ   r   rU   )r7   Ú_ÚparamsÚcharsetÚboundaryrS   rT   rV   Úpartr%   Úexcr&   r   r   r   rZ   Þ   sH    

ø





zMultiPartParser.parseN)r   r   r   ry   r8   ri   rl   rm   ro   rp   rr   r}   rO   rZ   r   r   r   r   r[   |   s   ù	r[   ) Ú
__future__r   ÚtypingZdataclassesr   r   Úenumr   r|   r   Úurllib.parser   Zstarlette.datastructuresr   r	   r
   ÚTYPE_CHECKINGr>   Zmultipart.multipartr   r   r   Zpython_multipartZpython_multipart.multipartÚModuleNotFoundErrorr   r   r1   Ú	Exceptionr2   r9   r[   r   r   r   r   Ú<module>   s4   
D