B ㊇czG @sNddlZddlZddlZddlZddlZddlZddlmZddlm Z m Z m Z ddl m Zddl mZmZmZmZddl mZddl mZddlmZdd lmZmZmZmZmZmZm Z dd l!m"Z"ydd lm#Z#m$Z$Wn&e%k rdd l m#Z#m$Z$YnXy2e& ej'd e(d ddl)m*Z+WdQRXWn"e%k rXddlm+Z+YnXddl,Z-ddl.m/Z/m0Z0m1Z1m2Z2m3Z3ddl4m5Z5m Z m6Z6m7Z7m8Z8m9Z9mZmZe1e:e;Zej?@ej?AeBdZCyddlDmEZEWne%k rddZEYnXddZFd&ddZGddZHddZId d!ZJGd"d#d#ZKGd$d%d%ZLdS)'N) b64encode) PoolManagerTimeoutproxy_from_url)ConnectTimeoutError)LocationParseErrorNewConnectionError ProtocolError ProxyError)ReadTimeoutError)SSLError)Retry)DEFAULT_CIPHERSOP_NO_COMPRESSION PROTOCOL_TLS OP_NO_SSLv2 OP_NO_SSLv3 is_ipaddressssl) parse_url) OP_NO_TICKETPROTOCOL_TLS_CLIENTignore)category)orig_util_SSLContext) SSLContext) IPV6_ADDRZ_RE ensure_bytesfilter_ssl_warningsunquoteurlparse)ConnectionClosedErrorrEndpointConnectionErrorHTTPClientErrorInvalidProxiesConfigErrorProxyConnectionErrorr r < z cacert.pem)wherecCstS)N)DEFAULT_CA_BUNDLEr*r*o/private/var/folders/8c/hx9_v10d5x38qmnzt13b7b8j1k3n5b/T/pip-target-x6xd5gna/lib/python/botocore/httpsession.pyr(Qsr(cCs&|dk r |St}td||S)NTzCertificate path: )r(loggerdebug)verifyZ cert_pathr*r*r+ get_cert_pathUs r/cs|r |tkrt}t||p"t|dkr4tjn|}|dkrdd}|tO}|tO}|t O}|t O}j |O_ |tjkst j dkrtdddk rd_fdd}|tjkr|_|n ||_tdrtjd }|rt jjs|_S) zThis function is a vendored version of the same function in urllib3 We vendor this function to ensure that the SSL contexts we construct always use the std lib SSLContext instead of pyopenssl. Nr)post_handshake_authTcstdddk rd_dS)Ncheck_hostnameF)getattrr4r*)contextr*r+disable_check_hostnamesz6create_urllib3_context..disable_check_hostnamekeylog_filename SSLKEYLOGFILE)rrr set_ciphersrr CERT_REQUIREDrrrroptionssys version_infor5r3 verify_modehasattrosenvirongetflagsignore_environmentr8) ssl_version cert_reqsr<ciphersr7 sslkeylogfiler*)r6r+create_urllib3_context_s4      rJcCst|tr|S|dkSdS)z~Ensures a boolean value if a string or boolean is provided For strings, the value for True/False is case insensitive trueN) isinstanceboollower)valr*r*r+ensure_booleans rPcCs<d}t|}|jr"||j|d}|jr8||j|d}|S)z Mask proxy url credentials. :type proxy_url: str :param proxy_url: The proxy url, i.e. https://username:password@proxy.com :return: Masked proxy url, i.e. https://***:***@proxy.com z***)r usernamereplacepassword) proxy_urlmask parsed_urlr*r*r+mask_proxy_urls rXcCst|ptt|S)z@Wrap urllib3's is_ipaddress to support bracketed IPv6 addresses.)rrMrmatch)hostr*r*r+ _is_ipaddresssr[c@sNeZdZdZdddZddZddZed d Zd d Z d dZ ddZ dS)ProxyConfigurationaRepresents a proxy configuration dictionary and additional settings. This class represents a proxy configuration dictionary and provides utility functions to retreive well structured proxy urls and proxy headers from the proxy configuration dictionary. NcCs(|dkr i}|dkri}||_||_dS)N)_proxies_proxies_settings)selfproxiesproxies_settingsr*r*r+__init__s zProxyConfiguration.__init__cCs(t|}|j|j}|r$||}|S)z6Retrieves the corresponding proxy url for a given url.)r r]rCscheme_fix_proxy_url)r_urlrWproxyr*r*r+ proxy_url_fors  z ProxyConfiguration.proxy_url_forcCs2i}||\}}|r.|r.|||}||d<|S)z@Retrieves the corresponding proxy headers for a given proxy url.zProxy-Authorization)_get_auth_from_url_construct_basic_auth)r_rUheadersrRrT basic_authr*r*r+proxy_headers_fors  z$ProxyConfiguration.proxy_headers_forcCs|jS)N)r^)r_r*r*r+settingsszProxyConfiguration.settingscCs6|ds|dr|S|dr*d|Sd|SdS)Nzhttp:zhttps:z//zhttp://) startswith)r_rUr*r*r+rds  z!ProxyConfiguration._fix_proxy_urlcCs.|d|}t|d}d|S)N:asciizBasic )rencodestripdecode)r_rRrTauth_strZ encoded_strr*r*r+risz(ProxyConfiguration._construct_basic_authc Cs:t|}yt|jt|jfSttfk r4dSXdS)N)NN)r rrRrTAttributeError TypeError)r_rerWr*r*r+rhs z%ProxyConfiguration._get_auth_from_url)NN) __name__ __module__ __qualname____doc__rbrgrlpropertyrmrdrirhr*r*r*r+r\s  r\c@seZdZdZdddedddfddZddZdd Zd d Zd d Z ddZ ddZ ddZ dddZ ddZddZddZddZdS)URLLib3Sessiona_A basic HTTP client that supports connection pooling and proxies. This class is inspired by requests.adapters.HTTPAdapter, but has been boiled down to meet the use cases needed by botocore. For the most part this classes matches the functionality of HTTPAdapter in requests v2.7.0 (the same as our vendored version). The only major difference of note is that we currently do not support sending chunked requests. While requests v2.7.0 implemented this themselves, later version urllib3 support this directly via a flag to urlopen so enabling it if needed should be trivial. TNcCs||_t||d|_tjjtjjd|_|dkr4t}t |t t fsVt |d|dd}d|_ d|_t |trt||_ nt |tr|\|_ |_||_||_||_|dkrg|_i|_tf||_|j|j_dS)N)r`ra)httphttpsrrQ)connectread)_verifyr\ _proxy_configbotocore awsrequestZAWSHTTPConnectionPoolZAWSHTTPSConnectionPool_pool_classes_by_schemeDEFAULT_TIMEOUTrLintfloatr _cert_file _key_filestrtuple_timeout_max_pool_connections_socket_options_proxy_managersr_get_pool_manager_kwargs_managerpool_classes_by_scheme)r_r.r`timeoutZmax_pool_connectionssocket_options client_certZproxies_configr*r*r+rbs.     zURLLib3Session.__init__cKs,|jj}d|di|}dd|DS)Nuse_forwarding_for_httpsZproxy_use_forwarding_for_httpscSsi|]\}}|dk r||qS)Nr*).0kvr*r*r+ Dsz2URLLib3Session._proxies_kwargs..)rrmrCitems)r_kwargsraZproxies_kwargsr*r*r+_proxies_kwargs<s zURLLib3Session._proxies_kwargscKs2d|j|j||j|j|jd}|jf||S)NT)strictrmaxsize ssl_contextr cert_filekey_file)rr_get_ssl_contextrrrupdate)r_ extra_kwargsZpool_manager_kwargsr*r*r+rFs  z'URLLib3Session._get_pool_manager_kwargscCstS)N)rJ)r_r*r*r+rSszURLLib3Session._get_ssl_contextcCsf||jkr\|j|}||}|j|d}||j|dt|f|}|j|_ ||j|<|j|S)N) proxy_headers)proxy_ssl_context) rrrl_setup_proxy_ssl_contextrrrrrr)r_rUrrZproxy_manager_kwargs proxy_managerr*r*r+_get_proxy_managerVs     z!URLLib3Session._get_proxy_managercCs.t|}|j}|sd}|jr*|d|j}|S)N/?)r pathquery)r_rerWrr*r*r+ _path_urlfszURLLib3Session._path_urlcCs4|dr$|r$d|_t||_n d|_d|_dS)Nr~r; CERT_NONE)rNrnrGr/ca_certs)r_connrer.r*r*r+_setup_ssl_certos  zURLLib3Session._setup_ssl_certc Cs|jj}|d}|d}|dkr0|dkr0dS|}yft|}t|jsRd|_|dk rf|j|dt |t r|j |d|ddnt |t r| ||St ttfk r}zt|dWdd}~XYnXdS) Nproxy_ca_bundleZproxy_client_certT)cafilerrQ)keyfile)error)rrmrCrrr[rZr4load_verify_locationsrLrload_cert_chainrOSErrorURLLib3SSLErrorrr$)r_rUrarZ proxy_certr6reer*r*r+rws&       z'URLLib3Session._setup_proxy_ssl_contextcCs|r||}n|j}|S)N)rr)r_rerUmanagerr*r*r+_get_connection_managers z&URLLib3Session._get_connection_managercCsX|dk }|s||St|j}|dko6|dd}|sF|drJ|S||SdS)Nr~rFzhttp:)rr rcrrCrn)r_rerU has_proxy proxy_schemeZusing_https_forwarding_proxyr*r*r+_get_request_targets  z"URLLib3Session._get_request_targetcCs |dd}t|}|dkS)NzTransfer-Encodingschunked)rCrrN)r_rjZtransfer_encodingr*r*r+_chunkeds zURLLib3Session._chunkedcCs*|jx|jD] }|qWdS)N)rclearrvalues)r_rr*r*r+closes zURLLib3Session.closec Cs8y|j|j}||j|}||j}|||j|jttj ddrdt |jj }||j d<||j|}|j|j||j|jtdddd||jd }tj|j|j|j|}|js|j|Stk r} zt|j| dWdd} ~ XYn<ttjfk r0} zt |j| dWdd} ~ XYnt!k rb} zt"t#|| dWdd} ~ XYnt$k r} zt%|j| dWdd} ~ XYnt&k r} zt'|j| dWdd} ~ XYnrt(k r} zt)| ||jdWdd} ~ XYn@t*k r2} z d } t+j,| d d t-| d Wdd} ~ XYnXdS) NZ(BOTO_EXPERIMENTAL__ADD_PROXY_HOST_HEADERrZF) methodrebodyrjretriesassert_same_hostpreload_contentdecode_contentchunked) endpoint_urlr)rUr)rrequestrz4Exception received when sending urllib3 HTTP requestT)exc_info)r).rrgrerconnection_from_urlrrrPrArBrCr hostnamerrurlopenrrrjr rrrZ AWSResponsestatusZ stream_outputcontentrr rsocketgaierrorr"r r%rXURLLib3ConnectTimeoutErrorrURLLib3ReadTimeoutErrorr r r! Exceptionr,r-r#) r_rrUrrrZZrequest_targetZurllib_response http_responsermessager*r*r+sends\     zURLLib3Session.send)N)rwrxryrzMAX_POOL_CONNECTIONSrbrrrrrrrrrrrrr*r*r*r+r| s(      r|)NNNN)MloggingrAos.pathrr=warningsbase64rurllib3rrrZurllib3.exceptionsrrrrr r r rr rZurllib3.util.retryr Zurllib3.util.ssl_rrrrrrrZurllib3.util.urlrrr ImportErrorcatch_warnings simplefilterDeprecationWarningZurllib3.contrib.pyopensslrrZbotocore.awsrequestrZbotocore.compatrrrrr Zbotocore.exceptionsr!r"r#r$r% getLoggerrwr,rrrjoindirname__file__r)certifir(r/rJrPrXr[r\r|r*r*r*r+sV     $  (   L ;