1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
U
 ý°dU#ã@s–ddlmZddlZddlZddlZddlZddlmZejrZddl    m
Z
ddl m Z m Z ejdd    d
ZejeefZe d ¡Zd ZGd d    „d    ƒZdS)é)Ú annotationsNé)ÚProxySchemeUnsupported)ÚLiteralé)Ú_TYPE_PEER_CERT_RETÚ_TYPE_PEER_CERT_RET_DICTÚ_SelfTÚ SSLTransport)ÚboundÚ _ReturnValuei@c    @sBeZdZdZedddœdd„ƒZdnd    dd
d dd œd d„Zdddœdd„Zdddœdd„Zddœdd„Z    doddddœdd „Z
dpdddd"œd#d$„Z dqd%d&dd'd(œd)d*„Z drd+ddd,œd-d.„Z dsd+ddd,œd/d0„Zdtdddd1œd2d&d
d
d
d3d4œd5d6„Zddœd7d8„Zddœd9d:„Zejdud<d=d>œd?d@„ƒZejdAdBd>œdCd@„ƒZdvd dEd>œdFd@„Zd
dœdGdH„ZdIdœdJdK„Zd
dœdLdM„Zd
dœdNdO„ZdPdœdQdR„Zd
dœdSdT„ZdUddVœdWdX„ZdUdœdYdZ„Zddœd[d\„Zdwdd]ddœd^d_„Zejd`ddaœdbdc„ƒZejddd+ddeœdfdc„ƒZejdgdd]d+dhœdidc„ƒZdxdjdkd]dldhœdmdc„ZdS)yr
aL
    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.SSLContextÚNone)Ú ssl_contextÚreturncCst|dƒstdƒ‚dS)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©rúPd:\z\workplace\vscode\pyvenv\venv\Lib\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 | NoneÚbool)ÚsocketrÚserver_hostnameÚsuppress_ragged_eofsrcCsHt ¡|_t ¡|_||_||_|j|j|j|d|_| |jj    ¡dS)zV
        Create an SSLTransport around socket using the provided ssl_context.
        )rN)
ÚsslÚ    MemoryBIOÚincomingÚoutgoingrrrÚsslobjÚ _ssl_io_loopÚ do_handshake)ÚselfrrrrrrrÚ__init__2s
 
 
ÿzSSLTransport.__init__r    )r rcCs|S©Nr©r rrrÚ    __enter__IszSSLTransport.__enter__z
typing.Any)Ú_rcGs | ¡dSr")Úclose)r r%rrrÚ__exit__LszSSLTransport.__exit__Úint)rcCs
|j ¡Sr")rÚfilenor#rrrr)OszSSLTransport.filenoéztyping.Any | Nonez int | bytes)ÚlenÚbufferrcCs | ||¡Sr")Ú_wrap_ssl_read)r r+r,rrrÚreadRszSSLTransport.readr)ÚbuflenÚflagsrcCs|dkrtdƒ‚| |¡S)Nrz+non-zero flags not allowed in calls to recv)Ú
ValueErrorr-)r r/r0rrrÚrecvUszSSLTransport.recvÚ _WriteBufferz
int | NonezNone | int | bytes)r,Únbytesr0rcCs,|dkrtdƒ‚|dkr t|ƒ}| ||¡S)Nrz0non-zero flags not allowed in calls to recv_into)r1r+r.)r r,r4r0rrrÚ    recv_intoZs
zSSLTransport.recv_intoÚbytes)Údatar0rc
Csn|dkrtdƒ‚d}t|ƒH}| d¡2}t|ƒ}||krV| ||d…¡}||7}q2W5QRXW5QRXdS)Nrz.non-zero flags not allowed in calls to sendallÚB)r1Ú
memoryviewÚcastr+Úsend)r r7r0ÚcountÚviewÚ    byte_viewÚamountÚvrrrÚsendallfszSSLTransport.sendallcCs |dkrtdƒ‚| |jj|¡S)Nrz+non-zero flags not allowed in calls to send)r1rrÚwrite)r r7r0rrrr;pszSSLTransport.send)ÚencodingÚerrorsÚnewlineÚstrz1typing.BinaryIO | typing.TextIO | socket.SocketIO)ÚmodeÚ    bufferingrCrDrErc Cst|ƒdddhks"td|›dƒ‚d|k}d|kp6| }|sD|sDt‚d|k}d}    |r\|    d7}    |rh|    d7}    t ||    ¡}
|jjd7_|dkrd    }|d
kržtj}|d
kr¶|s²td ƒ‚|
S|rÎ|rÎt |
|
|¡} n&|ràt     |
|¡} n|sèt‚t 
|
|¡} |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.
        ÚrÚwÚbz invalid mode z (only r, w, b allowed)ÚrNéÿÿÿÿrz!unbuffered streams must be binary) Úsetr1ÚAssertionErrorrÚSocketIOÚ_io_refsÚioÚDEFAULT_BUFFER_SIZEÚBufferedRWPairÚBufferedReaderÚBufferedWriterÚ TextIOWrapperrG) r rGrHrCrDrEÚwritingÚreadingÚbinaryÚrawmodeÚrawr,ÚtextrrrÚmakefileus@   zSSLTransport.makefilecCs| |jj¡dSr")rrÚunwrapr#rrrr_©szSSLTransport.unwrapcCs|j ¡dSr")rr&r#rrrr&¬szSSLTransport.close.zLiteral[False]z_TYPE_PEER_CERT_RET_DICT | None)Ú binary_formrcCsdSr"r©r r`rrrÚ getpeercert¯szSSLTransport.getpeercertz Literal[True]z bytes | NonecCsdSr"rrarrrrbµsFrcCs |j |¡Sr")rrbrarrrrb¹scCs
|j ¡Sr")rÚversionr#rrrrc¼szSSLTransport.versionztuple[str, str, int] | NonecCs
|j ¡Sr")rÚcipherr#rrrrd¿szSSLTransport.ciphercCs
|j ¡Sr")rÚselected_alpn_protocolr#rrrreÂsz#SSLTransport.selected_alpn_protocolcCs
|j ¡Sr")rÚselected_npn_protocolr#rrrrfÅsz"SSLTransport.selected_npn_protocolz!list[tuple[str, str, int]] | NonecCs
|j ¡Sr")rÚshared_ciphersr#rrrrgÈszSSLTransport.shared_cipherscCs
|j ¡Sr")rÚ compressionr#rrrrhËszSSLTransport.compressionz float | None)ÚvaluercCs|j |¡dSr")rÚ
settimeout)r rirrrrjÎszSSLTransport.settimeoutcCs
|j ¡Sr")rÚ
gettimeoutr#rrrrkÑszSSLTransport.gettimeoutcCs|j ¡dSr")rÚ_decref_socketiosr#rrrrlÔszSSLTransport._decref_socketioszbytearray | Nonec
Cs\z| |jj||¡WStjk
rV}z"|jtjkrD|jrDWY¢
dS‚W5d}~XYnXdS)Nr)rrr.rÚSSLErrorÚerrnoÚ SSL_ERROR_EOFr)r r+r,Úerrrr-×s 
zSSLTransport._wrap_ssl_readztyping.Callable[[], None])ÚfuncrcCsdSr"r)r rqrrrrászSSLTransport._ssl_io_loopztyping.Callable[[bytes], int])rqÚarg1rcCsdSr"r)r rqrrrrrræsz/typing.Callable[[int, bytearray | None], bytes])rqrrÚarg2rcCsdSr"r)r rqrrrsrrrrësz"typing.Callable[..., _ReturnValue]zNone | bytes | intr c    
Csîd}d}|râd}z8|dkr*|dkr*|ƒ}n|dkr<||ƒ}n
|||ƒ}Wn@tjk
rˆ}z |jtjtjfkrr|‚|j}W5d}~XYnX|j ¡}|j |¡|dkr®d}q|tjkr|j     t
¡}|rÖ|j   |¡q|j   ¡qt t|¡S)z>Performs an I/O loop between incoming/outgoing and the socket.TNF)rrmrnÚSSL_ERROR_WANT_READÚSSL_ERROR_WANT_WRITErr.rrAr2Ú SSL_BLOCKSIZErrBÚ    write_eofÚtypingr:r )    r rqrrrsZ should_loopÚretrnrpÚbufrrrrôs0
 
 
  )NT)r*N)r*r)Nr)r)r)N).)F)N)NN) Ú__name__Ú
__module__Ú __qualname__Ú__doc__Ú staticmethodrr!r$r'r)r.r2r5rAr;r^r_r&rxÚoverloadrbrcrdrerfrgrhrjrkrlr-rrrrrr
sb
ûü 
ýù4ÿ
 ü)Ú
__future__rrRrrrxÚ
exceptionsrÚ TYPE_CHECKINGZtyping_extensionsrÚssl_rrÚTypeVarr    ÚUnionÚ    bytearrayr9r3r rvr
rrrrÚ<module>s