
    rf                         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 Zd Zd ZddZdd	Z G d
 de          ZdS )    )	BaseCodec)urlparse)DownloadedFileguess_extensionNc                     t           j                            |           \  }}d}t           j                            |           r,|dz  }d|||fz  } t           j                            |           ,| 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idxs       T/var/www/html/software/conda/lib/python3.11/site-packages/coreapi/codecs/download.py_unique_output_pathr      sq     G$$T**MHc
C
'..

 2qhS11 '..

 2 K    c                     t           j                            |           } dd                    fd| D                                                                           d          } | S )zQ
    Sanitize output filenames, to remove any potentially unsafe characters.
    ) ._- c              3   L   K   | ]}|                                 s|v |V  d S N)isalnum).0charkeepcharacterss     r   	<genexpr>z!_safe_filename.<locals>.<genexpr>#   sJ        <<>>!^33 	3333 r   r   )r	   r
   r   joinstrip)filenamer   s    @r   _safe_filenamer#      sw     w))H)Nww    !     eggeeCjj 
 Or   c                 |   t          j        |           x}\  }}d|v r	 |d                             dd          \  }}}t          j        |          }|                    d                              |          }t          |          S # t          t          f$ r Y nw xY w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"   s         r   &_get_filename_from_content_dispositionr4   +   s     !-.ABBBF]UFf	&,[&9&?&?a&H&H#GT8'11H|44;;GDDH!(+++K( 	 	 	D	 V*%h'''4s   A*B
 
BBc                     t          j         |           }t          j        |j                            d                    }t          |          }t          |pd          }|rd|vr||z   S |S |rd|z   S dS )zA
    Determine an output filename based on the download URL.
    /r   r   downloadN)r   	posixpathr   r
   rstripr#   r   )urlcontent_typeparsedfinal_path_componentr"   suffixs         r   _get_filename_from_urlr?   A   s     s##F$-fk.@.@.E.EFF233H\/R00F #hf$$	 #F""4r   c                 \    d}|rt          |          }| r|st          | |          }|sdS |S )z?
    Determine an output filename to use for the download.
    N)r4   r?   )base_urlr;   r/   r"   s       r   _get_filenamerB   T   sR     H O9:MNN B B)(LAA tOr   c                   >    e Zd ZdZdZdZddZed             Zd Z	dS )	DownloadCodeczO
    A codec to handle raw file downloads, such as images and other media.
    z*/*r7   Nc                 &    |du | _         || _        dS )zF
        `download_dir` - The path to use for file downloads.
        N)_delete_on_close_download_dir)selfdownload_dirs     r   __init__zDownloadCodec.__init__i   s     !- 4)r   c                     | j         S r   )rG   )rH   s    r   rI   zDownloadCodec.download_dirp   s    !!r   c                    |                     d          }|                     d          }|                     d          }t          j        d          \  }}t          j        |d          }|                    |           |                                 t          |||          }	|	t          j        	                    |          }	| j
        }
|
t          j                            |          }
t          j                            |
|	          }||k    r$t          |          }t          j        ||           t          |d          }t!          ||| j                  }|	|_	        |S )	NrA   r;   r/   z	.download)r>   wbrb)delete)gettempfilemkstempr	   fdopenwritecloserB   r
   r   rG   dirnamer    r   renameopenr   rF   )rH   
bytestringoptionsrA   r;   r/   fd	temp_pathfile_handleoutput_filename
output_diroutput_pathoutput_file
downloadeds                 r   r,   zDownloadCodec.decodet   sR   ;;z**{{>22%kk*?@@ !(<<<IiD))*%%% (,@STT" g..y99O '
33J gll:?? )##-k::KIi--- ;--#KTEZ[[[
-
r   r   )
__name__
__module____qualname____doc__
media_typeformatrJ   propertyrI   r,    r   r   rD   rD   b   sh          JF* * * * " " X"! ! ! ! !r   rD   r   )NNN)coreapi.codecs.baser   coreapi.compatr   coreapi.utilsr   r   r'   r	   r8   rQ   r   r#   r4   r?   rB   rD   rj   r   r   <module>rn      s    ) ) ) ) ) ) # # # # # # 9 9 9 9 9 9 9 9 



 				       "    ,   &   3 3 3 3 3I 3 3 3 3 3r   