Skip to content

Commit c1f4e9d

Browse files
committed
Allow to initialize SSL clients with an existing TcpStream
1 parent 11c2b1b commit c1f4e9d

File tree

1 file changed

+36
-4
lines changed

1 file changed

+36
-4
lines changed

src/raw_client.rs

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,9 +145,26 @@ pub type ElectrumSslStream = SslStream<TcpStream>;
145145
impl RawClient<ElectrumSslStream> {
146146
/// Creates a new SSL client and tries to connect to `socket_addr`. Optionally, if
147147
/// `validate_domain` is `true`, validate the server's certificate.
148-
pub fn new_ssl<A: ToSocketAddrsDomain>(
148+
pub fn new_ssl<A: ToSocketAddrsDomain + Clone>(
149149
socket_addr: A,
150150
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,
151168
) -> Result<Self, Error> {
152169
let mut builder =
153170
SslConnector::builder(SslMethod::tls()).map_err(Error::InvalidSslMethod)?;
@@ -160,7 +177,7 @@ impl RawClient<ElectrumSslStream> {
160177
let connector = builder.build();
161178

162179
let domain = socket_addr.domain().unwrap_or("NONE").to_string();
163-
let stream = TcpStream::connect(socket_addr)?;
180+
164181
let stream = connector
165182
.connect(&domain, stream)
166183
.map_err(Error::SslHandshakeError)?;
@@ -205,9 +222,25 @@ pub type ElectrumSslStream = StreamOwned<ClientSession, TcpStream>;
205222
impl RawClient<ElectrumSslStream> {
206223
/// Creates a new SSL client and tries to connect to `socket_addr`. Optionally, if
207224
/// `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>(
209241
socket_addr: A,
210242
validate_domain: bool,
243+
tcp_stream: TcpStream,
211244
) -> Result<Self, Error> {
212245
let mut config = ClientConfig::new();
213246
if validate_domain {
@@ -224,7 +257,6 @@ impl RawClient<ElectrumSslStream> {
224257
}
225258

226259
let domain = socket_addr.domain().unwrap_or("NONE").to_string();
227-
let tcp_stream = TcpStream::connect(socket_addr)?;
228260
let session = ClientSession::new(
229261
&std::sync::Arc::new(config),
230262
webpki::DNSNameRef::try_from_ascii_str(&domain)

0 commit comments

Comments
 (0)