@@ -145,9 +145,26 @@ pub type ElectrumSslStream = SslStream<TcpStream>;
145
145
impl RawClient < ElectrumSslStream > {
146
146
/// Creates a new SSL client and tries to connect to `socket_addr`. Optionally, if
147
147
/// `validate_domain` is `true`, validate the server's certificate.
148
- pub fn new_ssl < A : ToSocketAddrsDomain > (
148
+ pub fn new_ssl < A : ToSocketAddrsDomain + Clone > (
149
149
socket_addr : A ,
150
150
validate_domain : bool ,
151
+ ) -> Result < Self , Error > {
152
+ if validate_domain {
153
+ socket_addr. domain ( ) . ok_or ( Error :: MissingDomain ) ?;
154
+ }
155
+
156
+ Self :: new_ssl_from_stream (
157
+ socket_addr. clone ( ) ,
158
+ validate_domain,
159
+ TcpStream :: connect ( socket_addr) ?,
160
+ )
161
+ }
162
+
163
+ /// Create a new SSL client using an existing TcpStream
164
+ pub fn new_ssl_from_stream < A : ToSocketAddrsDomain > (
165
+ socket_addr : A ,
166
+ validate_domain : bool ,
167
+ stream : TcpStream ,
151
168
) -> Result < Self , Error > {
152
169
let mut builder =
153
170
SslConnector :: builder ( SslMethod :: tls ( ) ) . map_err ( Error :: InvalidSslMethod ) ?;
@@ -160,7 +177,7 @@ impl RawClient<ElectrumSslStream> {
160
177
let connector = builder. build ( ) ;
161
178
162
179
let domain = socket_addr. domain ( ) . unwrap_or ( "NONE" ) . to_string ( ) ;
163
- let stream = TcpStream :: connect ( socket_addr ) ? ;
180
+
164
181
let stream = connector
165
182
. connect ( & domain, stream)
166
183
. map_err ( Error :: SslHandshakeError ) ?;
@@ -205,9 +222,25 @@ pub type ElectrumSslStream = StreamOwned<ClientSession, TcpStream>;
205
222
impl RawClient < ElectrumSslStream > {
206
223
/// Creates a new SSL client and tries to connect to `socket_addr`. Optionally, if
207
224
/// `validate_domain` is `true`, validate the server's certificate.
208
- pub fn new_ssl < A : ToSocketAddrsDomain > (
225
+ pub fn new_ssl < A : ToSocketAddrsDomain + Clone > (
226
+ socket_addr : A ,
227
+ validate_domain : bool ,
228
+ ) -> Result < Self , Error > {
229
+ if validate_domain {
230
+ socket_addr. domain ( ) . ok_or ( Error :: MissingDomain ) ?;
231
+ }
232
+ Self :: new_ssl_from_stream (
233
+ socket_addr. clone ( ) ,
234
+ validate_domain,
235
+ TcpStream :: connect ( socket_addr) ?,
236
+ )
237
+ }
238
+
239
+ /// Create a new SSL client using an existing TcpStream
240
+ pub fn new_ssl_from_stream < A : ToSocketAddrsDomain > (
209
241
socket_addr : A ,
210
242
validate_domain : bool ,
243
+ tcp_stream : TcpStream ,
211
244
) -> Result < Self , Error > {
212
245
let mut config = ClientConfig :: new ( ) ;
213
246
if validate_domain {
@@ -224,7 +257,6 @@ impl RawClient<ElectrumSslStream> {
224
257
}
225
258
226
259
let domain = socket_addr. domain ( ) . unwrap_or ( "NONE" ) . to_string ( ) ;
227
- let tcp_stream = TcpStream :: connect ( socket_addr) ?;
228
260
let session = ClientSession :: new (
229
261
& std:: sync:: Arc :: new ( config) ,
230
262
webpki:: DNSNameRef :: try_from_ascii_str ( & domain)
0 commit comments