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