
0c@_i!                 @   s   d  d l  m Z d  d l Z d  d l Z d  d l Z d d l m Z d d d  Z d d	   Z	 d
 d d d d d i Z
 e
 j d d   e d  d  D  d d   Z d d   Z e Z Gd d   d e  Z d S)    )absolute_importN   )sixzapplication/octet-streamc             C   s!   |  r t  j |   d p | 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   )	mimetypes
guess_type)filenamedefault r	   9/tmp/pip-build-jynh7p1z/pip/pip/_vendor/urllib3/fields.pyguess_content_type	   s    	r   c                s   t    t j  r!   j d    t   f d d   d D  s d |    f } y | j d  Wn t t f k
 r{ Yn X| St j r   j d    t	 j
 j   d    d |    f   t j r   j 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.
    zutf-8c             3   s   |  ] } |   k Vq d  S)Nr	   ).0ch)valuer	   r
   	<genexpr>)   s    z.format_header_param_rfc2231.<locals>.<genexpr>z"\
z%s="%s"asciiz%s*=%s)
isinstancer   binary_typedecodeanyencodeUnicodeEncodeErrorUnicodeDecodeErrorPY2emailutilsencode_rfc2231)namer   resultr	   )r   r
   format_header_param_rfc2231   s     		r   "z%22\z\\c             C   s7   i  |  ]- } | d k r d j  |  t j |   q S)   z%{:02X})r!   )formatr   unichr)r   ccr	   r	   r
   
<dictcomp>I   s   	r%      c                sS     f d d   } t  j d j d d     j   D   } | j | |   } | S)Nc                s     |  j  d  S)Nr   )group)match)needles_and_replacementsr	   r
   replacerR   s    z#_replace_multiple.<locals>.replacer|c             S   s   g  |  ] } t  j |   q Sr	   )reescape)r   Zneedler	   r	   r
   
<listcomp>V   s   	 z%_replace_multiple.<locals>.<listcomp>)r,   compilejoinkeyssub)r   r)   r*   patternr   r	   )r)   r
   _replace_multipleQ   s
    %r4   c             C   s>   t  | t j  r! | j d  } t | t  } d |  | f S)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.
    zutf-8z%s="%s")r   r   r   r   r4   _HTML5_REPLACEMENTS)r   r   r	   r	   r
   format_header_param_html5^   s    r6   c               @   sy   e  Z d  Z d Z d d e d d  Z e e d d   Z d d   Z d	 d
   Z	 d d   Z
 d d d d d  Z d S)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`.
    Nc             C   sF   | |  _  | |  _ | |  _ i  |  _ | r9 t |  |  _ | |  _ d  S)N)_name	_filenamedataheadersdictheader_formatter)selfr   r:   r   r;   r=   r	   r	   r
   __init__   s    				zRequestField.__init__c             C   s   t  | t  rN t |  d k r3 | \ } } } q` | \ } } t |  } n d } 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.
           Nr   r=   content_type)r   tuplelenr   make_multipart)cls	fieldnamer   r=   r   r:   rA   request_paramr	   r	   r
   from_tuples   s    zRequestField.from_tuplesc             C   s   |  j  | |  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>   r   r   r	   r	   r
   _render_part   s    zRequestField._render_partc             C   sp   g  } | } t  | t  r' | j   } x9 | D]1 \ } } | d k	 r. | j |  j | |   q. Wd j |  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"; ...`.
        Nz; )r   r<   itemsappendrI   r0   )r>   header_partspartsiterabler   r   r	   r	   r
   _render_parts   s    zRequestField._render_partsc             C   s   g  } d d d g } xA | D]9 } |  j  j | d  r | j d | |  j  | f  q WxF |  j  j   D]5 \ } } | | k ri | ri | j d | | f  qi W| j d  d j |  S)z=
        Renders the headers for this request field.
        zContent-DispositionzContent-TypezContent-LocationFz%s: %sz
)r;   getrK   rJ   r0   )r>   lines	sort_keyssort_keyheader_nameheader_valuer	   r	   r
   render_headers   s    "zRequestField.render_headersc          	   C   sr   | p	 d |  j  d <|  j  d d j d |  j d |  j f d |  j f f  g  7<| |  j  d <| |  j  d <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-datazContent-Dispositionz;  r   r   zContent-TypezContent-LocationN)r;   r0   rO   r8   r9   )r>   content_dispositionrA   content_locationr	   r	   r
   rD      s    'zRequestField.make_multipart)__name__
__module____qualname____doc__r6   r?   classmethodrH   rI   rO   rV   rD   r	   r	   r	   r
   r7   }   s   
#r7       )
__future__r   email.utilsr   r   r,   packagesr   r   r   r5   updateranger4   r6   format_header_paramobjectr7   r	   r	   r	   r
   <module>   s    *	