Skip to content

Commit a0bf2a4

Browse files
committed
Merge pull request #249 from Manishearth/sslcontext
Allow more generic SSL verification (fixes #244)
2 parents 8f66de4 + bca9a53 commit a0bf2a4

File tree

2 files changed

+14
-11
lines changed

2 files changed

+14
-11
lines changed

src/client/mod.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,10 @@ use std::iter::Extend;
2525
use url::UrlParser;
2626
use url::ParseError as UrlError;
2727

28-
use openssl::ssl::VerifyCallback;
29-
3028
use header::{Headers, Header, HeaderFormat};
3129
use header::common::{ContentLength, Location};
3230
use method::Method;
33-
use net::{NetworkConnector, HttpConnector};
31+
use net::{NetworkConnector, HttpConnector, ContextVerifier};
3432
use status::StatusClass::Redirection;
3533
use {Url, Port, HttpResult};
3634
use HttpError::HttpUriError;
@@ -49,15 +47,15 @@ pub struct Client<C> {
4947
redirect_policy: RedirectPolicy,
5048
}
5149

52-
impl Client<HttpConnector> {
50+
impl<'v> Client<HttpConnector<'v>> {
5351

5452
/// Create a new Client.
55-
pub fn new() -> Client<HttpConnector> {
53+
pub fn new() -> Client<HttpConnector<'v>> {
5654
Client::with_connector(HttpConnector(None))
5755
}
5856

5957
/// Set the SSL verifier callback for use with OpenSSL.
60-
pub fn set_ssl_verifier(&mut self, verifier: VerifyCallback) {
58+
pub fn set_ssl_verifier(&mut self, verifier: ContextVerifier<'v>) {
6159
self.connector = HttpConnector(Some(verifier));
6260
}
6361

src/net.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ use std::raw::{self, TraitObject};
1111
use std::sync::Arc;
1212

1313
use uany::UnsafeAnyExt;
14-
use openssl::ssl::{Ssl, SslStream, SslContext, VerifyCallback};
15-
use openssl::ssl::SslVerifyMode::{SslVerifyPeer, SslVerifyNone};
14+
use openssl::ssl::{Ssl, SslStream, SslContext};
15+
use openssl::ssl::SslVerifyMode::SslVerifyNone;
1616
use openssl::ssl::SslMethod::Sslv23;
1717
use openssl::ssl::error::{SslError, StreamError, OpenSslErrors, SslSessionClosed};
1818
use openssl::x509::X509FileType;
@@ -309,9 +309,12 @@ impl NetworkStream for HttpStream {
309309

310310
/// A connector that will produce HttpStreams.
311311
#[allow(missing_copy_implementations)]
312-
pub struct HttpConnector(pub Option<VerifyCallback>);
312+
pub struct HttpConnector<'v>(pub Option<ContextVerifier<'v>>);
313313

314-
impl NetworkConnector for HttpConnector {
314+
/// A method that can set verification methods on an SSL context
315+
pub type ContextVerifier<'v> = Box<FnMut(&mut SslContext) -> ()+'v>;
316+
317+
impl<'v> NetworkConnector for HttpConnector<'v> {
315318
type Stream = HttpStream;
316319

317320
fn connect(&mut self, host: &str, port: Port, scheme: &str) -> IoResult<HttpStream> {
@@ -325,7 +328,9 @@ impl NetworkConnector for HttpConnector {
325328
debug!("https scheme");
326329
let stream = try!(TcpStream::connect(addr));
327330
let mut context = try!(SslContext::new(Sslv23).map_err(lift_ssl_error));
328-
self.0.as_ref().map(|cb| context.set_verify(SslVerifyPeer, Some(*cb)));
331+
if let Some(ref mut verifier) = self.0 {
332+
verifier(&mut context);
333+
}
329334
let ssl = try!(Ssl::new(&context).map_err(lift_ssl_error));
330335
try!(ssl.set_hostname(host).map_err(lift_ssl_error));
331336
let stream = try!(SslStream::new(&context, stream).map_err(lift_ssl_error));

0 commit comments

Comments
 (0)