
) X	d                 @   s  d  Z  d d l Z d d l m Z d d l m Z d d l m Z d d l m Z m	 Z	 m
 Z
 m Z d d l m Z m Z m Z m Z d d	 l m Z m Z m Z d d
 l m Z m Z d d l m Z m Z m Z d d l m Z m Z m Z m  Z  d d l! m" Z" d d l# m$ Z$ d d l% m& Z& d d l m' Z' m( Z( m) Z) m* Z* m+ Z+ d d l, m- Z- d d l m. Z. d Z/ e	 d d  Z0 e	 d d  Z1 Gd d   d e2  Z3 Gd d   d e3  Z4 d d   Z5 d S)z
requests.session
~~~~~~~~~~~~~~~~

This module provides a Session object to manage and persist settings across
requests (cookies, auth, proxies).
    N)Mapping)datetime   )_basic_auth_str)	cookielibOrderedDicturljoinurlparse)cookiejar_from_dictextract_cookies_to_jarRequestsCookieJarmerge_cookies)RequestPreparedRequestDEFAULT_REDIRECT_LIMIT)default_hooksdispatch_hook)to_key_val_listdefault_headersto_native_string)TooManyRedirectsInvalidSchemaChunkedEncodingErrorContentDecodingError)RecentlyUsedContainer)CaseInsensitiveDict)HTTPAdapter)requote_uriget_environ_proxiesget_netrc_authshould_bypass_proxiesget_auth_from_url)codes)REDIRECT_STATIi  c             C   s   | d k r |  S|  d k r  | St  | t  o; t  |  t  sB |  S| t |   } | j t |    d d   | j   D } x | D] } | | =q W| S)zDetermines appropriate setting for a given request, taking into account
    the explicit setting on that request, and the setting in the session. If a
    setting is a dictionary, they will be merged together using `dict_class`
    Nc             S   s(   g  |  ] \ } } | d  k r |  q S)N ).0kvr$   r$   A/home/ubuntu/projects/ifolica/build/requests/requests/sessions.py
<listcomp>A   s   	 z!merge_setting.<locals>.<listcomp>)
isinstancer   r   updateitems)request_settingsession_setting
dict_classmerged_settingZ	none_keyskeyr$   r$   r(   merge_setting)   s    r2   c             C   sZ   | d k s! | j  d  g  k r% |  S|  d k sF |  j  d  g  k rJ | St |  | |  S)zProperly merges both requests and session hooks.

    This is necessary because when request_hooks == {'response': []}, the
    merge breaks Session hooks entirely.
    Nresponse)getr2   )request_hookssession_hooksr/   r$   r$   r(   merge_hooksH   s
    !!r7   c               @   sO   e  Z d  Z d d d d d d d  Z d d   Z d d	   Z d
 d   Z d S)SessionRedirectMixinFNTc             k   s  d }	 g  }
 x| j  r| j   } |	 d k rU |
 j |  t |
  } | | _ n  y | j Wn. t t t f k
 r | j	 j
 d d  Yn X|	 |  j k r t d |  j d |  n  | j   | j d } | j d  rt | j  } d | j | f } n  t |  } | j   } | j sCt | j t |   } n t |  } t |  | _ | j r| j | j k r| j |  j | j <n  |  j | |  | j t j t j f k rd } x! | D] } | j j | d  qWd | _  n  | j } y | d =Wn t! k
 rYn Xt" | j# | | j	  | j# j$ |  j%  | j& | j#  |  j' | |  } |  j( | |  | } |  j) | d | d | d | d | d | d d | } t" |  j% | | j	  |	 d 7}	 | Vq Wd S)z6Receives a Response. Returns a generator of Responses.r   decode_contentFzExceeded %s redirects.r3   locationz//z%s:%sContent-LengthContent-TypeTransfer-EncodingNCookiestreamtimeoutverifycertproxiesallow_redirectsr   )r;   r<   r=   )*Zis_redirectcopyappendlisthistorycontentr   r   RuntimeErrorrawreadmax_redirectsr   closeheaders
startswithr	   urlschemegeturlnetlocr   r   r   Zis_permanent_redirectredirect_cacherebuild_methodstatus_coder"   temporary_redirectZpermanent_redirectpopbodyKeyErrorr   _cookiesr+   cookiesprepare_cookiesrebuild_proxiesrebuild_authsend)selfrespreqr?   r@   rA   rB   rC   Zadapter_kwargsiZhistprepared_requestZnew_histrQ   parsed_rurlparsedZpurged_headersheaderrO   r$   r$   r(   resolve_redirectsX   sp    
			
z&SessionRedirectMixin.resolve_redirectsc             C   s   | j  } | j } d | k r[ t | j j  } t |  } | j | j k r[ | d =q[ n  |  j rp t |  n d } | d k	 r | j |  n  d S)zWhen being redirected we may want to strip authentication from the
        request to avoid leaking credentials. This method intelligently removes
        and reapplies authentication where possible to avoid credential loss.
        AuthorizationN)rO   rQ   r	   requesthostname	trust_envr   prepare_auth)rb   rf   r3   rO   rQ   original_parsedredirect_parsednew_authr$   r$   r(   r`      s    		z!SessionRedirectMixin.rebuild_authc             C   s  | j  } | j } t |  j } | d k	 r9 | j   n i  } |  j r t |  r t |  } | j d | j |   } | r | j	 | |  q n  d | k r | d =n  y t
 | |  \ }	 }
 Wn t k
 r d \ }	 }
 Yn X|	 r|
 rt |	 |
  | d <n  | S)a  This method re-evaluates the proxy configuration by considering the
        environment variables. If we are redirected to a URL covered by
        NO_PROXY, we strip the proxy configuration. Otherwise, we set missing
        proxy keys for this URL (in case they were stripped by a previous
        redirect).

        This method also replaces the Proxy-Authorization header where
        necessary.

        :rtype: dict
        NallzProxy-Authorization)NN)rO   rQ   r	   rR   rE   rn   r    r   r4   
setdefaultr!   r[   r   )rb   rf   rC   rO   rQ   rR   new_proxiesenviron_proxiesproxyusernamepasswordr$   r$   r(   r_      s$    		
z$SessionRedirectMixin.rebuild_proxiesc             C   s   | j  } | j t j k r0 | d k r0 d } n  | j t j k rW | d k rW d } n  | j t j k r~ | d k r~ d } n  | | _  d S)zWhen being redirected we may want to change the method of the request
        based on certain specs or browser behavior.
        HEADGETPOSTN)methodrW   r"   	see_otherfoundmoved)rb   rf   r3   r}   r$   r$   r(   rV      s    				z#SessionRedirectMixin.rebuild_method)__name__
__module____qualname__rj   r`   r_   rV   r$   r$   r$   r(   r8   W   s
   `&r8   c               @   s]  e  Z d  Z d Z d d d d d d d d	 d
 d d d d g Z d d   Z d d   Z d d   Z d d   Z d d d d d d d d d d d d d d d d  Z	 d d   Z
 d d   Z d d    Z d d d! d"  Z d d# d$  Z d d% d&  Z d' d(   Z d) d*   Z d+ d,   Z d- d.   Z d/ d0   Z d1 d2   Z d3 d4   Z d5 d6   Z d S)7Sessiona~  A Requests session.

    Provides cookie persistence, connection-pooling, and configuration.

    Basic Usage::

      >>> import requests
      >>> s = requests.Session()
      >>> s.get('http://httpbin.org/get')
      <Response [200]>

    Or as a context manager::

      >>> with requests.Session() as s:
      >>>     s.get('http://httpbin.org/get')
      <Response [200]>
    rO   r]   authrC   hooksparamsrA   rB   prefetchadaptersr?   rn   rM   c             C   s   t    |  _ d  |  _ i  |  _ t   |  _ i  |  _ d |  _ d |  _ d  |  _	 t
 |  _ d |  _ t i   |  _ t   |  _ |  j d t    |  j d t    t t  |  _ d  S)NFTzhttps://zhttp://)r   rO   r   rC   r   r   r   r?   rA   rB   r   rM   rn   r
   r]   r   r   mountr   r   REDIRECT_CACHE_SIZErU   )rb   r$   r$   r(   __init__'  s    								zSession.__init__c             C   s   |  S)Nr$   )rb   r$   r$   r(   	__enter__`  s    zSession.__enter__c             G   s   |  j    d  S)N)rN   )rb   argsr$   r$   r(   __exit__c  s    zSession.__exit__c             C   s*  | j  p i  } t | t j  s0 t |  } n  t t t   |  j   |  } | j } |  j r | r |  j r t	 | j
  } n  t   } | j d | j j   d | j
 d | j d | j d | j d t | j |  j d t d t | j |  j  d	 t | |  j  d
 | d t | j |  j   
| S)a  Constructs a :class:`PreparedRequest <PreparedRequest>` for
        transmission and returns it. The :class:`PreparedRequest` has settings
        merged from the :class:`Request <Request>` instance and those of the
        :class:`Session`.

        :param request: :class:`Request` instance to prepare with this
            session's settings.
        :rtype: requests.PreparedRequest
        r}   rQ   filesdatajsonrO   r/   r   r   r]   r   )r]   r*   r   	CookieJarr
   r   r   r   rn   r   rQ   r   preparer}   upperr   r   r   r2   rO   r   r   r7   r   )rb   rl   r]   merged_cookiesr   pr$   r$   r(   prepare_requestf  s*    
							zSession.prepare_requestNTc             C   s   t  d | j   d | d | d | d | p- i  d | d | p? i  d | d	 | d
 |  
} |  j |  } | po i  } |  j | j | | | |  } i |	 d 6|
 d 6} | j |  |  j | |  } | S)a  Constructs a :class:`Request <Request>`, prepares it and sends it.
        Returns :class:`Response <Response>` object.

        :param method: method for the new :class:`Request` object.
        :param url: URL for the new :class:`Request` object.
        :param params: (optional) Dictionary or bytes to be sent in the query
            string for the :class:`Request`.
        :param data: (optional) Dictionary, bytes, or file-like object to send
            in the body of the :class:`Request`.
        :param json: (optional) json to send in the body of the
            :class:`Request`.
        :param headers: (optional) Dictionary of HTTP Headers to send with the
            :class:`Request`.
        :param cookies: (optional) Dict or CookieJar object to send with the
            :class:`Request`.
        :param files: (optional) Dictionary of ``'filename': file-like-objects``
            for multipart encoding upload.
        :param auth: (optional) Auth tuple or callable to enable
            Basic/Digest/Custom HTTP Auth.
        :param timeout: (optional) How long to wait for the server to send
            data before giving up, as a float, or a :ref:`(connect timeout,
            read timeout) <timeouts>` tuple.
        :type timeout: float or tuple
        :param allow_redirects: (optional) Set to True by default.
        :type allow_redirects: bool
        :param proxies: (optional) Dictionary mapping protocol or protocol and
            hostname to the URL of the proxy.
        :param stream: (optional) whether to immediately download the response
            content. Defaults to ``False``.
        :param verify: (optional) whether the SSL cert will be verified.
            A CA_BUNDLE path can also be provided. Defaults to ``True``.
        :param cert: (optional) if String, path to ssl client cert file (.pem).
            If Tuple, ('cert', 'key') pair.
        :rtype: requests.Response
        r}   rQ   rO   r   r   r   r   r   r]   r   r@   rD   )r   r   r   merge_environment_settingsrQ   r+   ra   )rb   r}   rQ   r   r   rO   r]   r   r   r@   rD   rC   r   r?   rA   rB   r   rd   prepZsettingssend_kwargsrc   r$   r$   r(   rl     s*    3	
zSession.requestc             K   s#   | j  d d  |  j d | |  S)zSends a GET request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        :rtype: requests.Response
        rD   Tr{   )rt   rl   )rb   rQ   kwargsr$   r$   r(   r4     s    zSession.getc             K   s#   | j  d d  |  j d | |  S)zSends a OPTIONS request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        :rtype: requests.Response
        rD   TOPTIONS)rt   rl   )rb   rQ   r   r$   r$   r(   options  s    zSession.optionsc             K   s#   | j  d d  |  j d | |  S)zSends a HEAD request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        :rtype: requests.Response
        rD   Frz   )rt   rl   )rb   rQ   r   r$   r$   r(   head  s    zSession.headc             K   s   |  j  d | d | d | | S)a  Sends a POST request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
        :param json: (optional) json to send in the body of the :class:`Request`.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        :rtype: requests.Response
        r|   r   r   )rl   )rb   rQ   r   r   r   r$   r$   r(   post   s    
zSession.postc             K   s   |  j  d | d | | S)aY  Sends a PUT request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        :rtype: requests.Response
        PUTr   )rl   )rb   rQ   r   r   r$   r$   r(   put  s    	zSession.putc             K   s   |  j  d | d | | S)a[  Sends a PATCH request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        :rtype: requests.Response
        PATCHr   )rl   )rb   rQ   r   r   r$   r$   r(   patch  s    	zSession.patchc             K   s   |  j  d | |  S)zSends a DELETE request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        :rtype: requests.Response
        DELETE)rl   )rb   rQ   r   r$   r$   r(   delete"  s    zSession.deletec             K   s  | j  d |  j  | j  d |  j  | j  d |  j  | j  d |  j  t | t  rj t d   n  | j d d  } | j	 d  } | j
 } | r t   } xW | j |  j k r | j | j  |  j j	 | j  } | | k r Pn  | | _ q Wn  |  j d | j  } t j   }	 | j | |  }
 t j   |	 |
 _ t d	 | |
 |  }
 |
 j rx- |
 j D] } t |  j | j | j  qkWn  t |  j | |
 j  |  j |
 | |  } | rd
 d   | D n g  } | r	| j d |
  | j   }
 | |
 _ n  | s|
 j n  |
 S)zR
        Send a given PreparedRequest.

        :rtype: requests.Response
        r?   rA   rB   rC   z#You can only send PreparedRequests.rD   TrQ   r3   c             S   s   g  |  ] } |  q Sr$   r$   )r%   rc   r$   r$   r(   r)   i  s   	 z Session.send.<locals>.<listcomp>r   )rt   r?   rA   rB   rC   r*   r   
ValueErrorrY   r4   r   setrQ   rU   addget_adapterr   utcnowra   elapsedr   rH   r   r]   rl   rK   rj   insertrI   )rb   rl   r   rD   r?   r   Zchecked_urlsZnew_urladapterstartrrc   genrH   r$   r$   r(   ra   ,  sF    			 
zSession.sendc       	      C   s   |  j  r t |  p i  } x* | j   D] \ } } | j | |  q( W| d k s` | d k r t j j d  p t j j d  } q n  t | |  j  } t | |  j	  } t | |  j
  } t | |  j  } i | d 6| d 6| d 6| d 6S)	z^
        Check the environment and merge it with some settings.

        :rtype: dict
        TNREQUESTS_CA_BUNDLECURL_CA_BUNDLErA   rC   r?   rB   )rn   r   r,   rt   osenvironr4   r2   rC   r?   rA   rB   )	rb   rQ   rC   r?   rA   rB   env_proxiesr&   r'   r$   r$   r(   r   x  s    	z"Session.merge_environment_settingsc             C   sM   x6 |  j  j   D]% \ } } | j   j |  r | Sq Wt d |   d S)z~
        Returns the appropriate connection adapter for the given URL.

        :rtype: requests.adapters.BaseAdapter
        z*No connection adapters were found for '%s'N)r   r,   lowerrP   r   )rb   rQ   prefixr   r$   r$   r(   r     s    zSession.get_adapterc             C   s(   x! |  j  j   D] } | j   q Wd S)z+Closes all adapters and as such the sessionN)r   valuesrN   )rb   r'   r$   r$   r(   rN     s    zSession.closec                sW   | |  j    <  f d d   |  j  D } x' | D] } |  j  j |  |  j  | <q0 Wd S)ztRegisters a connection adapter to a prefix.

        Adapters are sorted in descending order by key length.
        c                s.   g  |  ]$ } t  |  t     k  r |  q Sr$   )len)r%   r&   )r   r$   r(   r)     s   	 z!Session.mount.<locals>.<listcomp>N)r   rY   )rb   r   r   keys_to_mover1   r$   )r   r(   r     s    zSession.mountc                s9   t    f d d     j D  } t    j  | d <| S)Nc             3   s'   |  ] } | t    | d   f Vq d  S)N)getattr)r%   attr)rb   r$   r(   	<genexpr>  s    z'Session.__getstate__.<locals>.<genexpr>rU   )dict	__attrs__rU   )rb   stater$   )rb   r(   __getstate__  s    "zSession.__getstate__c             C   s|   | j  d i   } x* | j   D] \ } } t |  | |  q Wt t  |  _ x' | j   D] \ } } | |  j | <q[ Wd  S)NrU   )rY   r,   setattrr   r   rU   )rb   r   rU   r   valueredirectZtor$   r$   r(   __setstate__  s    zSession.__setstate__)r   r   r   __doc__r   r   r   r   r   rl   r4   r   r   r   r   r   r   ra   r   r   rN   r   r   r   r$   r$   r$   r(   r     sH   	9)C
Lr   c               C   s   t    S)zQ
    Returns a :class:`Session` for context-management.

    :rtype: Session
    )r   r$   r$   r$   r(   session  s    r   )6r   r   collectionsr   r   r   r   compatr   r   r   r	   r]   r
   r   r   r   modelsr   r   r   r   r   r   utilsr   r   r   
exceptionsr   r   r   r   Zpackages.urllib3._collectionsr   
structuresr   r   r   r   r   r   r    r!   status_codesr"   r#   r   r2   r7   objectr8   r   r   r$   r$   r$   r(   <module>	   s.   """( 