feat(net): Allow more generic SSL verification (fixes #244)
This commit is contained in:
@@ -25,12 +25,10 @@ use std::iter::Extend;
|
|||||||
use url::UrlParser;
|
use url::UrlParser;
|
||||||
use url::ParseError as UrlError;
|
use url::ParseError as UrlError;
|
||||||
|
|
||||||
use openssl::ssl::VerifyCallback;
|
|
||||||
|
|
||||||
use header::{Headers, Header, HeaderFormat};
|
use header::{Headers, Header, HeaderFormat};
|
||||||
use header::common::{ContentLength, Location};
|
use header::common::{ContentLength, Location};
|
||||||
use method::Method;
|
use method::Method;
|
||||||
use net::{NetworkConnector, HttpConnector};
|
use net::{NetworkConnector, HttpConnector, ContextVerifier};
|
||||||
use status::StatusClass::Redirection;
|
use status::StatusClass::Redirection;
|
||||||
use {Url, Port, HttpResult};
|
use {Url, Port, HttpResult};
|
||||||
use HttpError::HttpUriError;
|
use HttpError::HttpUriError;
|
||||||
@@ -57,7 +55,7 @@ impl Client<HttpConnector> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// 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: VerifyCallback) {
|
pub fn set_ssl_verifier(&mut self, verifier: ContextVerifier) {
|
||||||
self.connector = HttpConnector(Some(verifier));
|
self.connector = HttpConnector(Some(verifier));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
13
src/net.rs
13
src/net.rs
@@ -11,8 +11,8 @@ use std::raw::{self, TraitObject};
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use uany::UnsafeAnyExt;
|
use uany::UnsafeAnyExt;
|
||||||
use openssl::ssl::{Ssl, SslStream, SslContext, VerifyCallback};
|
use openssl::ssl::{Ssl, SslStream, SslContext};
|
||||||
use openssl::ssl::SslVerifyMode::{SslVerifyPeer, SslVerifyNone};
|
use openssl::ssl::SslVerifyMode::SslVerifyNone;
|
||||||
use openssl::ssl::SslMethod::Sslv23;
|
use openssl::ssl::SslMethod::Sslv23;
|
||||||
use openssl::ssl::error::{SslError, StreamError, OpenSslErrors, SslSessionClosed};
|
use openssl::ssl::error::{SslError, StreamError, OpenSslErrors, SslSessionClosed};
|
||||||
use openssl::x509::X509FileType;
|
use openssl::x509::X509FileType;
|
||||||
@@ -309,7 +309,10 @@ impl NetworkStream for HttpStream {
|
|||||||
|
|
||||||
/// A connector that will produce HttpStreams.
|
/// A connector that will produce HttpStreams.
|
||||||
#[allow(missing_copy_implementations)]
|
#[allow(missing_copy_implementations)]
|
||||||
pub struct HttpConnector(pub Option<VerifyCallback>);
|
pub struct HttpConnector(pub Option<ContextVerifier>);
|
||||||
|
|
||||||
|
/// A method that can set verification methods on an SSL context
|
||||||
|
pub type ContextVerifier = for <'a> fn(&'a mut SslContext) -> ();
|
||||||
|
|
||||||
impl NetworkConnector for HttpConnector {
|
impl NetworkConnector for HttpConnector {
|
||||||
type Stream = HttpStream;
|
type Stream = HttpStream;
|
||||||
@@ -325,7 +328,9 @@ impl NetworkConnector for HttpConnector {
|
|||||||
debug!("https scheme");
|
debug!("https scheme");
|
||||||
let stream = try!(TcpStream::connect(addr));
|
let stream = try!(TcpStream::connect(addr));
|
||||||
let mut context = try!(SslContext::new(Sslv23).map_err(lift_ssl_error));
|
let mut context = try!(SslContext::new(Sslv23).map_err(lift_ssl_error));
|
||||||
self.0.as_ref().map(|cb| context.set_verify(SslVerifyPeer, Some(*cb)));
|
if let Some(ref v) = self.0 {
|
||||||
|
v(&mut context);
|
||||||
|
}
|
||||||
let ssl = try!(Ssl::new(&context).map_err(lift_ssl_error));
|
let ssl = try!(Ssl::new(&context).map_err(lift_ssl_error));
|
||||||
try!(ssl.set_hostname(host).map_err(lift_ssl_error));
|
try!(ssl.set_hostname(host).map_err(lift_ssl_error));
|
||||||
let stream = try!(SslStream::new(&context, stream).map_err(lift_ssl_error));
|
let stream = try!(SslStream::new(&context, stream).map_err(lift_ssl_error));
|
||||||
|
|||||||
Reference in New Issue
Block a user