U m^,@sddlZddlZddlZddlmZddlmZmZm Z m Z ddl m Z ddl mZmZmZmZmZddlmZddlmZddlmZdd lmZmZmZzdd lmZWn e k rdd l mZYnXddl!Z"dd l#m$Z$dd l%m&Z&ddl'm(Z(m)Z)ddl*m+Z+m,Z,m-Z-mZm.Z.mZmZe(e/e0Z1dZ2dZ3ej45ej46e7dZ8zddl9m:Z:Wne k r~ddZ:YnXddZ;dddZGddde=Z?dS)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 < z cacert.pemwherecCstSN)DEFAULT_CA_BUNDLEr#r#n/private/var/folders/sd/whlwsn6x1_qgglc0mjv25_695qk2gl/T/pip-install-4zq3fp6i/botocore/botocore/httpsession.pyr 'sr cCs|dk r |StS)NTr)verifyr#r#r$ get_cert_path+sr&cCst|p tj}|dkrtjn|}|dkrDd}|tO}|tO}|tO}|j|O_t|ddrl| |pht ||_ t|dddk rd|_ |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_hostnameF) rrPROTOCOL_SSLv23 CERT_REQUIREDr r r optionsgetattr set_ciphersr verify_moder') ssl_version cert_reqsr*cipherscontextr#r#r$create_urllib3_context2s r2c@sBeZdZdZdddZddZddZd d Zd d Zd dZ dS)ProxyConfigurationzRepresents a proxy configuration dictionary. 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}||_dSr!)_proxies)selfproxiesr#r#r$__init__^szProxyConfiguration.__init__cCs(t|}|j|j}|r$||}|S)z7Retrirves the corresponding proxy url for a given url. )rr4getscheme_fix_proxy_url)r5url parsed_urlproxyr#r#r$ proxy_url_forcs  z ProxyConfiguration.proxy_url_forcCs2i}||\}}|r.|r.|||}||d<|S)zARetrirves the corresponding proxy headers for a given proxy url. zProxy-Authorization)_get_auth_from_url_construct_basic_auth)r5 proxy_urlheadersusernamepassword basic_authr#r#r$proxy_headers_forks  z$ProxyConfiguration.proxy_headers_forcCs6|ds|dr|S|dr*d|Sd|SdS)Nhttp:zhttps:z//zhttp://) startswith)r5rAr#r#r$r:ts  z!ProxyConfiguration._fix_proxy_urlcCs,d||}t|d}d|S)Nz{0}:{1}asciiz Basic {0})formatrencodestripdecode)r5rCrDauth_strZ encoded_strr#r#r$r@|s z(ProxyConfiguration._construct_basic_authc Cs>t|}zt|jt|jfWSttfk r8YdSXdS)N)NN)rrrCrDAttributeError TypeError)r5r;r<r#r#r$r?s z%ProxyConfiguration._get_auth_from_url)N) __name__ __module__ __qualname____doc__r7r>rFr:r@r?r#r#r#r$r3Ws  r3c@speZdZdZdddeddfddZddZdd Zd d Zd d Z ddZ dddZ ddZ ddZ ddZdS)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|_|dkr2t}t |t t fsTt |d|dd}d|_ d|_t |trr||_ nt |tr|\|_ |_||_||_||_|dkrg|_i|_tf||_|j|j_dS)N)r6)httphttpsr)connectread)_verifyr3 _proxy_configbotocore awsrequestZAWSHTTPConnectionPoolZAWSHTTPSConnectionPool_pool_classes_by_schemeDEFAULT_TIMEOUT isinstanceintfloatr _cert_file _key_filestrtuple_timeout_max_pool_connections_socket_options_proxy_managersr_get_pool_manager_kwargs_managerpool_classes_by_scheme)r5r%r6timeoutZmax_pool_connectionssocket_options client_certr#r#r$r7s.    zURLLib3Session.__init__cKs2d|j|j||j|j|jd}|jf||S)NT)strictromaxsize ssl_contextrp cert_filekey_file)rhri_get_ssl_contextrjrdreupdate)r5 extra_kwargsZpool_manager_kwargsr#r#r$rls z'URLLib3Session._get_pool_manager_kwargscCstSr!)r2)r5r#r#r$rwszURLLib3Session._get_ssl_contextcCsJ||jkr@|j|}|j|d}t|f|}|j|_||j|<|j|S)N) proxy_headers)rkr\rFrlrr_rn)r5rArzZproxy_manager_kwargs proxy_managerr#r#r$_get_proxy_managers    z!URLLib3Session._get_proxy_managercCs.t|}|j}|sd}|jr*|d|j}|S)N/?)rpathquery)r5r;r<rr#r#r$ _path_urlszURLLib3Session._path_urlcCs4|dr$|r$d|_t||_n d|_d|_dS)NrWr) CERT_NONE)lowerrHr/r&ca_certs)r5connr;r%r#r#r$_setup_ssl_certs  zURLLib3Session._setup_ssl_certcCs|r||}n|j}|Sr!)r|rm)r5r;rAmanagerr#r#r$_get_connection_managers z&URLLib3Session._get_connection_managercCs |r|dr|S||SdS)NrG)rHr)r5r;rAr#r#r$_get_request_targetsz"URLLib3Session._get_request_targetcCs|dddkS)NzTransfer-Encodingchunked)r8)r5rBr#r#r$_chunkedszURLLib3Session._chunkedc Csz|j|j}||j|}||j}|||j|j||j|}|j|j ||j |j t dddd| |j d }tj|j|j|j |}|js|j|WStk r}zt|j|dW5d}~XYn8ttjfk r }zt|j|dW5d}~XYntk r8}zt||dW5d}~XYntk rh}zt|j|dW5d}~XYntk r}zt|j|dW5d}~XYnrt k r}zt!|||jdW5d}~XYn@t"k r}z d} t#j$| ddt%|d W5d}~XYnXdS) NF) methodr;bodyrBretriesassert_same_hostpreload_contentdecode_contentr) endpoint_urlerror)rAr)rrequestrz4Exception received when sending urllib3 HTTP requestT)exc_info)r)&r\r>r;rconnection_from_urlrr[rurlopenrrrBrrr]r^Z AWSResponsestatusZ stream_outputcontentURLLib3SSLErrorr rsocketgaierrorrrrURLLib3ConnectTimeoutErrorrURLLib3ReadTimeoutErrorrrr Exceptionloggerdebugr) r5rrArrZrequest_targetZurllib_response http_responseemessager#r#r$sends\     zURLLib3Session.send)N)rQrRrSrTMAX_POOL_CONNECTIONSr7rlrwr|rrrrrrr#r#r#r$rUs"  #     rU)NNNN)@os.pathosloggingrbase64rurllib3rrrrZurllib3.util.retryrZurllib3.util.ssl_rr r r r Zurllib3.exceptionsr rrrrrrrrZurllib3.contrib.pyopensslrr ImportErrorZbotocore.awsrequestr]Zbotocore.vendoredrZ(botocore.vendored.six.moves.urllib_parserZbotocore.compatrrZbotocore.exceptionsrrrr getLoggerrQrr`rrjoindirname__file__r"certifir r&r2objectr3rUr#r#r#r$sF       $  %2