o gI @sddlmZddlZddlZddlZddlZddlZddlZddlmZ ddlm Z ddl Z ddl mZddl mZddlmZz ddlZejZWneefy^dZGd d d eZYnwzeZWneytGd d d eZYnwzeZWneyGd ddeZYnwddlmZddlm Z ddl!m"Z"m#Z#m$Z$m%Z%ddl&m'Z'm(Z(ddl)m*Z*m+Z+m,Z,ddl-m.Z.m/Z/m0Z0m1Z1m2Z2e3e4Z5dddZ6e7dddZ8e9dZ:Gdddee;ZGdddeZGd#d$d$e;Z?ese?Zt|}|rtd||ftj|||g|Ri|S) zAMethod cannot contain non-token characters %r (found at least %r))_CONTAINS_CONTROL_CHAR_REsearch ValueErrorgroupr3 putrequest)r5methodurlr6kwargsmatchrrrrUs  zHTTPConnection.putrequestcGs`tdd|Dstj||g|RdSt|tvr.tddt t j t tfdS)rPcss"|] }t|to |tkVqdSrN) isinstancestrr).0vrrr s z+HTTPConnection.putheader..z+urllib3.util.SKIP_HEADER only supports '%s'z', 'N) anyr3 putheaderr. ensure_strlowerrrSjoinmapr[titlesorted)r5headervaluesrrrr`szHTTPConnection.putheaderNcsN|duri}n|}ddd|Dvrt|d<tt|j||||ddS)N user-agentcss|] }t|VqdSrNr.rarbr\krrrr^sz)HTTPConnection.request.. User-Agent)bodyheaders)copy_get_default_user_agentsuperrrequest)r5rVrWrnro __class__rrrss  zHTTPConnection.requestcCs$|pi}tdd|D}d|v}d|v}|j||||dd|vr)|dt|D] \}} ||| q-d|vrB|d d ||d urtjtf} t || rX|f}|D]0} | s_qZt | tsi| d } t t | d d } t | } | d7} | | 7} | d7} || qZ|dd S)z Alternative to the common request method, which sends the body with chunked encoding and not as one block cSsg|] }t|qSrrjrkrrr sz2HTTPConnection.request_chunked..zaccept-encodingr<)skip_accept_encoding skip_hostrirmztransfer-encodingzTransfer-EncodingchunkedNutf8s s0 )setrUr`rqitems endheadersr. string_typesbytesrZencodehexlen bytearraysend)r5rVrWrnro header_keysrwrxrgr=stringish_typeschunklen_strto_sendrrrrequest_chunkeds<       zHTTPConnection.request_chunked)NN)r r r__doc__port_by_scheme default_portsocket IPPROTO_TCP TCP_NODELAYr2 is_verifiedr4propertyr<setterrErHrMrOrUr`rsr __classcell__rrrtrrKs$      rc@s|eZdZdZedZdZdZdZdZ dZ dZ dZ ddddde jddfddZ         d ddZd d Zd d ZdS)HTTPSConnectionz Many of the parameters to this constructor are passed to the underlying SSL socket by means of :py:func:`urllib3.util.ssl_wrap_socket`. r'NFc KsDtj|||f||d| ||_||_||_||_| |_d|_dS)N)r)rr')rr4key_file cert_file key_password ssl_contextserver_hostname _protocol) r5r<r?rrrr)rrrr7rrrr4$s zHTTPSConnection.__init__c Csv|dur|jdur|jj}ntd}||_||_||_||_||_||_|o+t j ||_ |o4t j ||_ | |_dS)zX This method should only be called once, before the connection is used. N)r verify_moder"rr cert_reqsrassert_hostnamer ospath expanduserca_certs ca_cert_dir ca_cert_data) r5rrrrrrr rrrrrset_cert>s   zHTTPSConnection.set_certc Cs|}|j}d}|r%|jr|||}d}||_|d|_|j}|}|j dur/|j }t j t k}|rAtdt td}|jdurWd}tt|jt|jd|_|j}t|j|_|jst|jst|jst|rtt|drt|t||j|j |j!|j|j|j|||d |_|r|jdurt|jdr|j"d vrtd |j|j"ft#|j$rt$|jj%dd |j$n-|jt&j'krt(|d ds|j)dur|j%}|*d dstd|t+t,||j)p||jt&j-kp|j$du|_.dS)NFTrzWSystem time is way off (before {0}). This will probably lead to SSL verification errors) ssl_versionrload_default_certs) rIkeyfilecertfilerrrrrr tls_in_tlsversion>TLSv1.1TLSv1zNegotiating TLSv1/TLSv1.1 by default is deprecated and will be disabled in urllib3 v2.0.0. Connecting to '%s' with '%s' can be enabled by explicitly opting-in with 'ssl_version') binary_formcheck_hostnamesubjectAltNamerzCertificate for {0} has no `subjectAltName`, falling back to check for a `commonName` for now. This feature is being removed by major browsers and deprecated by RFC 2818. (See https://github.com/urllib3/urllib3/issues/497 for details.))/rEr<rHtls_in_tls_required_connect_tls_proxyrIrJrKrFrdatetimedatetoday RECENT_DATEwarningswarnformatrrr!r#rr"rrrrrhasattrrr$rrrrDeprecationWarningr getpeercertssl CERT_NONErGrr1r_match_hostname CERT_REQUIREDr) r5rChostnamerr is_time_offdefault_ssl_contextcontextcertrrrrO_s            zHTTPSConnection.connectcCsX|j}|j}|rt|||dSt|j|j|j|j|j}d|_ t||j|j|j||dS)zY Establish a TLS connection to the proxy using the provided SSL context. )rIrrT)rIrrrrr) r-rr$rrrrrrr)r5rrCr-rrrrrs0 z"HTTPSConnection._connect_tls_proxy) NNNNNNNNN)r r rrrrrrrrrr rr_GLOBAL_DEFAULT_TIMEOUTr4rrOrrrrrrs>  ! xrc Cs@zt||WdSty}z td||||_d}~ww)Nz@Certificate did not match expected hostname: %s. Certificate: %s)rrlogwarning _peer_cert)rasserted_hostnamerDrrrrsrcCsdtS)Nzpython-urllib3/%srrrrrrq srqc@seZdZdZdS)DummyConnectionz-Used to detect a failed ConnectionCls import.N)r r rrrrrrrsr)A __future__rrloggingrrerrrrArr@r.six.moves.http_clientrr3r util.proxyrrSSLErrorr ImportErrorAttributeError BaseExceptionr NameError Exceptionr _collectionsr_versionr exceptionsrrrrpackages.ssl_match_hostnamerrutilrrr util.ssl_r r!r"r#r$ getLoggerr rrrrcompilerQobjectrrrqrVerifiedHTTPSConnectionrrrrsd              Jk