o Ecu@sdZddlZddlZddlZddlmZddlmZddlm 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/m0Z0ddl1m2Z2ddlm3Z3ej4dkrzej5Z6Wne7yej8Z6YnwejZ6efddZ9efddZ:Gddde;ZdS)z requests.sessions ~~~~~~~~~~~~~~~~~ This module provides a Session object to manage and persist settings across requests (cookies, auth, proxies). N) timedelta) OrderedDict)_basic_auth_str) cookielibis_py3urljoinurlparseMapping)cookiejar_from_dictextract_cookies_to_jarRequestsCookieJar merge_cookies)RequestPreparedRequestDEFAULT_REDIRECT_LIMIT) default_hooks dispatch_hook)to_native_string)to_key_val_listdefault_headers DEFAULT_PORTS)TooManyRedirects InvalidSchemaChunkedEncodingErrorContentDecodingError)CaseInsensitiveDict) HTTPAdapter) requote_uriget_environ_proxiesget_netrc_authshould_bypass_proxiesget_auth_from_url rewind_body)codes)REDIRECT_STATIZwin32cCsp|dur|S|dur |St|trt|ts|S|t|}|t|dd|D}|D]}||=q0|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|] \}}|dur|qSN).0kvr'r'P/opt/alt/python310/lib/python3.10/site-packages/pip/_vendor/requests/sessions.py Jsz!merge_setting..) isinstancer rupdateitems)Zrequest_settingZsession_setting dict_classZmerged_settingZ none_keyskeyr'r'r+ merge_setting2s r2cCs@|dus |dgkr |S|dus|dgkr|St|||S)zProperly merges both requests and session hooks. This is necessary because when request_hooks == {'response': []}, the merge breaks Session hooks entirely. Nresponse)getr2)Z request_hooksZ session_hooksr0r'r'r+ merge_hooksQs  r5c@sBeZdZddZddZ  ddd Zd d Zd d ZddZdS)SessionRedirectMixincCs,|jr|jd}tr|d}t|dSdS)z7Receives a Response. Returns a redirect URI or ``None``locationlatin1utf8N)Z is_redirectheadersrencoder)selfrespr7r'r'r+get_redirect_targetbs    z(SessionRedirectMixin.get_redirect_targetcCst|}t|}|j|jkrdS|jdkr&|jdvr&|jdkr&|jdvr&dS|j|jk}|j|jk}t|jddf}|sI|j|vrI|j|vrIdS|pL|S)zFDecide whether Authorization header should be removed when redirectingThttp)PNhttps)iNFN)r hostnameschemeportrr4)r<Zold_urlZnew_urlZ old_parsedZ new_parsedZ changed_portZchanged_schemeZ default_portr'r'r+should_strip_authws$   z&SessionRedirectMixin.should_strip_authFNTc  ks@g} ||} t|jj} | r|} | || dd|_z|jWntt t fy9|j j ddYnwt |j|jkrLtd|j|d|| drdt|j}dt|j| g} t| }|jd krv| rv|j| d }n|jr||j} |} |jst|jt| } nt| } t| | _|| ||jtjtjfvrd }|D] }| j !|dqd| _"| j }|!d dt#| j$||j t%| j$|j&| '| j$|(| |}|)| || j*duod |vpd|v}|rt+| | }|r|Vn |j,|f|||||dd| }t#|j&| |j ||} |V| sdSdS)zBReceives a Response. Returns a generator of Responses or Requests.rNF)Zdecode_contentzExceeded {} redirects.)r3z//:)fragment)Content-Lengthz Content-TypeTransfer-EncodingZCookierIrJ)streamtimeoutverifycertproxiesallow_redirects)-r>r urlrHcopyappendhistorycontentrr RuntimeErrorrawreadlen max_redirectsrformatclose startswithjoinrrC_replacegeturlnetlocrrrebuild_method status_coder$Ztemporary_redirectZpermanent_redirectr:popbodyr Z_cookiesrcookiesZprepare_cookiesrebuild_proxies rebuild_authZ_body_positionr#send)r<r=reqrKrLrMrNrOyield_requestsZadapter_kwargsZhistrQZprevious_fragmentprepared_requestZ parsed_rurlparsedZpurged_headersheaderr:Z rewindabler'r'r+resolve_redirectss               z&SessionRedirectMixin.resolve_redirectscCsV|j}|j}d|vr||jj|r|d=|jrt|nd}|dur)||dSdS)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. Z AuthorizationN)r:rQrErequest trust_envr Z prepare_auth)r<rlr3r:rQZnew_authr'r'r+rhsz!SessionRedirectMixin.rebuild_authc Cs|dur|ni}|j}|j}t|j}|}|d}t||d}|jr>|s>t||d} | || d} | r>| || d|vrE|d=z t ||\} } Wn t y\d\} } Ynw| rh| rht | | |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 Nno_proxyrrallzProxy-AuthorizationNN) r:rQr rCrRr4r!rqr setdefaultr"KeyErrorr) r<rlrOr:rQrCZ new_proxiesrrZ bypass_proxyZenviron_proxiesproxyusernamepasswordr'r'r+rgs,         z$SessionRedirectMixin.rebuild_proxiescCsX|j}|jtjkr|dkrd}|jtjkr|dkrd}|jtjkr'|dkr'd}||_dS)zWhen being redirected we may want to change the method of the request based on certain specs or browser behavior. HEADGETPOSTN)methodrcr$Z see_otherfoundZmoved)r<rlr3r~r'r'r+rb:s z#SessionRedirectMixin.rebuild_method)FNTNNF) __name__ __module__ __qualname__r>rErorhrgrbr'r'r'r+r6`s n )r6c@seZdZdZgdZddZddZddZd d Z d+d dZ ddZ ddZ ddZ d,ddZ d-ddZd-ddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd S).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') ) r:rfauthrOhooksparamsrMrNadaptersrKrqrZcCsrt|_d|_i|_t|_i|_d|_d|_d|_ t |_ d|_ t i|_t|_|dt|dtdS)NFTzhttps://zhttp://)rr:rrOrrrrKrMrNrrZrqr rfrrmountrr<r'r'r+__init__js  zSession.__init__cCs|Sr&r'rr'r'r+ __enter__szSession.__enter__cGs |dSr&)r\)r<argsr'r'r+__exit__s zSession.__exit__c Cs|jpi}t|tjst|}ttt|j|}|j}|jr)|s)|js)t |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 )r0) r~rQfilesdatajsonr:rrrfr)rfr-rZ CookieJarr rr rrqr rQrZpreparer~upperrrrr2r:rrr5r)r<rprfZmerged_cookiesrpr'r'r+prepare_requests.      zSession.prepare_requestNTc Csxt|||||p i||pi||| d }||}| pi} ||j| | ||}| | d}|||j|fi|}|S)ax 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 ) r~rQr:rrrrrrfr)rLrP)rrrmerge_environment_settingsrQr.ri)r<r~rQrrr:rfrrrLrPrOrrKrMrNrrjZprepZsettingsZ send_kwargsr=r'r'r+rps..   zSession.requestcK |dd|jd|fi|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 rPTr|rvrpr<rQkwargsr'r'r+r4" z Session.getcKr)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 rPTZOPTIONSrrr'r'r+options-rzSession.optionscKr)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 rPFr{rrr'r'r+head8rz 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})rrrp)r<rQrrrr'r'r+postCs z Session.postcK|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 ZPUTrrr<rQrrr'r'r+putP z Session.putcKr)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 ZPATCHrrrr'r'r+patch\rz Session.patchcKs|jd|fi|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 ZDELETErrr'r'r+deletehszSession.deletec Ks|d|j|d|j|d|j|d|||jt|tr)td| dd}| d}|j }|j |j d}t}|j|fi|}t|} t| d |_td ||fi|}|jrq|jD] } t|j| j| jqet|j||j|r|j||fi|} d d | D} ng} | r| d || }| |_|szt|j||fddi||_Wn tyYnw|s|j|S)zISend a given PreparedRequest. :rtype: requests.Response rKrMrNrOz#You can only send PreparedRequests.rPT)rQ)Zsecondsr3cSsg|]}|qSr'r')r(r=r'r'r+r,sz Session.send..rrk)rvrKrMrNrgrOr-r ValueErrorrdr4r get_adapterrQpreferred_clockrirelapsedrrTr rfrprWroinsertnextZ_next StopIterationrU) r<rprrPrKradapterstartrrr=genrTr'r'r+rirsH       " z Session.sendc Cs|jr7|dur |dnd}t||d}|D] \}} ||| q|dus+|dur7tjdp6tjd}t||j}t||j }t||j }t||j }||||dS)z^ Check the environment and merge it with some settings. :rtype: dict NrrrsTZREQUESTS_CA_BUNDLEZCURL_CA_BUNDLE)rMrOrKrN) rqr4rr/rvosenvironr2rOrKrMrN) r<rQrOrKrMrNrrZ env_proxiesr)r*r'r'r+rs        z"Session.merge_environment_settingscCs<|jD]\}}||r|Sqtd|)z~ Returns the appropriate connection adapter for the given URL. :rtype: requests.adapters.BaseAdapter z*No connection adapters were found for {!r})rr/lowerr]rr[)r<rQprefixrr'r'r+rs zSession.get_adaptercCs|jD]}|qdS)z+Closes all adapters and as such the sessionN)rvaluesr\)r<r*r'r'r+r\s z Session.closecs>||j<fdd|jD}|D] }|j||j|<qdS)zwRegisters a connection adapter to a prefix. Adapters are sorted in descending order by prefix length. cs g|] }t|tkr|qSr')rY)r(r)rr'r+r,s z!Session.mount..N)rrd)r<rrZ keys_to_mover1r'rr+rs z Session.mountcsfddjD}|S)Ncsi|] }|t|dqSr&)getattr)r(attrrr'r+ sz(Session.__getstate__..) __attrs__)r<stater'rr+ __getstate__szSession.__getstate__cCs"|D] \}}t|||qdSr&)r/setattr)r<rrvaluer'r'r+ __setstate__szSession.__setstate__)NNNNNNNTNNNNNNrur&)rrr__doc__rrrrrrpr4rrrrrrrirrr\rrrr'r'r'r+rQs2>) L    K 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+sessions r)?rrsystimeZdatetimer collectionsrrrcompatrrrr r rfr r r rZmodelsrrrrrrZ_internal_utilsrZutilsrrr exceptionsrrrrZ structuresrrrrrr r!r"r#Z status_codesr$r%platform perf_counterrAttributeErrorZclockr2r5objectr6rrr'r'r'r+sF               r 3