B /Wbu@sldZddlZddlZddlZddlmZddlmZddlm Z ddl m Z ddl m Z dd lmZmZmZmZdd lmZmZmZmZdd lmZmZmZmZdd lmZmZdd l m!Z!m"Z"m#Z#m$Z$ddl%m&Z&ddl'm(Z(ddl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3ej4dkr$ej5Z6nejZ6efddZ7efddZ8GdddZ9Gddde9Z:ddZ;dS)z requests.sessions ~~~~~~~~~~~~~~~~~ This module provides a Session object to manage and persist settings across requests (cookies, auth, proxies). N) OrderedDict) timedelta)to_native_string) HTTPAdapter)_basic_auth_str)Mapping cookieliburljoinurlparse)RequestsCookieJarcookiejar_from_dictextract_cookies_to_jar merge_cookies)ChunkedEncodingErrorContentDecodingError InvalidSchemaTooManyRedirects) default_hooks dispatch_hook)DEFAULT_REDIRECT_LIMITREDIRECT_STATIPreparedRequestRequest)codes)CaseInsensitiveDict) DEFAULT_PORTSdefault_headersget_auth_from_urlget_environ_proxiesget_netrc_auth requote_uriresolve_proxies rewind_bodyshould_bypass_proxiesto_key_val_listwin32cCst|dkr |S|dkr|St|tr,t|ts0|S|t|}|t|dd|D}x|D] }||=qbW|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` NcSsg|]\}}|dkr|qS)N).0kvr'r'8/tmp/pip-target-ju3w756n/lib/python/requests/sessions.py Tsz!merge_setting..) isinstancerr%updateitems)request_settingsession_setting dict_classmerged_setting none_keyskeyr'r'r+ merge_setting=s   r6cCs@|dks|dgkr|S|dks0|dgkr4|St|||S)zProperly merges both requests and session hooks. This is necessary because when request_hooks == {'response': []}, the merge breaks Session hooks entirely. Nresponse)getr6) request_hooks session_hooksr2r'r'r+ merge_hooks[s r;c@s>eZdZddZddZddd Zd d Zd d ZddZdS)SessionRedirectMixincCs(|jr$|jd}|d}t|dSdS)z7Receives a Response. Returns a redirect URI or ``None``locationlatin1utf8N) is_redirectheadersencoder)selfrespr=r'r'r+get_redirect_targetks    z(SessionRedirectMixin.get_redirect_targetcCst|}t|}|j|jkr dS|jdkrL|jdkrL|jdkrL|jdkrLdS|j|jk}|j|jk}t|jddf}|s|j|kr|j|krdS|p|S)zFDecide whether Authorization header should be removed when redirectingThttp)PNhttps)iNFN)r hostnameschemeportrr8)rCold_urlnew_url old_parsed new_parsed changed_portchanged_scheme default_portr'r'r+should_strip_auths"         z&SessionRedirectMixin.should_strip_authFNTc  ksTg} ||} t|jj} x2| rN|} | || dd|_y |jWn(tt t fk rv|j j ddYnXt |j|jkrtd|jd|d|| drt|j}d t|j| g} t| }|jd kr| r|j| d }n |jr|j} |} |js t|jt| } nt| } t| | _|| ||jtjtjfkrzd }x|D]}| j |dq\Wd| _!| j}| d dt"| j#||j t$| j#|j%| &| j#|'| |}|(| || j)dk od|kpd|k}|rt*| | }|r |Vq|j+|f|||||dd| }t"|j%| |j ||} |VqWdS)zBReceives a Response. Returns a generator of Responses or Requests.rNF)decode_contentz Exceeded z redirects.)r7z//:)fragment)zContent-Lengthz Content-TypezTransfer-EncodingCookiezContent-LengthzTransfer-Encoding)streamtimeoutverifycertproxiesallow_redirects),rEr urlrWcopyappendhistorycontentrr RuntimeErrorrawreadlen max_redirectsrclose startswithjoinrrJ_replacegeturlnetlocr r!rebuild_method status_codertemporary_redirectpermanent_redirectrApopbodyr_cookiesrcookiesprepare_cookiesrebuild_proxies rebuild_auth_body_positionr#send)rCrDreqrYrZr[r\r]yield_requestsadapter_kwargshistr_previous_fragmentprepared_request parsed_rurlparsedpurged_headersheaderrA rewindabler'r'r+resolve_redirectss|                 z&SessionRedirectMixin.resolve_redirectscCsR|j}|j}d|kr*||jj|r*|d=|jr8t|nd}|dk rN||dS)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)rAr_rSrequest trust_envr prepare_auth)rCrr7rAr_new_authr'r'r+rys  z!SessionRedirectMixin.rebuild_authcCsz|j}t|jj}t|||j}d|kr.|d=yt||\}}Wntk r^d\}}YnX|rv|rvt|||d<|S)aThis 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 zProxy-Authorization)NN) rAr r_rJr"rrKeyErrorr)rCrr]rArJ new_proxiesusernamepasswordr'r'r+rx/s  z$SessionRedirectMixin.rebuild_proxiescCsX|j}|jtjkr|dkrd}|jtjkr6|dkr6d}|jtjkrN|dkrNd}||_dS)zWhen being redirected we may want to change the method of the request based on certain specs or browser behavior. HEADGETPOSTN)methodrpr see_otherfoundmoved)rCrr7rr'r'r+roLsz#SessionRedirectMixin.rebuild_method)FNTNNF) __name__ __module__ __qualname__rErSrryrxror'r'r'r+r<js$ sr<c@seZdZdZdddddddd d d d d g ZddZddZddZddZd6ddZ ddZ ddZ ddZ d7d d!Z d8d"d#Zd9d$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/Zd0d1Zd2d3Zd4d5ZdS):SessionaA Requests session. Provides cookie persistence, connection-pooling, and configuration. Basic Usage:: >>> 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') rArvauthr]hooksparamsr[r\adaptersrYrrhcCsrt|_d|_i|_t|_i|_d|_d|_d|_ t |_ d|_ t i|_t|_|dt|dtdS)NFTzhttps://zhttp://)rrArr]rrrrYr[r\rrhrr rvrrmountr)rCr'r'r+__init__s  zSession.__init__cCs|S)Nr')rCr'r'r+ __enter__szSession.__enter__cGs |dS)N)ri)rCargsr'r'r+__exit__szSession.__exit__c Cs|jpi}t|tjst|}ttt|j|}|j}|jrR|sR|jsRt |j }t }|j |j |j |j|j|jt|j|jtdt|j|jt||j|t|j|jd |S)aConstructs 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 )r2) rr_filesdatajsonrArrrvr)rvr-r CookieJarr rr rrr r_rpreparerupperrrrr6rArrr;r)rCrrvmerged_cookiesrpr'r'r+prepare_requests,     zSession.prepare_requestNTc Cstt|||||pi||pi||| d }||}| p8i} ||j| | ||}| | d}|||j|f|}|S)aw Constructs 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``. When set to ``False``, requests will accept any TLS certificate presented by the server, and will ignore hostname mismatches and/or expired certificates, which will make your application vulnerable to man-in-the-middle (MitM) attacks. Setting verify to ``False`` may be useful during local development or testing. :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. :rtype: requests.Response ) rr_rArrrrrrvr)rZr^)rrrmerge_environment_settingsr_r.r{)rCrr_rrrArvrrrZr^r]rrYr[r\rr|prepsettings send_kwargsrDr'r'r+rs(=  zSession.requestcKs|dd|jd|f|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 r^Tr) setdefaultr)rCr_kwargsr'r'r+r8Os z Session.getcKs|dd|jd|f|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 r^TOPTIONS)rr)rCr_rr'r'r+optionsZs zSession.optionscKs|dd|jd|f|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 r^Fr)rr)rCr_rr'r'r+heades z Session.headcKs|jd|f||d|S)aSends 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)rr)r)rCr_rrrr'r'r+postps z Session.postcKs|jd|fd|i|S)auSends 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 PUTr)r)rCr_rrr'r'r+put}s z Session.putcKs|jd|fd|i|S)awSends 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 PATCHr)r)rCr_rrr'r'r+patchs z Session.patchcKs|jd|f|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)r)rCr_rr'r'r+deleteszSession.deletec Ks|d|j|d|j|d|jd|krFt||j|j|d<t|trXt d| dd}| d}|j }|j |jd}t}|j|f|}t|} t| d |_td ||f|}|jrx |jD]} t|j| j| jqWt|j||j|r|j||f|} d d | D} ng} | r>| d || }| |_|s~y"t|j||fddi||_Wntk r|YnX|s|j|S)zISend a given PreparedRequest. :rtype: requests.Response rYr[r\r]z#You can only send PreparedRequests.r^T)r_)secondsr7cSsg|]}|qSr'r')r(rDr'r'r+r,sz Session.send..rr})rrYr[r\r"r]rr-r ValueErrorrsr8r get_adapterr_preferred_clockr{relapsedrrbrrvrrerinsertnext_next StopIterationrc) rCrrr^rYradapterstartrrrDgenrbr'r'r+r{sJ        z Session.sendc Cs|jrv|dk r|dnd}t||d}x |D]\}} ||| q2W|dksZ|dkrvtjdpttjdpt|}t||j}t||j }t||j }t||j }||||dS)z^ Check the environment and merge it with some settings. :rtype: dict Nno_proxy)rTREQUESTS_CA_BUNDLECURL_CA_BUNDLE)r]rYr[r\) rr8rr/rosenvironr6r]rYr[r\) rCr_r]rYr[r\r env_proxiesr)r*r'r'r+rs       z"Session.merge_environment_settingscCs@x,|jD]\}}||r |Sq Wtd|dS)z~ Returns the appropriate connection adapter for the given URL. :rtype: requests.adapters.BaseAdapter z&No connection adapters were found for N)rr/lowerrjr)rCr_prefixrr'r'r+r szSession.get_adaptercCs x|jD] }|q WdS)z+Closes all adapters and as such the sessionN)rvaluesri)rCr*r'r'r+risz Session.closecsB||j<fdd|jD}x|D]}|j||j|<q$WdS)zwRegisters a connection adapter to a prefix. Adapters are sorted in descending order by prefix length. cs g|]}t|tkr|qSr')rg)r(r))rr'r+r,%sz!Session.mount..N)rrs)rCrr keys_to_mover5r')rr+rs  z Session.mountcsfddjD}|S)Ncsi|]}t|d|qS)N)getattr)r(attr)rCr'r+ +sz(Session.__getstate__..) __attrs__)rCstater')rCr+ __getstate__*szSession.__getstate__cCs&x |D]\}}t|||q WdS)N)r/setattr)rCrrvaluer'r'r+ __setstate__.szSession.__setstate__)NNNNNNNTNNNNNN)NN)N)N)rrr__doc__rrrrrrr8rrrrrrr{rrrirrrr'r'r'r+rcsZ>/ J    N rcCstS)aZ 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 )rr'r'r'r+session3s r)s8       0   zS