U f"@sddlmZddlZddlZddlZddlZddlmZejrZddl m Z ddl m Z m Z ejeefZedZd ZGd d d ZdS) ) annotationsN)ProxySchemeUnsupported)Self)_TYPE_PEER_CERT_RET_TYPE_PEER_CERT_RET_DICT _ReturnValuei@c @s2eZdZdZedddddZdkd dd d dd d dZddddZdddddZddddZ dlddddddZ dmdddd!d"d#Z dnd$d%dd&d'd(d)Z dod*ddd+d,d-Z dpd*ddd+d.d/Zdqdddd0d1d%d d d d2d3d4d5Zddd6d7Zddd8d9Zejdrd;dd?Zejd@dAd=dBd?Zdsd dDd=dEd?Zd ddFdGZdHddIdJZd ddKdLZdMddNdOZd ddPdQZdRddSdTdUZdRddVdWZdddXdYZdtddZddd[d\Zejd]dd^d_d`Zejdad*ddbdcd`ZejddddZd*dedfd`ZdudgdhdZdidedjd`ZdS)v SSLTransportaL The SSLTransport wraps an existing socket and establishes an SSL connection. Contrary to Python's implementation of SSLSocket, it allows you to chain multiple TLS connections together. It's particularly useful if you need to implement TLS within TLS. The class supports most of the socket API operations. zssl.SSLContextNone) ssl_contextreturncCst|dstddS)z Raises a ProxySchemeUnsupported if the provided ssl_context can't be used for TLS in TLS. The only requirement is that the ssl_context provides the 'wrap_bio' methods. wrap_biozXTLS in TLS requires SSLContext.wrap_bio() which isn't available on non-native SSLContextN)hasattrr)r rJ/opt/alt/python38/lib/python3.8/site-packages/urllib3/util/ssltransport.py$_validate_ssl_context_for_tls_in_tls!s z1SSLTransport._validate_ssl_context_for_tls_in_tlsNTz socket.socketz str | Nonebool)socketr server_hostnamesuppress_ragged_eofsr cCsHt|_t|_||_||_|j|j|j|d|_||jj dS)zV Create an SSLTransport around socket using the provided ssl_context. )rN) ssl MemoryBIOincomingoutgoingrrrsslobj _ssl_io_loop do_handshake)selfrr rrrrr__init__1s  zSSLTransport.__init__r)r cCs|SNrrrrr __enter__HszSSLTransport.__enter__z typing.Any)_r cGs |dSr )close)rr#rrr__exit__KszSSLTransport.__exit__intcCs |jSr )rfilenor!rrrr'NszSSLTransport.filenoztyping.Any | Nonez int | bytes)lenbufferr cCs |||Sr )_wrap_ssl_read)rr)r*rrrreadQszSSLTransport.readr)buflenflagsr cCs|dkrtd||S)Nrz+non-zero flags not allowed in calls to recv) ValueErrorr+)rr-r.rrrrecvTszSSLTransport.recv _WriteBufferz int | NonezNone | int | bytes)r*nbytesr.r cCs,|dkrtd|dkr t|}|||S)Nrz0non-zero flags not allowed in calls to recv_into)r/r)r,)rr*r2r.rrr recv_intoYs zSSLTransport.recv_intobytes)datar.r c Csn|dkrtdd}t|H}|d2}t|}||krV|||d}||7}q2W5QRXW5QRXdS)Nrz.non-zero flags not allowed in calls to sendallB)r/ memoryviewcastr)send)rr5r.countview byte_viewamountvrrrsendalleszSSLTransport.sendallcCs |dkrtd||jj|S)Nrz+non-zero flags not allowed in calls to send)r/rrwrite)rr5r.rrrr9oszSSLTransport.send)encodingerrorsnewlinestrz1typing.BinaryIO | typing.TextIO | socket.SocketIO)mode bufferingrArBrCr c Cst|dddhks"td|dd|k}d|kp6| }|sD|sDtd|k}d} |r\| d7} |rh| d7} t|| } |jjd7_|dkrd }|d krtj}|d kr|std | S|r|rt| | |} n&|rt | |} n|stt | |} |r| St | |||} || _ | S) a Python's httpclient uses makefile and buffered io when reading HTTP messages and we need to support it. This is unfortunately a copy and paste of socket.py makefile with small changes to point to the socket directly. rwbz invalid mode z (only r, w, b allowed)rNrz!unbuffered streams must be binary) setr/AssertionErrorrSocketIO_io_refsioDEFAULT_BUFFER_SIZEBufferedRWPairBufferedReaderBufferedWriter TextIOWrapperrE) rrErFrArBrCwritingreadingbinaryrawmoderawr*textrrrmakefilets@   zSSLTransport.makefilecCs||jjdSr )rrunwrapr!rrrr]szSSLTransport.unwrapcCs|jdSr )rr$r!rrrr$szSSLTransport.close.ztyping.Literal[False]z_TYPE_PEER_CERT_RET_DICT | None) binary_formr cCsdSr rrr^rrr getpeercertszSSLTransport.getpeercertztyping.Literal[True]z bytes | NonecCsdSr rr_rrrr`sFrcCs |j|Sr )rr`r_rrrr`scCs |jSr )rversionr!rrrraszSSLTransport.versionztuple[str, str, int] | NonecCs |jSr )rcipherr!rrrrbszSSLTransport.ciphercCs |jSr )rselected_alpn_protocolr!rrrrcsz#SSLTransport.selected_alpn_protocolz!list[tuple[str, str, int]] | NonecCs |jSr )rshared_ciphersr!rrrrdszSSLTransport.shared_cipherscCs |jSr )r compressionr!rrrreszSSLTransport.compressionz float | None)valuer cCs|j|dSr )r settimeout)rrfrrrrgszSSLTransport.settimeoutcCs |jSr )r gettimeoutr!rrrrhszSSLTransport.gettimeoutcCs|jdSr )r_decref_socketiosr!rrrriszSSLTransport._decref_socketioszbytearray | Nonec Cs\z||jj||WStjk rV}z"|jtjkrD|jrDWY dSW5d}~XYnXdS)Nr)rrr,rSSLErrorerrno SSL_ERROR_EOFr)rr)r*errrr+s  zSSLTransport._wrap_ssl_readztyping.Callable[[], None])funcr cCsdSr r)rrnrrrrszSSLTransport._ssl_io_loopztyping.Callable[[bytes], int])rnarg1r cCsdSr r)rrnrorrrrsz/typing.Callable[[int, bytearray | None], bytes])rnroarg2r cCsdSr r)rrnrorprrrrsz"typing.Callable[..., _ReturnValue]zNone | bytes | intr c Csd}d}|rd}z8|dkr*|dkr*|}n|dkr<||}n |||}Wn@tjk r}z |jtjtjfkrr||j}W5d}~XYnX|j}|j||dkrd}q|tjkr|j t }|r|j |q|j qtt|S)z>Performs an I/O loop between incoming/outgoing and the socket.TNF)rrjrkSSL_ERROR_WANT_READSSL_ERROR_WANT_WRITErr,rr?r0 SSL_BLOCKSIZErr@ write_eoftypingr8r ) rrnrorp should_loopretrkrmbufrrrrs0      )NT)r(N)r(r)Nr)r)r)N).)F)N)NN)__name__ __module__ __qualname____doc__ staticmethodrrr"r%r'r,r0r3r?r9r\r]r$ruoverloadr`rarbrcrdrergrhrir+rrrrrr s`   4  r ) __future__rrPrrru exceptionsr TYPE_CHECKINGZtyping_extensionsrssl_rrUnion bytearrayr7r1TypeVarr rsr rrrrs