U ��.ei!�@s�ddlmZddlZddlZddlZddlmZddd�Zdd �Z d d d d �Z e � d d�e dd�D��dd�Z dd�ZeZGdd�de�ZdS)�)�absolute_importN�)�six�application/octet-streamcCs|rt�|�dp|S|S)z� Guess the "Content-Type" of a file. :param filename: The filename to guess the "Content-Type" of using :mod:`mimetypes`. :param default: If no "Content-Type" can be guessed, default to `default`. r)� mimetypesZ guess_type)�filename�default�r �>/usr/lib/python3.8/site-packages/pip/_vendor/urllib3/fields.py�guess_content_type s r c s�t�tj�r��d��t�fdd�dD��sdd|�f}z|�d�Wnttfk r^YnX|Stjrt��d��t j � �d��d|�f�tjr���d���S)a� Helper function to format and quote a single header parameter using the strategy defined in RFC 2231. Particularly useful for header parameters which might contain non-ASCII values, like file names. This follows RFC 2388 Section 4.4. :param name: The name of the parameter, a string expected to be ASCII only. :param value: The value of the parameter, provided as ``bytes`` or `str``. :ret: An RFC-2231-formatted unicode string. �utf-8c3s|]}|�kVqdS�Nr )�.0Zch��valuer r � )sz.format_header_param_rfc2231..z"\ �%s="%s"�asciiz%s*=%s) � isinstancer� binary_type�decode�any�encode�UnicodeEncodeError�UnicodeDecodeErrorZPY2�emailZutilsZencode_rfc2231)�namer�resultr rr �format_header_param_rfc2231s       rz%22z\\)�"�\r cCs&i|]}|dkrt�|�d�|��qS))�z%{:02X})rZunichr�format)rZccr r r � Is�r#� cs:�fdd�}t�d�dd����D���}|�||�}|S)Ncs�|�d�S)Nr)�group)�match��needles_and_replacementsr r �replacerRsz#_replace_multiple..replacer�|cSsg|]}t�|��qSr )�re�escape)rZneedler r r � Vsz%_replace_multiple..)r+�compile�join�keys�sub)rr(r)�patternrr r'r �_replace_multipleQs  � r3cCs,t|tj�r|�d�}t|t�}d||fS)a� Helper function to format and quote a single header parameter using the HTML5 strategy. Particularly useful for header parameters which might contain non-ASCII values, like file names. This follows the `HTML5 Working Draft Section 4.10.22.7`_ and matches the behavior of curl and modern browsers. .. _HTML5 Working Draft Section 4.10.22.7: https://w3c.github.io/html/sec-forms.html#multipart-form-data :param name: The name of the parameter, a string expected to be ASCII only. :param value: The value of the parameter, provided as ``bytes`` or `str``. :ret: A unicode string, stripped of troublesome characters. r r)rrrrr3�_HTML5_REPLACEMENTS)rrr r r �format_header_param_html5^s   r5c@sReZdZdZddefdd�Zeefdd��Zdd�Zd d �Z d d �Z dd d�Z dS)� RequestFielda A data container for request body parameters. :param name: The name of this request field. Must be unicode. :param data: The data/value body. :param filename: An optional filename of the request field. Must be unicode. :param headers: An optional dict-like object of headers to initially use for the field. :param header_formatter: An optional callable that is used to encode and format the headers. By default, this is :func:`format_header_param_html5`. NcCs0||_||_||_i|_|r&t|�|_||_dSr )�_name� _filename�data�headers�dict�header_formatter)�selfrr9rr:r<r r r �__init__�s zRequestField.__init__cCs`t|t�r4t|�dkr"|\}}}q@|\}}t|�}n d}d}|}|||||d�}|j|d�|S)a� A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters. Supports constructing :class:`~urllib3.fields.RequestField` from parameter of key/value strings AND key/filetuple. A filetuple is a (filename, data, MIME type) tuple where the MIME type is optional. For example:: 'foo': 'bar', 'fakefile': ('foofile.txt', 'contents of foofile'), 'realfile': ('barfile.txt', open('realfile').read()), 'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'), 'nonamefile': 'contents of nonamefile field', Field names and filenames must be unicode. �N)rr<)� content_type)r�tuple�lenr �make_multipart)�clsZ fieldnamerr<rr9r@Z request_paramr r r � from_tuples�s     � zRequestField.from_tuplescCs |�||�S)aI Overridable helper function to format a single header parameter. By default, this calls ``self.header_formatter``. :param name: The name of the parameter, a string expected to be ASCII only. :param value: The value of the parameter, provided as a unicode string. )r<)r=rrr r r � _render_part�s zRequestField._render_partcCsLg}|}t|t�r|��}|D]"\}}|dk r|�|�||��qd�|�S)aO Helper function to format and quote a single header. Useful for single headers that are composed of multiple items. E.g., 'Content-Disposition' fields. :param header_parts: A sequence of (k, v) tuples or a :class:`dict` of (k, v) to format as `k1="v1"; k2="v2"; ...`. N�; )rr;�items�appendrFr/)r=Z header_parts�parts�iterablerrr r r � _render_parts�s   zRequestField._render_partscCs�g}dddg}|D]*}|j�|d�r|�d||j|f�q|j��D]&\}}||krH|rH|�d||f�qH|�d�d�|�S)z= Renders the headers for this request field. �Content-Disposition� Content-Type�Content-LocationFz%s: %sz )r:�getrIrHr/)r=�linesZ sort_keysZsort_keyZ header_nameZ header_valuer r r �render_headers�s  zRequestField.render_headersc CsX|pd|jd<|jdd�d|�d|jfd|jff�g�7<||jd<||jd<d S) a| Makes this request field into a multipart request field. This method overrides "Content-Disposition", "Content-Type" and "Content-Location" headers to the request parameter. :param content_type: The 'Content-Type' of the request body. :param content_location: The 'Content-Location' of the request body. z form-datarMrG�rrrNrON)r:r/rLr7r8)r=Zcontent_dispositionr@Zcontent_locationr r r rC�s��� zRequestField.make_multipart)NNN) �__name__� __module__� __qualname__�__doc__r5r>� classmethodrErFrLrRrCr r r r r6}s� # �r6)r)Z __future__rZ email.utilsrrr+Zpackagesrr rr4�update�ranger3r5Zformat_header_param�objectr6r r r r �s&   *���