o
    miW                     @  s>   d dl mZ d dlZd dlZdddZdd
dZdddZdS )    )annotationsNfilenamestrreturn
str | Nonec                 C  s@   |    d} | sd S | dddd } | r| dv rd S | S )N"'\/>   z...)stripreplacesplit)r    r   U/home/kim/smarthome/.venv/lib/python3.10/site-packages/rdflib/contrib/graphdb/util.pysanitize_filename   s   r   headerc              	   C  s   | sdS d}d}|  dD ]~}| }| }|drx|tdd  }| d}z| dd\}}| dd\}}	W n tyL   d}|}	Y nw ztj|	}
|
j	|dd	}W n t
yr   tj|	}
|
j	ddd	}Y nw t|}q|d
r|td
d  }t|}q|p|S )zExtract filename from Content-Disposition header.

    Supports both ``filename=`` and RFC 5987 ``filename*=``; prefers ``filename*=``
    when present. Returned filenames are sanitized to prevent path traversal.
    N;z
filename*=r   '   zutf-8r   )errorsz	filename=)r   r   lower
startswithlen
ValueErrorurllibparseunquote_to_bytesdecodeLookupErrorr   )r   Zfilename_starZfilename_plainpartr   valuecharsetrestZ	_languageencodedrawdecodedr   r   r   )extract_filename_from_content_disposition   s<   


r'   file_objt.Anyfallbackc                 C  s.   t | dd}t|tr|rt|}|r|S |S )zDInfer a safe filename from a file-like object's ``.name`` attribute.nameN)getattr
isinstancer   r   )r(   r*   r+   inferredr   r   r   infer_filename_from_fileobj7   s   r/   )r   r   r   r   )r   r   r   r   )r(   r)   r*   r   r   r   )	
__future__r   typingturllib.parser   r   r'   r/   r   r   r   r   <module>   s    


&