a
    m b	  ã                   @   sl   d dl Z d dlZd dlZd dlmZ 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dS )
é    N)Úrun_sync)Úweb)ÚAsyncFileContentsManager)ÚFileContentsManagerc                       s*   e Zd ZdZd‡ fdd„	Zdd„ Z‡  ZS )ÚLargeFileManagerzHandle large file upload.Ú c              
      s†  |  dd¡}|durp| d¡}| j||d d|vrBt dd¡‚|d dkrdt dd	 |d ¡¡‚d
|vr„|d dkr„t dd¡‚|  |¡}| j d|¡ zD|dkrÆt	t
| ƒ ||d
 |  d¡¡ n|  ||d
 |  d¡¡ W nd tjyö   ‚ Y nP tyD } z6| jjd||dd t dd||f ¡|‚W Y d}~n
d}~0 0 | j |dd}|dkrl| j||d |S t	t
| ƒ ||¡S dS )ú9Save the file model and return the model with no content.ÚchunkNú/©ÚmodelÚpathÚtypeé  úNo file type providedÚfileú7File type "{}" is not supported for large file transferÚcontentÚ	directoryúNo file content providedú	Saving %sé   ÚformatúError while saving file: %s %sT©Úexc_infoéô  ú)Unexpected error while saving file: %s %sF©r   éÿÿÿÿ©r   Úos_path)ÚgetÚstripÚrun_pre_save_hookr   Ú	HTTPErrorr   Ú_get_os_pathÚlogÚdebugÚsuperr   Ú
_save_fileÚ_save_large_fileÚ	ExceptionÚerrorÚrun_post_save_hookÚsave©Úselfr   r   r	   r!   Úe©Ú	__class__© úPlib/python3.9/site-packages/jupyter_server/services/contents/largefilemanager.pyr/      sJ    

ÿþ

ÿÿþ
zLargeFileManager.savec              
   C   s  |dvrt  dd¡‚z,|dkr*| d¡}n| d¡}t |¡}W n: tyz } z"t  dd||f ¡|‚W Y d}~n
d}~0 0 |  |¡n tj 	|¡r°tj 
tj |¡t |¡¡}t |d	¡}| |¡ W d  ƒ n1 sÜ0    Y  W d  ƒ n1 sú0    Y  dS ©
zSave content of a generic file.>   ÚtextÚbase64r   z:Must specify format of file contents as 'text' or 'base64'r8   Úutf8ÚasciizEncoding error saving %s: %sNÚab)r   r%   Úencoder9   Ú	b64decoder,   Úperm_to_403Úosr   ÚislinkÚjoinÚdirnameÚreadlinkÚioÚopenÚwrite©r1   r!   r   r   ZbcontentZ	b64_bytesr2   Úfr5   r5   r6   r+   >   s"    þ
,z!LargeFileManager._save_large_file)r   ©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r/   r+   Ú__classcell__r5   r5   r3   r6   r      s   /r   c                       s*   e Zd ZdZd‡ fdd„	Zdd„ Z‡  ZS )ÚAsyncLargeFileManagerz'Handle large file upload asynchronouslyr   c              
   ƒ   s   |  dd¡}|dur„| d¡}|  |¡}| j d|¡ | j||d d|vrZt dd¡‚|d d	kr|t dd
 |d ¡¡‚d|vrœ|d dkrœt dd¡‚zP|dkrÌt	t
| ƒ ||d |  d¡¡I dH  n|  ||d |  d¡¡I dH  W nf tjy   ‚ Y nP tyR } z6| jjd||dd t dd||f ¡|‚W Y d}~n
d}~0 0 | j |ddI dH }|dkr€| j||d |S t	t
| ƒ ||¡I dH S dS )r   r	   Nr
   r   r   r   r   r   r   r   r   r   r   r   r   r   Tr   r   r   Fr   r   r    )r"   r#   r&   r'   r(   r$   r   r%   r   r)   rP   r*   r+   r,   r-   r.   r/   r0   r3   r5   r6   r/   X   sJ    


ÿþ
ÿ"ÿþ
zAsyncLargeFileManager.savec              
   Ã   s  |dvrt  dd¡‚z,|dkr*| d¡}n| d¡}t |¡}W n: tyz } z"t  dd||f ¡|‚W Y d}~n
d}~0 0 |  |¡v tj 	|¡r°tj 
tj |¡t |¡¡}t |d	¡"}t|j|ƒI dH  W d  ƒ n1 sä0    Y  W d  ƒ n1 s0    Y  dS r7   )r   r%   r=   r9   r>   r,   r?   r@   r   rA   rB   rC   rD   rE   rF   r   rG   rH   r5   r5   r6   r+   †   s"    þ
,z&AsyncLargeFileManager._save_large_file)r   rJ   r5   r5   r3   r6   rP   U   s   .rP   )r9   rE   r@   Zanyio.to_threadr   Ztornador   Z,jupyter_server.services.contents.filemanagerr   r   r   rP   r5   r5   r5   r6   Ú<module>   s   I