fix(client): keep the underlying connector when setting an SSL verifier
The client no longer drops the old `Connector` instance, along with its entire context (such as the settings and pooled connections in the case of a `Pool` connector); rather, it passes the SSL verifier on to the `Connector` so that it uses it for any future connections that it needs to establish. A regression test is included. Closes #495
This commit is contained in:
@@ -41,7 +41,7 @@ use url::ParseError as UrlError;
|
|||||||
use header::{Headers, Header, HeaderFormat};
|
use header::{Headers, Header, HeaderFormat};
|
||||||
use header::{ContentLength, Location};
|
use header::{ContentLength, Location};
|
||||||
use method::Method;
|
use method::Method;
|
||||||
use net::{NetworkConnector, NetworkStream, HttpConnector, ContextVerifier};
|
use net::{NetworkConnector, NetworkStream, ContextVerifier};
|
||||||
use status::StatusClass::Redirection;
|
use status::StatusClass::Redirection;
|
||||||
use {Url};
|
use {Url};
|
||||||
use Error;
|
use Error;
|
||||||
@@ -85,10 +85,7 @@ impl Client {
|
|||||||
|
|
||||||
/// Set the SSL verifier callback for use with OpenSSL.
|
/// Set the SSL verifier callback for use with OpenSSL.
|
||||||
pub fn set_ssl_verifier(&mut self, verifier: ContextVerifier) {
|
pub fn set_ssl_verifier(&mut self, verifier: ContextVerifier) {
|
||||||
self.connector = with_connector(Pool::with_connector(
|
self.connector.set_ssl_verifier(verifier);
|
||||||
Default::default(),
|
|
||||||
HttpConnector(Some(verifier))
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set the RedirectPolicy.
|
/// Set the RedirectPolicy.
|
||||||
@@ -409,6 +406,8 @@ mod tests {
|
|||||||
use header::Server;
|
use header::Server;
|
||||||
use super::{Client, RedirectPolicy};
|
use super::{Client, RedirectPolicy};
|
||||||
use url::Url;
|
use url::Url;
|
||||||
|
use mock::ChannelMockConnector;
|
||||||
|
use std::sync::mpsc::{self, TryRecvError};
|
||||||
|
|
||||||
mock_connector!(MockRedirectPolicy {
|
mock_connector!(MockRedirectPolicy {
|
||||||
"http://127.0.0.1" => "HTTP/1.1 301 Redirect\r\n\
|
"http://127.0.0.1" => "HTTP/1.1 301 Redirect\r\n\
|
||||||
@@ -455,4 +454,30 @@ mod tests {
|
|||||||
assert_eq!(res.headers.get(), Some(&Server("mock2".to_string())));
|
assert_eq!(res.headers.get(), Some(&Server("mock2".to_string())));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Tests that the `Client::set_ssl_verifier` method does not drop the
|
||||||
|
/// old connector, but rather delegates the change to the connector itself.
|
||||||
|
#[test]
|
||||||
|
fn test_client_set_ssl_verifer() {
|
||||||
|
let (tx, rx) = mpsc::channel();
|
||||||
|
let mut client = Client::with_connector(ChannelMockConnector::new(tx));
|
||||||
|
|
||||||
|
client.set_ssl_verifier(Box::new(|_| {}));
|
||||||
|
|
||||||
|
// Make sure that the client called the `set_ssl_verifier` method
|
||||||
|
match rx.try_recv() {
|
||||||
|
Ok(meth) => {
|
||||||
|
assert_eq!(meth, "set_ssl_verifier");
|
||||||
|
},
|
||||||
|
_ => panic!("Expected a call to `set_ssl_verifier`"),
|
||||||
|
};
|
||||||
|
// Now make sure that no other method was called, as well as that
|
||||||
|
// the connector is still alive (i.e. wasn't dropped by the client).
|
||||||
|
match rx.try_recv() {
|
||||||
|
Err(TryRecvError::Empty) => {},
|
||||||
|
Err(TryRecvError::Disconnected) => {
|
||||||
|
panic!("Expected the connector to still be alive.");
|
||||||
|
},
|
||||||
|
Ok(_) => panic!("Did not expect any more method calls."),
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user