B k×]”rã@s˜dZddlZddlZddlZddlmZddlmZddlm Z m Z m Z m Z m Z mZddlmZmZmZmZddlmZmZmZdd lmZmZdd lmZdd lmZmZm Z dd l!m"Z"m#Z#m$Z$m%Z%dd l&m'Z'ddl(m)Z)ddlm*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ddl0m1Z1ddlm2Z2ej3dkrNy ej4Z5Wne6k rJej7Z5YnXnejZ5e fdd„Z8e fdd„Z9Gdd„de:ƒZ;Gdd„de;ƒZIsz!merge_setting..)Ú isinstancer rÚupdateÚitems)Úrequest_settingÚsession_settingÚ dict_classÚmerged_settingÚ none_keysÚkeyr'r'r+Ú merge_setting1s     r6cCs@|dks| d¡gkr|S|dks0| d¡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_hooksPs r;c@s>eZdZdd„Zdd„Zddd „Zd d „Zd d „Zdd„ZdS)ÚSessionRedirectMixincCs,|jr(|jd}tr| d¡}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_targetas    z(SessionRedirectMixin.get_redirect_targetcCsšt|ƒ}t|ƒ}|j|jkr dS|jdkrL|jdkrL|jdkrL|jdkrLdS|j|jk}|j|jk}t |jd¡df}|s’|j|kr’|j|kr’dS|p˜|S)zFDecide whether Authorization header should be removed when redirectingTÚhttp)éPNÚhttps)i»NFN)r ÚhostnameÚschemeÚportrr8)rCÚold_urlÚnew_urlÚ old_parsedÚ new_parsedÚ changed_portÚchanged_schemeÚ default_portr'r'r+Úshould_strip_authvs    z&SessionRedirectMixin.should_strip_authFNTc  ksdg} | |¡} t|jƒj} xB| r^| ¡} |  |¡| dd…|_y |jWn(tt t fk rv|j j ddYnXt |jƒ|jkrštd|j|d‚| ¡|  d¡rÈt|jƒ}dt|jƒ| f} t| ƒ}|jd krì| rì|j| d }n |jrø|j} | ¡} |jst|jt| ƒƒ} nt| ƒ} t| ƒ| _| | |¡|jtjtjfkrtd }x|D]}| j |d¡qVWd| _ | j}y |d =Wnt!k ršYnXt"| j#||j ƒt$| j#|j%ƒ|  &| j#¡| '| |¡}| (| |¡| j)dk oúd |kpúd|k}|r t*| ƒ| }|r|Vq|j+|f|||||ddœ| —Ž}t"|j%| |j ƒ| |¡} |VqWdS)zBReceives a Response. Returns a generator of Responses or Requests.rNF)Údecode_contentzExceeded %s redirects.)r7z//z%s:%sÚ)Úfragment)zContent-Lengthz Content-TypezTransfer-EncodingÚCookiezContent-LengthzTransfer-Encoding)ÚstreamÚtimeoutÚverifyÚcertÚproxiesÚallow_redirects),rEr ÚurlrVÚcopyÚappendÚhistoryÚcontentrrÚ RuntimeErrorÚrawÚreadÚlenÚ max_redirectsrÚcloseÚ startswithrrJÚ_replaceÚgeturlÚnetlocrrÚrebuild_methodÚ status_coder$Útemporary_redirectÚpermanent_redirectrAÚpopÚbodyÚKeyErrorr Ú_cookiesrÚcookiesÚprepare_cookiesÚrebuild_proxiesÚ rebuild_authÚ_body_positionr#Úsend)rCrDÚreqrXrYrZr[r\Úyield_requestsÚadapter_kwargsÚhistr^Úprevious_fragmentÚprepared_requestÚ parsed_rurlÚparsedÚpurged_headersÚheaderrAÚ rewindabler'r'r+Úresolve_redirectss|                z&SessionRedirectMixin.resolve_redirectscCsR|j}|j}d|kr*| |jj|¡r*|d=|jr8t|ƒnd}|dk rN| |¡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)rAr^rSÚrequestÚ trust_envr Ú prepare_auth)rCr€r7rAr^Únew_authr'r'r+rxs z!SessionRedirectMixin.rebuild_authc CsÖ|dk r |ni}|j}|j}t|ƒj}| ¡}| d¡}t||d}|jr||s|t||d} |  ||  d¡¡} | r||  || ¡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) rAr^r rJr_r8r!r‰rÚ setdefaultr"rsr) rCr€r\rAr^rJÚ new_proxiesrŒÚ bypass_proxyÚenviron_proxiesÚproxyÚusernameÚpasswordr'r'r+rws*       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)Úmethodrnr$Ú see_otherÚfoundÚmoved)rCr€r7r˜r'r'r+rm=sz#SessionRedirectMixin.rebuild_method)FNTNNF) Ú__name__Ú __module__Ú __qualname__rErSr†rxrwrmr'r'r'r+r<_s p)r<c@sÎeZdZdZdddddddd d d d d dg Zdd„Zdd„Zdd„Zdd„Zd7dd„Z dd„Z dd„Z dd „Z d8d!d"„Z d9d#d$„Zd:d%d&„Zd'd(„Zd)d*„Zd+d,„Zd-d.„Zd/d0„Zd1d2„Zd3d4„Zd5d6„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') rAruÚauthr\ÚhooksÚparamsrZr[ÚprefetchÚadaptersrXr‰rgcCsrtƒ|_d|_i|_tƒ|_i|_d|_d|_d|_ t |_ d|_ t iƒ|_tƒ|_| dtƒ¡| dtƒ¡dS)NFTzhttps://zhttp://)rrAr r\rr¡r¢rXrZr[rrgr‰r rurr¤Úmountr)rCr'r'r+Ú__init__ms zSession.__init__cCs|S)Nr')rCr'r'r+Ú __enter__¤szSession.__enter__cGs | ¡dS)N)rh)rCÚargsr'r'r+Ú__exit__§szSession.__exit__c Cs²|jpi}t|tjƒst|ƒ}tttƒ|jƒ|ƒ}|j}|jrR|sR|jsRt |j ƒ}t ƒ}|j |j  ¡|j |j|j|jt|j|jtdt|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˜r^ÚfilesÚdataÚjsonrAr¢r rur¡)rur-rÚ CookieJarr rr r r‰r r^rÚpreparer˜Úupperrªr«r¬r6rArr¢r;r¡)rCrˆruÚmerged_cookiesr Úpr'r'r+Úprepare_requestªs*     zSession.prepare_requestNTc Cstt| ¡||||pi||pi||| d }| |¡}| p8i} | |j| | ||¡}| | dœ}| |¡|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˜r^rArªr«r¬r¢r rur¡)rYr])rr¯r²Úmerge_environment_settingsr^r.rz)rCr˜r^r¢r«rArurªr rYr]r\r¡rXrZr[r¬r{ÚprepÚsettingsÚ send_kwargsrDr'r'r+rˆÒs()  zSession.requestcKs| dd¡|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 r]Tr–)rŽrˆ)rCr^Úkwargsr'r'r+r8s z Session.getcKs| dd¡|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 r]TÚOPTIONS)rŽrˆ)rCr^r·r'r'r+Úoptions$s zSession.optionscKs| dd¡|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 r]Fr•)rŽrˆ)rCr^r·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ˆ)rCr^r«r¬r·r'r'r+Úpost:s 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^r«r·r'r'r+ÚputGs 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^r«r·r'r'r+ÚpatchSs 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ˆ)rCr^r·r'r'r+Údelete_szSession.deletec Ks~| d|j¡| d|j¡| d|j¡| d|j¡t|tƒrJtdƒ‚| dd¡}|  d¡}|j }|j |j d}t ƒ}|j|f|Ž}t ƒ|} t| d |_td ||f|Ž}|jrÖx |jD]} t|j| j| jƒq¼Wt|j||jƒ|j||f|Ž} |r d d „| Dƒng} | r.|  d |¡|  ¡}| |_|sny"t|j||fddi|—Žƒ|_Wntk rlYnX|sz|j|S)zISend a given PreparedRequest. :rtype: requests.Response rXrZr[r\z#You can only send PreparedRequests.r]T)r^)Úsecondsr7cSsg|]}|‘qSr'r')r(rDr'r'r+r,œsz Session.send..rr|)rŽrXrZr[r\r-rÚ ValueErrorrqr8r¡Ú get_adapterr^Úpreferred_clockrzrÚelapsedrrar rurˆrdr†ÚinsertÚnextÚ_nextÚ StopIterationrb) rCrˆr·r]rXr¡ÚadapterÚstartÚrrÆrDÚgenrar'r'r+rzisB       "z Session.sendc Cs°|jrr|dk r| d¡nd}t||d}x | ¡D]\}} | || ¡q2W|dksZ|dkrrtj d¡pptj d¡}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)rZr\rXr[) r‰r8rr/rŽÚosÚenvironr6r\rXrZr[) rCr^r\rXrZr[rŒÚ env_proxiesr)r*r'r'r+r³²s       z"Session.merge_environment_settingscCs>x,|j ¡D]\}}| ¡ | ¡¡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 '%s'N)r¤r/Úlowerrir)rCr^ÚprefixrËr'r'r+rÄÏszSession.get_adaptercCs x|j ¡D] }| ¡q WdS)z+Closes all adapters and as such the sessionN)r¤Úvaluesrh)rCr*r'r'r+rhÝsz 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|ƒtˆƒkr|‘qSr')rf)r(r))rÕr'r+r,èsz!Session.mount..N)r¤rq)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 | ¡D]\}}t|||ƒq WdS)N)r/Úsetattr)rCrÜrÙÚvaluer'r'r+Ú __setstate__ñszSession.__setstate__)NNNNNNNTNNNNNN)NN)N)N)rœrržÚ__doc__rÛr¦r§r©r²rˆr8r¹rºr»r½r¿rÁrzr³rÄrhr¥rÝràr'r'r'r+rŸTs2 7) D    I 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Údatetimerr rÚcompatrrrrr r rur 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+Ú s@             v%