a
    xd                     @   s   d dl mZ d dlmZ d dlmZmZ d dlZd dlZd dl	Z	d dl
Z
dd Zdd Zd	d
 ZdddZdddZG dd deZdS )    )	BaseCodec)urlparse)DownloadedFileguess_extensionNc                 C   s<   t j| \}}d}t j| r8|d7 }d|||f } q| S )z
    Given a path like '/a/b/c.txt'

    Return the first available filename that doesn't already exist,
    using an incrementing suffix if needed.

    For example: '/a/b/c.txt' or '/a/b/c (1).txt' or '/a/b/c (2).txt'...
    r      z	%s (%d)%s)ospathsplitextexists)r   basenameextidx r   O/var/www/html/Ranjet/env/lib/python3.9/site-packages/coreapi/codecs/download.py_unique_output_path   s    	r   c                    s6   t j| } d d fdd| D  d} | S )zQ
    Sanitize output filenames, to remove any potentially unsafe characters.
    ) ._- c                 3   s"   | ]}|  s| v r|V  qd S N)isalnum).0charZkeepcharactersr   r   	<genexpr>#   s   z!_safe_filename.<locals>.<genexpr>r   )r   r   r   joinstrip)filenamer   r   r   _safe_filename   s    r   c              	   C   s   t |  }\}}d|v rlz:|d dd\}}}t|}|d|}t|W S  tt	fyj   Y n0 d|v r|d }t|S dS )zQ
    Determine an output filename based on the `Content-Disposition` header.
    z	filename*'   z
iso-8859-1r   N)
cgiparse_headersplitr   unquoteencodedecoder   
ValueErrorLookupError)content_dispositionparamsvaluecharsetlangr   r   r   r   &_get_filename_from_content_disposition+   s    

r/   c                 C   sX   t  | }t|jd}t|}t|p,d}|rHd|vrD|| S |S |rTd| S dS )zA
    Determine an output filename based on the download URL.
    /r   r   downloadN)r   	posixpathr   r   rstripr   r   )urlcontent_typeparsedZfinal_path_componentr   suffixr   r   r   _get_filename_from_urlA   s    
r8   c                 C   s.   d}|rt |}| r"|s"t| |}|s*dS |S )z?
    Determine an output filename to use for the download.
    N)r/   r8   )base_urlr5   r*   r   r   r   r   _get_filenameT   s    
r:   c                   @   s6   e Zd ZdZdZdZdddZedd Zd	d
 Z	dS )DownloadCodeczO
    A codec to handle raw file downloads, such as images and other media.
    z*/*r1   Nc                 C   s   |du | _ || _dS )zF
        `download_dir` - The path to use for file downloads.
        N)_delete_on_close_download_dir)selfdownload_dirr   r   r   __init__i   s    
zDownloadCodec.__init__c                 C   s   | j S r   )r=   )r>   r   r   r   r?   p   s    zDownloadCodec.download_dirc                 K   s   | d}| d}| d}tjdd\}}t|d}|| |  t|||}	|	d u rltj	|}	| j
}
|
d u rtj|}
tj|
|	}||krt|}t|| t|d}t||| jd}|	|_	|S )	Nr9   r5   r*   z	.download)r7   wbrb)delete)gettempfilemkstempr   fdopenwritecloser:   r   r   r=   dirnamer   r   renameopenr   r<   )r>   Z
bytestringoptionsr9   r5   r*   fdZ	temp_pathZfile_handleZoutput_filename
output_dirZoutput_pathZoutput_file
downloadedr   r   r   r'   t   s*    




zDownloadCodec.decode)N)
__name__
__module____qualname____doc__
media_typeformatr@   propertyr?   r'   r   r   r   r   r;   b   s   

r;   )N)NNN)Zcoreapi.codecs.baser   Zcoreapi.compatr   Zcoreapi.utilsr   r   r"   r   r2   rE   r   r   r/   r8   r:   r;   r   r   r   r   <module>   s   

