� ��^c@s(dZddlZddlZddlZddlmZddlmZddlm Z ddl m Z m Z m Z mZmZddlmZmZmZmZdd lmZmZmZdd lmZmZdd lmZdd lmZm Z m!Z!dd l"m#Z#m$Z$m%Z%m&Z&ddl'm(Z(ddl)m*Z*ddlm+Z+m,Z,m-Z-m.Z.m/Z/m0Z0ddl1m2Z2ddlm3Z3ej4dkr�y ej5Z6Wne7k r�ej8Z6nXn ejZ6ed�Z9ed�Z:de;fd��YZ<de<fd��YZ=d�Z>dS(s� requests.session ~~~~~~~~~~~~~~~~ This module provides a Session object to manage and persist settings across requests (cookies, auth, proxies). i����N(t timedelta(t OrderedDicti(t_basic_auth_str(t cookielibtis_py3turljointurlparsetMapping(tcookiejar_from_dicttextract_cookies_to_jartRequestsCookieJart merge_cookies(tRequesttPreparedRequesttDEFAULT_REDIRECT_LIMIT(t default_hookst dispatch_hook(tto_native_string(tto_key_val_listtdefault_headerst DEFAULT_PORTS(tTooManyRedirectst InvalidSchematChunkedEncodingErrortContentDecodingError(tCaseInsensitiveDict(t HTTPAdapter(t requote_uritget_environ_proxiestget_netrc_authtshould_bypass_proxiestget_auth_from_urlt rewind_body(tcodes(tREDIRECT_STATItwin32cCs�|dkr|S|dkr |St|t�o;t|t�sB|S|t|��}|jt|��g|j�D]\}}|dkrt|^qt}x|D] }||=q�W|S(s�Determines 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` N(tNonet isinstanceRRtupdatetitems(trequest_settingtsession_settingt dict_classtmerged_settingtktvt none_keystkey((s3/tmp/pip-build-1THPZW/requests/requests/sessions.pyt merge_setting2s  1  cCsZ|dks!|jd�gkr%|S|dksF|jd�gkrJ|St|||�S(s�Properly merges both requests and session hooks. This is necessary because when request_hooks == {'response': []}, the merge breaks Session hooks entirely. tresponseN(R$tgetR0(t request_hookst session_hooksR*((s3/tmp/pip-build-1THPZW/requests/requests/sessions.pyt merge_hooksQs !!tSessionRedirectMixincBsPeZd�Zd�Zededded�Zd�Zd�Z d�Z RS(cCs?|jr;|jd}tr.|jd�}nt|d�SdS(s7Receives a Response. Returns a redirect URI or ``None``tlocationtlatin1tutf8N(t is_redirecttheadersRtencodeRR$(tselftrespR7((s3/tmp/pip-build-1THPZW/requests/requests/sessions.pytget_redirect_targetbs    cCs�t|�}t|�}|j|jkr.tS|jdkrn|jdkrn|jdkrn|jdkrntS|j|jk}|j|jk}tj|jd�df}| r�|j|kr�|j|kr�tS|p�|S(sFDecide whether Authorization header should be removed when redirectingthttpiPthttpsi�N(iPN(i�N( RthostnametTruetschemetportR$tFalseRR2(R=told_urltnew_urlt old_parsedt new_parsedt changed_porttchanged_schemet default_port((s3/tmp/pip-build-1THPZW/requests/requests/sessions.pytshould_strip_authws  c ks4g} |j|�} t|j�j} x| r/|j�} | j|�| d|_y |jWn-tt t fk r�|j j dt �nXt|j�|jkr�tdj|j�d|��n|j�| jd�rt|j�}djt|j�| g�} nt| �}|jdkrI| rI|jd| �}n|jr^|j} n|j�} |js�t|jt| ��} n t| �} t| �| _|j| |�|jtjtj fkr d}x!|D]}| j!j"|d�q�Wd| _$n| j!}|j"d d�t%| j&||j �t'| j&|j(�| j)| j&�|j*| |�}|j+| |�| j,dk o�d |kp�d |k}|r�t-| �n| }|r�|Vq*|j.|d |d|d|d|d|dt | �}t%|j(| |j �|j|�} |Vq*WdS(sBReceives a Response. Returns a generator of Responses or Requests.itdecode_contentsExceeded {} redirects.R1s//t:ttfragmentsContent-Lengths Content-TypesTransfer-EncodingtCookietstreamttimeouttverifytcerttproxiestallow_redirectsN(sContent-Lengths Content-TypesTransfer-Encoding(/R?RturlRRtcopytappendthistorytcontentRRt RuntimeErrortrawtreadRFtlent max_redirectsRtformattcloset startswithtjoinRRDt_replacetgeturltnetlocRRtrebuild_methodt status_codeR!ttemporary_redirecttpermanent_redirectR;tpopR$tbodyR t_cookiesR tcookiestprepare_cookiestrebuild_proxiest rebuild_autht_body_positionR tsend(R=R>treqRTRURVRWRXtyield_requeststadapter_kwargsthistRZtprevious_fragmenttprepared_requestt parsed_rurltparsedtpurged_headerstheaderR;t rewindable((s3/tmp/pip-build-1THPZW/requests/requests/sessions.pytresolve_redirects�sv     ! !           cCs{|j}|j}d|kr@|j|jj|�r@|d=n|jrUt|�nd}|dk rw|j|�ndS(s�When 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. t AuthorizationN(R;RZRNtrequestt trust_envRR$t prepare_auth(R=R}R1R;RZtnew_auth((s3/tmp/pip-build-1THPZW/requests/requests/sessions.pyRu�s  $  c Cs5|dk r|ni}|j}|j}t|�j}|j�}|jd�}t|d|�}|jr�| r�t |d|�} | j|| jd��} | r�|j || �q�nd|kr�|d=nyt ||�\} } Wnt k rd\} } nX| r1| r1t | | �|d>> import requests >>> s = requests.Session() >>> s.get('https://httpbin.org/get') Or as a context manager:: >>> with requests.Session() as s: ... s.get('https://httpbin.org/get') R;RrtauthRXthookstparamsRVRWtadaptersRTR�RccCs�t�|_d|_i|_t�|_i|_t|_ t |_ d|_ t |_t |_ti�|_t�|_|jdt��|jdt��dS(Nshttps://shttp://(RR;R$R�RXRR�R�RFRTRCRVRWRRcR�RRrRR�tmountR(R=((s3/tmp/pip-build-1THPZW/requests/requests/sessions.pyt__init__js           cCs|S(N((R=((s3/tmp/pip-build-1THPZW/requests/requests/sessions.pyt __enter__�scGs|j�dS(N(Re(R=targs((s3/tmp/pip-build-1THPZW/requests/requests/sessions.pyt__exit__�scCs*|jp i}t|tj�s0t|�}nttt�|j�|�}|j}|jr�| r�|j r�t |j �}nt �}|j d|j j�d|j d|jd|jd|jdt|j|jdt�dt|j|j�d t||j�d |d t|j|j�� |S( s�Constructs a :class:`PreparedRequest ` for transmission and returns it. The :class:`PreparedRequest` has settings merged from the :class:`Request ` instance and those of the :class:`Session`. :param request: :class:`Request` instance to prepare with this session's settings. :rtype: requests.PreparedRequest R�RZtfilestdatatjsonR;R*R�R�RrR�(RrR%Rt CookieJarRR R R�R�RRZR tprepareR�tupperR�R�R�R0R;RR�R5R�(R=R�Rrtmerged_cookiesR�tp((s3/tmp/pip-build-1THPZW/requests/requests/sessions.pytprepare_request�s*        cCs�td|j�d|d|d|d|p-id|d|p?id|d |d | � }|j|�}| poi} |j|j| | ||�}i| d 6| d 6}|j|�|j||�}|S( sConstructs a :class:`Request `, prepares it and sends it. Returns :class:`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, list of tuples, 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) ` 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) Either a boolean, in which case it controls whether we verify the server's TLS certificate, or a string, in which case it must be a path to a CA bundle to use. Defaults to ``True``. :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. :rtype: requests.Response R�RZR;R�R�R�R�R�RrR�RURY(R R�R�tmerge_environment_settingsRZR&Rw(R=R�RZR�R�R;RrR�R�RURYRXR�RTRVRWR�Rxtpreptsettingst send_kwargsR>((s3/tmp/pip-build-1THPZW/requests/requests/sessions.pyR��s*)       cKs#|jdt�|jd||�S(s�Sends 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 RYR�(R�RCR�(R=RZtkwargs((s3/tmp/pip-build-1THPZW/requests/requests/sessions.pyR2scKs#|jdt�|jd||�S(s�Sends 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 RYtOPTIONS(R�RCR�(R=RZR�((s3/tmp/pip-build-1THPZW/requests/requests/sessions.pytoptions!scKs#|jdt�|jd||�S(s�Sends 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 RYR�(R�RFR�(R=RZR�((s3/tmp/pip-build-1THPZW/requests/requests/sessions.pythead,scKs|jd|d|d||�S(s�Sends a POST request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, list of tuples, 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�(R�(R=RZR�R�R�((s3/tmp/pip-build-1THPZW/requests/requests/sessions.pytpost7s cKs|jd|d||�S(suSends a PUT request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, list of tuples, bytes, or file-like object to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :rtype: requests.Response tPUTR�(R�(R=RZR�R�((s3/tmp/pip-build-1THPZW/requests/requests/sessions.pytputDs cKs|jd|d||�S(swSends a PATCH request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, list of tuples, bytes, or file-like object to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :rtype: requests.Response tPATCHR�(R�(R=RZR�R�((s3/tmp/pip-build-1THPZW/requests/requests/sessions.pytpatchPs cKs|jd||�S(s�Sends 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 tDELETE(R�(R=RZR�((s3/tmp/pip-build-1THPZW/requests/requests/sessions.pytdelete\sc Ks|jd|j�|jd|j�|jd|j�|jd|j�t|t�rjtd��n|jdt �}|j d�}|j }|j d|j �}t�}|j||�}t�|} td| �|_td |||�}|jr1x-|jD]} t|j| j| j�q Wnt|j||j�|j|||�} |r{g| D]} | ^qing} | r�| jd |�| j�}| |_n|s�y(t|j||d t |��|_Wq�tk r�q�Xn|s|jn|S( sISend a given PreparedRequest. :rtype: requests.Response RTRVRWRXs#You can only send PreparedRequests.RYRZtsecondsR1iRy(R�RTRVRWRXR%R t ValueErrorRoRCR2R�t get_adapterRZtpreferred_clockRwRtelapsedRR]R RrR�R`R�tinserttnextt_nextt StopIterationR^( R=R�R�RYRTR�tadaptertstarttrR�R>tgenR]((s3/tmp/pip-build-1THPZW/requests/requests/sessions.pyRwfsB     %  (  c Cs|jr�|dk r$|jd�nd}t|d|�}x*|j�D]\}} |j|| �qIW|tks�|dkr�tjjd�p�tjjd�}q�nt ||j �}t ||j �}t ||j �}t ||j �}i|d6|d6|d6|d6S( s^ Check the environment and merge it with some settings. :rtype: dict R�tREQUESTS_CA_BUNDLEtCURL_CA_BUNDLERVRXRTRWN(R�R$R2RR'R�RCtostenvironR0RXRTRVRW( R=RZRXRTRVRWR�t env_proxiesR,R-((s3/tmp/pip-build-1THPZW/requests/requests/sessions.pyR��s !cCsXx<|jj�D]+\}}|j�j|j��r|SqWtdj|���dS(s~ Returns the appropriate connection adapter for the given URL. :rtype: requests.adapters.BaseAdapter s*No connection adapters were found for {!r}N(R�R'tlowerRfRRd(R=RZtprefixR�((s3/tmp/pip-build-1THPZW/requests/requests/sessions.pyR��scCs(x!|jj�D]}|j�qWdS(s+Closes all adapters and as such the sessionN(R�tvaluesRe(R=R-((s3/tmp/pip-build-1THPZW/requests/requests/sessions.pyRe�scCso||j|�s (t __attrs__(R=tstate((R=s3/tmp/pip-build-1THPZW/requests/requests/sessions.pyt __getstate__�scCs1x*|j�D]\}}t|||�q WdS(N(R'tsetattr(R=R�R�tvalue((s3/tmp/pip-build-1THPZW/requests/requests/sessions.pyt __setstate__�sN(R�R�t__doc__R�R�R�R�R�R$RCR�R2R�R�R�R�R�R�RwR�R�ReR�R�R�(((s3/tmp/pip-build-1THPZW/requests/requests/sessions.pyR�Qs2   7   ) D  I    cCst�S(sZ Returns a :class:`Session` for context-management. .. deprecated:: 1.0.0 This method has been deprecated since version 1.0.0 and is only kept for backwards compatibility. New code should use :class:`~requests.sessions.Session` to create a session. This may be removed at a future date. :rtype: Session (R�(((s3/tmp/pip-build-1THPZW/requests/requests/sessions.pytsession�s (?R�R�tsysttimetdatetimeRt collectionsRR�RtcompatRRRRRRrRR R R tmodelsR R RR�RRt_internal_utilsRtutilsRRRt exceptionsRRRRt structuresRR�RRRRRRR t status_codesR!R"tplatformt perf_counterR�tAttributeErrortclockR0R5tobjectR6R�R�(((s3/tmp/pip-build-1THPZW/requests/requests/sessions.pyt s<   ("".     ���