3 ”Re„rã @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/m0Z0ddl1m2Z2ddlm3Z3ej4dk�rVy ej5Z6Wne7k �rRej8Z6YnXnejZ6efdd„Z9efdd„Z:Gdd„de;ƒZdS)z“ requests.session ~~~~~~~~~~~~~~~~ This module provides a Session object to manage and persist settings across requests (cookies, auth, proxies). éN)Ú timedelta)Ú OrderedDicté)Ú_basic_auth_str)Ú cookielibÚis_py3ÚurljoinÚurlparseÚMapping)Úcookiejar_from_dictÚextract_cookies_to_jarÚRequestsCookieJarÚ merge_cookies)ÚRequestÚPreparedRequestÚDEFAULT_REDIRECT_LIMIT)Ú default_hooksÚ dispatch_hook)Úto_native_string)Úto_key_val_listÚdefault_headersÚ DEFAULT_PORTS)ÚTooManyRedirectsÚ InvalidSchemaÚChunkedEncodingErrorÚContentDecodingError)ÚCaseInsensitiveDict)Ú HTTPAdapter)Ú requote_uriÚget_environ_proxiesÚget_netrc_authÚshould_bypass_proxiesÚget_auth_from_urlÚ rewind_body)Úcodes)ÚREDIRECT_STATIÚwin32cCst|dkr |S|dkr|St|tƒo*t|tƒs0|S|t|ƒƒ}|jt|ƒƒdd„|jƒDƒ}x|D] }||=qbW|S)zè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` NcSsg|]\}}|dkr|‘qS)N©)Ú.0ÚkÚvr'r'úŒ/builddir/build/BUILDROOT/alt-python36-pip-20.2.4-5.el8.x86_64/opt/alt/python36/lib/python3.6/site-packages/pip/_vendor/requests/sessions.pyú Jsz!merge_setting..)Ú isinstancer rÚupdateÚitems)Úrequest_settingÚsession_settingÚ dict_classÚmerged_settingÚ none_keysÚkeyr'r'r+Ú merge_setting2s     r6cCs@|dks|jdƒgkr|S|dks0|jdƒgkr4|St|||ƒS)z©Properly merges both requests and session hooks. This is necessary because when request_hooks == {'response': []}, the merge breaks Session hooks entirely. NÚresponse)Úgetr6)Ú request_hooksÚ session_hooksr2r'r'r+Ú merge_hooksQs r;c@s>eZdZdd„Zdd„Zddd „Zd d „Zd d „Zdd„ZdS)ÚSessionRedirectMixincCs,|jr(|jd}tr|jdƒ}t|dƒSdS)z7Receives a Response. Returns a redirect URI or ``None``ÚlocationÚlatin1Úutf8N)Ú is_redirectÚheadersrÚencoder)ÚselfÚrespr=r'r'r+Úget_redirect_targetbs    z(SessionRedirectMixin.get_redirect_targetcCsœt|ƒ}t|ƒ}|j|jkr dS|jdkrL|jdkrL|jdkrL|jd krLdS|j|jk}|j|jk}tj|jdƒdf}| r”|j|kr”|j|kr”dS|pš|S) zFDecide whether Authorization header should be removed when redirectingTÚhttpéPNÚhttpsé»F)rGN)rIN)r ÚhostnameÚschemeÚportrr8)rCÚold_urlÚnew_urlÚ old_parsedÚ new_parsedÚ changed_portÚchanged_schemeÚ default_portr'r'r+Úshould_strip_authws    z&SessionRedirectMixin.should_strip_authFNTc ksRg} |j|ƒ} t|jƒj} �x0| �rL|jƒ} | j|ƒ| dd…|_y |jWn(tt t fk rv|j j dd�YnXt |jƒ|jkrœtdj|jƒ|d�‚|jƒ| jdƒrÌt|jƒ}djt|jƒ| gƒ} t| ƒ}|jd krð| rð|j| d �}n |jrü|j} |jƒ} |j�st|jt| ƒƒ} nt| ƒ} t| ƒ| _|j| |ƒ|jtjtjfk�rxd}x|D]}| j j!|dƒ�qZWd| _"| j }|j!ddƒt#| j$||j ƒt%| j$|j&ƒ| j'| j$ƒ|j(| |ƒ}|j)| |ƒ| j*dk �oèd |k�pèd |k}|�røt+| ƒ| }|�r |Vq|j,|f|||||ddœ| —Ž}t#|j&| |j ƒ|j|ƒ} |VqWdS)zBReceives a Response. Returns a generator of Responses or Requests.rNF)Údecode_contentzExceeded {} redirects.)r7z//ú:Ú)ÚfragmentúContent-Lengthú Content-TypeúTransfer-EncodingÚCookie)ÚstreamÚtimeoutÚverifyÚcertÚproxiesÚallow_redirects)rYrZr[)-rEr ÚurlrXÚcopyÚappendÚhistoryÚcontentrrÚ RuntimeErrorÚrawÚreadÚlenÚ max_redirectsrÚformatÚcloseÚ startswithÚjoinrrKÚ_replaceÚgeturlÚnetlocrrÚrebuild_methodÚ status_coder$Útemporary_redirectÚpermanent_redirectrAÚpopÚbodyr Ú_cookiesrÚcookiesÚprepare_cookiesÚrebuild_proxiesÚ rebuild_authÚ_body_positionr#Úsend)rCrDÚreqr]r^r_r`raÚyield_requestsÚadapter_kwargsÚhistrcÚprevious_fragmentÚprepared_requestÚ parsed_rurlÚparsedÚpurged_headersÚheaderrAÚ rewindabler'r'r+Úresolve_redirects�sv                z&SessionRedirectMixin.resolve_redirectscCsR|j}|j}d|kr*|j|jj|ƒr*|d=|jr8t|ƒnd}|dk rN|j|ƒdS)zé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. Ú AuthorizationN)rArcrTÚrequestÚ trust_envr Ú prepare_auth)rCr†r7rArcÚnew_authr'r'r+r~þsz!SessionRedirectMixin.rebuild_authc CsØ|dk r |ni}|j}|j}t|ƒj}|jƒ}|jdƒ}t||d�}|jr~| r~t||d�} | j|| jdƒƒ} | r~|j || ƒd|krŒ|d=yt ||ƒ\} } Wnt k r¼d\} } YnX| rÔ| rÔt | | ƒ|d<|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Úno_proxy)r’ÚallzProxy-Authorization)NN) rArcr rKrdr8r!r�rÚ setdefaultr"ÚKeyErrorr) rCr†rarArcrKÚ new_proxiesr’Ú bypass_proxyÚenviron_proxiesÚproxyÚusernameÚpasswordr'r'r+r}s*       z$SessionRedirectMixin.rebuild_proxiescCsX|j}|jtjkr|dkrd}|jtjkr6|dkr6d}|jtjkrN|dkrNd}||_dS)z‚When being redirected we may want to change the method of the request based on certain specs or browser behavior. ÚHEADÚGETÚPOSTN)Úmethodrur$Ú see_otherÚfoundÚmoved)rCr†r7rŸr'r'r+rt:sz#SessionRedirectMixin.rebuild_method)FNTNNF) Ú__name__Ú __module__Ú __qualname__rErTrŒr~r}rtr'r'r'r+r<`s m)r<c@sÌeZdZdZdddddddd d d d d g Zdd„Zdd„Zdd„Zdd„Zd6dd„Z dd„Z dd„Z dd„Z d7d d!„Z d8d"d#„Zd9d$d%„Zd&d'„Zd(d)„Zd*d+„Zd,d-„Zd.d/„Zd0d1„Zd2d3„Zd4d5„ZdS):ÚSessiona€A 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') rAr{ÚauthraÚhooksÚparamsr_r`Úadaptersr]r�rlcCsrtƒ|_d|_i|_tƒ|_i|_d|_d|_d|_ t |_ d|_ t iƒ|_tƒ|_|jdtƒƒ|jdtƒƒdS)NFTzhttps://zhttp://)rrAr§rarr¨r©r]r_r`rrlr�r r{rrªÚmountr)rCr'r'r+Ú__init__js zSession.__init__cCs|S)Nr')rCr'r'r+Ú __enter__¡szSession.__enter__cGs |jƒdS)N)rn)rCÚargsr'r'r+Ú__exit__¤szSession.__exit__c Cs¶|jpi}t|tjƒst|ƒ}tttƒ|jƒ|ƒ}|j}|jrV| rV|j rVt |j ƒ}t ƒ}|j |j jƒ|j |j|j|jt|j|jtd�t|j|jƒt||jƒ|t|j|jƒd� |S)a‹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 )r2) rŸrcÚfilesÚdataÚjsonrAr©r§r{r¨)r{r-rÚ CookieJarr rr r§r�r rcrÚpreparerŸÚupperr°r±r²r6rArr©r;r¨)rCrŽr{Úmerged_cookiesr§Úpr'r'r+Úprepare_request§s*     zSession.prepare_requestNTc Cstt|jƒ||||pi||pi||| d� }|j|ƒ}| p8i} |j|j| | ||ƒ}| | dœ}|j|ƒ|j|f|Ž}|S)aConstructs 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ŸrcrAr°r±r²r©r§r{r¨)r^rb)rrµr¸Úmerge_environment_settingsrcr.r€)rCrŸrcr©r±rAr{r°r§r^rbrar¨r]r_r`r²r�ÚprepÚsettingsÚ send_kwargsrDr'r'r+rŽÏs()  zSession.requestcKs|jddƒ|jd|f|ŽS)zå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 rbTr�)r”rŽ)rCrcÚkwargsr'r'r+r8s z Session.getcKs|jddƒ|jd|f|ŽS)zé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 rbTÚOPTIONS)r”rŽ)rCrcr½r'r'r+Úoptions!s zSession.optionscKs|jddƒ|jd|f|ŽS)zæ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 rbFrœ)r”rŽ)rCrcr½r'r'r+Úhead,s z Session.headcKs|jd|f||dœ|—ŽS)aÈ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Ž)rCrcr±r²r½r'r'r+Úpost7s 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Ž)rCrcr±r½r'r'r+ÚputDs 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Ž)rCrcr±r½r'r'r+ÚpatchPs z Session.patchcKs|jd|f|ŽS)zè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 ÚDELETE)rŽ)rCrcr½r'r'r+Údelete\szSession.deletec Ks€|jd|jƒ|jd|jƒ|jd|jƒ|jd|jƒt|tƒrJtdƒ‚|jddƒ}|j dƒ}|j }|j |j d�}t ƒ}|j|f|Ž}t ƒ|} t| d �|_td ||f|Ž}|jrÖx |jD]} t|j| j| jƒq¼Wt|j||jƒ|�r |j||f|Ž} d d „| Dƒ} ng} | �r0| jd |ƒ| jƒ}| |_|�spy"t|j||fddi|—Žƒ|_Wntk �rnYnX|�s||j|S)zISend a given PreparedRequest. :rtype: requests.Response r]r_r`raz#You can only send PreparedRequests.rbT)rc)Úsecondsr7cSsg|]}|‘qSr'r')r(rDr'r'r+r,™sz Session.send..rr‚)r”r]r_r`rar-rÚ ValueErrorrxr8r¨Ú get_adapterrcÚpreferred_clockr€rÚelapsedrrfr r{rŽrirŒÚinsertÚnextÚ_nextÚ StopIterationrg) rCrŽr½rbr]r¨ÚadapterÚstartÚrrÌrDÚgenrfr'r'r+r€fsF       "z Session.sendc Cs°|jrr|dk r|jdƒnd}t||d�}x |jƒD]\}} |j|| ƒq2W|dksZ|dkrrtjjdƒpptjjdƒ}t||jƒ}t||j ƒ}t||j ƒ}t||j ƒ}||||dœS)z^ Check the environment and merge it with some settings. :rtype: dict Nr’)r’TÚREQUESTS_CA_BUNDLEÚCURL_CA_BUNDLE)r_rar]r`) r�r8rr/r”ÚosÚenvironr6rar]r_r`) rCrcrar]r_r`r’Ú env_proxiesr)r*r'r'r+r¹±s       z"Session.merge_environment_settingscCs@x,|jjƒD]\}}|jƒj|jƒƒr |Sq Wtdj|ƒƒ‚dS)z~ Returns the appropriate connection adapter for the given URL. :rtype: requests.adapters.BaseAdapter z*No connection adapters were found for {!r}N)rªr/Úlowerrorrm)rCrcÚprefixrÑr'r'r+rÊÎszSession.get_adaptercCs x|jjƒD] }|jƒq WdS)z+Closes all adapters and as such the sessionN)rªÚvaluesrn)rCr*r'r'r+rnÜsz Session.closecsB||jˆ<‡fdd„|jDƒ}x|D]}|jj|ƒ|j|<q$WdS)zwRegisters a connection adapter to a prefix. Adapters are sorted in descending order by prefix length. cs g|]}t|ƒtˆƒkr|‘qSr')rk)r(r))rÛr'r+r,çsz!Session.mount..N)rªrx)rCrÛrÑÚ keys_to_mover5r')rÛr+r«ás  z Session.mountcs‡fdd„ˆjDƒ}|S)Ncsi|]}tˆ|dƒ|“qS)N)Úgetattr)r(Úattr)rCr'r+ú ísz(Session.__getstate__..)Ú __attrs__)rCÚstater')rCr+Ú __getstate__ìszSession.__getstate__cCs&x |jƒD]\}}t|||ƒq WdS)N)r/Úsetattr)rCrârßÚvaluer'r'r+Ú __setstate__ðszSession.__setstate__)NNNNNNNTNNNNNN)NN)N)N)r£r¤r¥Ú__doc__rár¬r­r¯r¸rŽr8r¿rÀrÁrÃrÅrÇr€r¹rÊrnr«rãrær'r'r'r+r¦Qs27) D    K r¦cCstƒS)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 )r¦r'r'r'r+Úsessionõs rè)?rçr×ÚsysÚtimeÚdatetimerÚ collectionsrr§rÚcompatrrrr r r{r r r rÚmodelsrrrr¨rrÚ_internal_utilsrÚutilsrrrÚ exceptionsrrrrÚ structuresrrªrrrr r!r"r#Ú status_codesr$r%ÚplatformÚ perf_counterrËÚAttributeErrorÚclockr6r;Úobjectr<r¦rèr'r'r'r+Ú sB             r'