B =@Say:@sddlZddlZddlZddlZddlmZddlZddlmZm Z m Z m Z ddl m Z ddlmZmZmZmZmZddlmZddlmZddlmZdd lmZmZmZydd lmZ Wn e!k rdd lm Z YnXddl"Z#dd l$m%Z%dd l&m'Z'ddl(m)Z)m*Z*ddl+m,Z,m-Z-m.Z.mZm/Z/mZmZm0Z0e)e1e2Z3dZ4dZ5ej67ej68e9dZ:yddl;mddZ?Gddde@ZAGddde@ZBdS)!N) b64encode) PoolManager ProxyManagerproxy_from_urlTimeout)Retry)ssl OP_NO_SSLv2 OP_NO_SSLv3OP_NO_COMPRESSIONDEFAULT_CIPHERS)SSLError)ReadTimeoutError)ConnectTimeoutError)NewConnectionError ProtocolError ProxyError)orig_util_SSLContext) SSLContext)six)unquote)filter_ssl_warningsurlparse)ConnectionClosedErrorEndpointConnectionErrorHTTPClientErrorrProxyConnectionErrorrr InvalidProxiesConfigError< z cacert.pem)wherecCstS)N)DEFAULT_CA_BUNDLEr"r"l/private/var/folders/fg/1jzmct0d7d72tjkvm_1nhqc5sw67yj/T/pip-unpacked-wheel-ef76ia09/botocore/httpsession.pyr *sr cCs&|dk r |St}td||S)NTzCertificate path: {0})r loggerdebugformat)verifyZ cert_pathr"r"r# get_cert_path.s r(cCst|p tj}|dkrtjn|}|dkrDd}|tO}|tO}|tO}|j|O_t|ddrl| |pht ||_ t|dddk rd|_ t |drtjd}|rtjjs||_|S) z This 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. NrZsupports_set_ciphersTcheck_hostnameFkeylog_filenameZ SSLKEYLOGFILE)rrPROTOCOL_SSLv23 CERT_REQUIREDr r r optionsgetattr set_ciphersr verify_moder)hasattrosenvirongetsysflagsignore_environmentr*) ssl_version cert_reqsr-cipherscontextZ keylogfiler"r"r#create_urllib3_context8s$    r<cCst|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_booleanes rBc@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__ws zProxyConfiguration.__init__cCs(t|}|j|j}|r$||}|S)z7Retrieves the corresponding proxy url for a given url. )rrDr4scheme_fix_proxy_url)rFurl parsed_urlproxyr"r"r# proxy_url_fors  z ProxyConfiguration.proxy_url_forcCs2i}||\}}|r.|r.|||}||d<|S)zARetrieves the corresponding proxy headers for a given proxy url. zProxy-Authorization)_get_auth_from_url_construct_basic_auth)rF proxy_urlheadersusernamepassword basic_authr"r"r#proxy_headers_fors  z$ProxyConfiguration.proxy_headers_forcCs|jS)N)rE)rFr"r"r#settingsszProxyConfiguration.settingscCs6|ds|dr|S|dr*d|Sd|SdS)Nzhttp:zhttps:z//zhttp://) startswith)rFrRr"r"r#rKs  z!ProxyConfiguration._fix_proxy_urlcCs,d||}t|d}d|S)Nz{0}:{1}asciiz Basic {0})r&rencodestripdecode)rFrTrUauth_strZ encoded_strr"r"r#rQs z(ProxyConfiguration._construct_basic_authc Cs:t|}yt|jt|jfSttfk r4dSXdS)N)NN)rrrTrUAttributeError TypeError)rFrLrMr"r"r#rPs z%ProxyConfiguration._get_auth_from_url)NN) __name__ __module__ __qualname____doc__rIrOrWpropertyrXrKrQrPr"r"r"r#rCps  rCc@seZdZdZdddedddfddZeddZdd Zd d Z d d Z ddZ ddZ ddZ dddZddZddZddZdS)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)rGrH)httphttpsr)connectread)_verifyrC _proxy_configbotocore awsrequestZAWSHTTPConnectionPoolZAWSHTTPSConnectionPool_pool_classes_by_schemeDEFAULT_TIMEOUTr>intfloatr _cert_file _key_filestrtuple_timeout_max_pool_connections_socket_options_proxy_managersr_get_pool_manager_kwargs_managerpool_classes_by_scheme)rFr'rGtimeoutZmax_pool_connectionssocket_options client_certZproxies_configr"r"r#rIs.     zURLLib3Session.__init__cCs4|jj}||}||dd}dd|DS)NZproxy_use_forwarding_for_https)proxy_ssl_contextuse_forwarding_for_httpscSsi|]\}}|dk r||qS)Nr").0kvr"r"r# sz2URLLib3Session._proxies_kwargs..)rmrX_setup_proxy_ssl_contextr4items)rFrHrZproxies_kwargsr"r"r#_proxies_kwargss   zURLLib3Session._proxies_kwargscKs2d|j|j||j|j|jd}|jf||S)NT)strictrmaxsize ssl_contextr cert_filekey_file)rxry_get_ssl_contextrzrtruupdate)rF extra_kwargsZpool_manager_kwargsr"r"r#r|s  z'URLLib3Session._get_pool_manager_kwargscCstS)N)r<)rFr"r"r#rszURLLib3Session._get_ssl_contextcCsX||jkrN|j|}|j|d}|jf|jt|f|}|j|_||j|<|j|S)N) proxy_headers) r{rmrWr|rrrrpr~)rFrRrZproxy_manager_kwargs proxy_managerr"r"r#_get_proxy_managers    z!URLLib3Session._get_proxy_managercCs.t|}|j}|sd}|jr*|d|j}|S)N/?)rpathquery)rFrLrMrr"r"r# _path_urlszURLLib3Session._path_urlcCs4|dr$|r$d|_t||_n d|_d|_dS)Nrhr, CERT_NONE)r@rYr9r(ca_certs)rFconnrLr'r"r"r#_setup_ssl_cert s  zURLLib3Session._setup_ssl_certc Cs|d}|d}|dkr(|dkr(dS|}yTd|_|dk rL|j|dt|trn|j|d|ddnt|tr|||Stt fk r}zt |dWdd}~XYnXdS) Nproxy_ca_bundleZproxy_client_certT)cafilerri)keyfile)error) r4rr)load_verify_locationsr>rwload_cert_chainrvIOErrorURLLib3SSLErrorr)rFrHrZ proxy_certr;er"r"r#rs       z'URLLib3Session._setup_proxy_ssl_contextcCs|r||}n|j}|S)N)rr})rFrLrRmanagerr"r"r#_get_connection_manager)s z&URLLib3Session._get_connection_managercCsV|dk }|s||St|j}|dko4|jdd}|sD|drH|S||SdS)NrhrFzhttp:)rrrJrr4rY)rFrLrR has_proxy proxy_schemeZusing_https_forwarding_proxyr"r"r#_get_request_target0s  z"URLLib3Session._get_request_targetcCs|dddkS)NzTransfer-Encodingchunked)r4)rFrSr"r"r#_chunkedDszURLLib3Session._chunkedc Cs4y|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} ~ XYn8ttjfk r0} zt |j| dWdd} ~ XYnt!k r^} zt"|| dWdd} ~ XYnt#k r} zt$|j| dWdd} ~ XYnt%k r} zt&|j| dWdd} ~ XYnrt'k r} zt(| ||jdWdd} ~ XYn@t)k r.} z d } t*j+| d d t,| d Wdd} ~ XYnXdS) NZ(BOTO_EXPERIMENTAL__ADD_PROXY_HOST_HEADERrhostF) methodrLbodyrSretriesassert_same_hostpreload_contentdecode_contentr) endpoint_urlr)rRr)rrequestrz4Exception received when sending urllib3 HTTP requestT)exc_info)r)-rmrOrLrconnection_from_urlrrlrBr2r3r4rhostnamerrurlopenrrrSrrrnroZ AWSResponsestatusZ stream_outputcontentrr rsocketgaierrorrrrURLLib3ConnectTimeoutErrorrURLLib3ReadTimeoutErrorrrr Exceptionr$r%r) rFrrRrrrZrequest_targetZurllib_response http_responsermessager"r"r#sendGs^     zURLLib3Session.send)N)rarbrcrdMAX_POOL_CONNECTIONSrIrerr|rrrrrrrrrr"r"r"r#rfs&       rf)NNNN)Cos.pathr2loggingrbase64rr5urllib3rrrrZurllib3.util.retryrZurllib3.util.ssl_rr r r r Zurllib3.exceptionsr rrrrrrrrZurllib3.contrib.pyopensslrr ImportErrorZbotocore.awsrequestrnZbotocore.vendoredrZ(botocore.vendored.six.moves.urllib_parserZbotocore.compatrrZbotocore.exceptionsrrrrr getLoggerrar$rqrrjoindirname__file__r!certifir r(r<rBobjectrCrfr"r"r"r#sH       (   , :