B \,@sddlZddlZddlZddlmZddlmZmZm Z m Z ddl m Z m Z mZmZmZddlmZddlmZddlmZddlmZmZmZydd lmZWn ek rdd l mZYnXddlZ dd l!m"Z"dd l#m$Z$dd l%m&Z&m'Z'ddl(m)Z)m*Z*m+Z+mZm,Z,mZmZe&e-e.Z/dZ0dZ1ej23ej24e5dZ6yddl7m8Z8Wnek rrddZ8YnXddZ9dddZ:Gddde;Z{s z(ProxyConfiguration._construct_basic_authc Cs:t|}yt|jt|jfSttfk r4dSXdS)N)NN)rrrArBAttributeError TypeError)r3r9r:r r r!r=s z%ProxyConfiguration._get_auth_from_url)N) __name__ __module__ __qualname____doc__r5r<rDr8r>r=r r r r!r1Vs  r1c@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)r4)httphttpsr)connectread)_verifyr1 _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)r3r"r4timeoutZmax_pool_connectionssocket_options client_certr r r!r5s,    zURLLib3Session.__init__cKs2d|j|j||j|j|jd}|jf||S)NT)strictrlmaxsize ssl_contextrm cert_filekey_file)rerf_get_ssl_contextrgrarbupdate)r3 extra_kwargsZpool_manager_kwargsr r r!ris  z'URLLib3Session._get_pool_manager_kwargscCstS)N)r0)r3r r r!rtszURLLib3Session._get_ssl_contextcCsJ||jkr@|j|}|j|d}t|f|}|j|_||j|<|j|S)N) proxy_headers)rhrYrDrirr\rk)r3r?rwZproxy_manager_kwargs proxy_managerr r r!_get_proxy_managers    z!URLLib3Session._get_proxy_managercCs.t|}|j}|sd}|jr*|d|j}|S)N/?)rpathquery)r3r9r:r|r r r! _path_urlszURLLib3Session._path_urlcCs4|dr$|r$d|_t||_n d|_d|_dS)NrTr' CERT_NONE)lowerrEr-r#ca_certs)r3connr9r"r r r!_setup_ssl_certs  zURLLib3Session._setup_ssl_certcCs|r||}n|j}|S)N)ryrj)r3r9r?managerr r r!_get_connection_managers z&URLLib3Session._get_connection_managercCs |r|dr|S||SdS)Nzhttp:)rEr~)r3r9r?r r r!_get_request_targetsz"URLLib3Session._get_request_targetcCs|dddkS)NzTransfer-Encodingchunked)r6)r3r@r r r!_chunkedszURLLib3Session._chunkedc Csy|j|j}||j|}||j}|||j|j||j|}|j|j ||j |j dddd| |j d }t j|j|j|j |}|js|j|Stk r}zt|j|dWdd}~XYn8ttjfk r}zt|j|dWdd}~XYntk r2}zt||dWdd}~XYntk rb}zt|j|dWdd}~XYntk r}zt|j|dWdd}~XYnrtk r}zt |||jdWdd}~XYn@t!k r}z d} t"j#| ddt$|d Wdd}~XYnXdS) NF) methodr9bodyr@retriesassert_same_hostpreload_contentdecode_contentr) endpoint_urlerror)r?r)rrequestrz4Exception received when sending urllib3 HTTP requestT)exc_info)r)%rYr<r9rconnection_from_urlrrXrurlopenrrr@rrZr[Z AWSResponsestatusZ stream_outputcontentURLLib3SSLErrorr rsocketgaierrorrrrURLLib3ConnectTimeoutErrorrURLLib3ReadTimeoutErrorr rr Exceptionloggerdebugr) r3rr?rrZrequest_targetZurllib_response http_responseemessager r r!sendsV   zURLLib3Session.send)N)rNrOrPrQMAX_POOL_CONNECTIONSr5rirtryr~rrrrrr r r r!rRs        rR)NNNN)>os.pathosloggingrbase64rurllib3rrrrZurllib3.util.ssl_rrr r r Zurllib3.exceptionsr rr rrrrrrZurllib3.contrib.pyopensslrr ImportErrorZbotocore.awsrequestrZZbotocore.vendoredrZ(botocore.vendored.six.moves.urllib_parserZbotocore.compatrrZbotocore.exceptionsrrrr getLoggerrNrr]rr|joindirname__file__rcertifirr#r0objectr1rRr r r r!s@      $  $2