Skip to content

Commit d5864e2

Browse files
committed
made openssl optional behind a feature gate
1 parent d6fb9fe commit d5864e2

File tree

10 files changed

+127
-151
lines changed

10 files changed

+127
-151
lines changed

Cargo.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,15 @@ license = "MIT"
1919
[dependencies]
2020
hyper = "^0.10"
2121
unicase = "^1.0"
22-
openssl = "^0.9.10"
2322
url = "^1.0"
2423
rustc-serialize = "^0.3"
2524
bitflags = "^0.8"
2625
rand = "^0.3"
2726
byteorder = "^1.0"
27+
sha1 = "^0.2"
28+
openssl = { version = "^0.9.10", optional = true }
2829

2930
[features]
31+
default = ["ssl"]
32+
ssl = ["openssl"]
3033
nightly = ["hyper/nightly"]

src/client/builder.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,15 @@ use hyper::header::{
2323
ProtocolName,
2424
};
2525
use unicase::UniCase;
26-
use openssl::error::ErrorStack as SslError;
26+
#[cfg(feature="ssl")]
2727
use openssl::ssl::{
28-
SslContext,
2928
SslMethod,
3029
SslStream,
3130
SslConnector,
3231
SslConnectorBuilder,
3332
};
33+
#[cfg(feature="ssl")]
34+
use stream::BoxedNetworkStream;
3435
use header::extensions::Extension;
3536
use header::{
3637
WebSocketAccept,
@@ -46,11 +47,7 @@ use result::{
4647
WebSocketError,
4748
};
4849
use stream::{
49-
BoxedNetworkStream,
50-
AsTcpStream,
5150
Stream,
52-
Splittable,
53-
Shutdown,
5451
};
5552
use super::Client;
5653

@@ -201,6 +198,7 @@ impl<'u> ClientBuilder<'u> {
201198
Ok(tcp_stream)
202199
}
203200

201+
#[cfg(feature="ssl")]
204202
fn wrap_ssl(&self,
205203
tcp_stream: TcpStream,
206204
connector: Option<SslConnector>
@@ -218,6 +216,7 @@ impl<'u> ClientBuilder<'u> {
218216
Ok(ssl_stream)
219217
}
220218

219+
#[cfg(feature="ssl")]
221220
pub fn connect(&mut self,
222221
ssl_config: Option<SslConnector>
223222
) -> WebSocketResult<Client<BoxedNetworkStream>> {
@@ -238,6 +237,7 @@ impl<'u> ClientBuilder<'u> {
238237
self.connect_on(tcp_stream)
239238
}
240239

240+
#[cfg(feature="ssl")]
241241
pub fn connect_secure(&mut self,
242242
ssl_config: Option<SslConnector>
243243
) -> WebSocketResult<Client<SslStream<TcpStream>>> {
@@ -298,7 +298,7 @@ impl<'u> ClientBuilder<'u> {
298298
WebSocketError::RequestError("Request Sec-WebSocket-Key was invalid")
299299
));
300300

301-
if response.headers.get() != Some(&(try!(WebSocketAccept::new(key)))) {
301+
if response.headers.get() != Some(&(WebSocketAccept::new(key))) {
302302
return Err(WebSocketError::ResponseError("Sec-WebSocket-Accept is invalid"));
303303
}
304304

src/client/mod.rs

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -7,34 +7,11 @@ use std::borrow::{
77
use std::net::TcpStream;
88
use std::net::SocketAddr;
99
use std::io::Result as IoResult;
10-
use std::io::{
11-
Write,
12-
};
1310

1411
use self::url::{
1512
Url,
1613
ParseError,
17-
Position,
18-
};
19-
use openssl::ssl::{
20-
SslContext,
21-
SslMethod,
22-
SslStream,
2314
};
24-
use hyper::buffer::BufReader;
25-
use hyper::status::StatusCode;
26-
use hyper::http::h1::parse_response;
27-
use hyper::version::HttpVersion;
28-
use hyper::header::{
29-
Headers,
30-
Host,
31-
Connection,
32-
ConnectionOption,
33-
Upgrade,
34-
Protocol,
35-
ProtocolName,
36-
};
37-
use unicase::UniCase;
3815

3916
use ws;
4017
use ws::sender::Sender as SenderTrait;
@@ -43,22 +20,10 @@ use ws::receiver::{
4320
MessageIterator,
4421
};
4522
use ws::receiver::Receiver as ReceiverTrait;
46-
use header::extensions::Extension;
47-
use header::{
48-
WebSocketAccept,
49-
WebSocketKey,
50-
WebSocketVersion,
51-
WebSocketProtocol,
52-
WebSocketExtensions,
53-
Origin,
54-
};
5523
use result::{
56-
WSUrlErrorKind,
5724
WebSocketResult,
58-
WebSocketError,
5925
};
6026
use stream::{
61-
BoxedNetworkStream,
6227
AsTcpStream,
6328
Stream,
6429
Splittable,

src/header/accept.rs

Lines changed: 91 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@ use std::fmt::{self, Debug};
55
use std::str::FromStr;
66
use serialize::base64::{ToBase64, FromBase64, STANDARD};
77
use header::WebSocketKey;
8-
use openssl::hash::{self, hash};
9-
use openssl::error::ErrorStack as SslError;
108
use result::{WebSocketResult, WebSocketError};
9+
use sha1::Sha1;
1110

1211
static MAGIC_GUID: &'static str = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
1312

@@ -16,115 +15,112 @@ static MAGIC_GUID: &'static str = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
1615
pub struct WebSocketAccept([u8; 20]);
1716

1817
impl Debug for WebSocketAccept {
19-
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
20-
write!(f, "WebSocketAccept({})", self.serialize())
21-
}
18+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
19+
write!(f, "WebSocketAccept({})", self.serialize())
20+
}
2221
}
2322

2423
impl FromStr for WebSocketAccept {
25-
type Err = WebSocketError;
24+
type Err = WebSocketError;
2625

27-
fn from_str(accept: &str) -> WebSocketResult<WebSocketAccept> {
28-
match accept.from_base64() {
29-
Ok(vec) => {
30-
if vec.len() != 20 {
31-
return Err(WebSocketError::ProtocolError(
32-
"Sec-WebSocket-Accept must be 20 bytes"
33-
));
34-
}
35-
let mut array = [0u8; 20];
36-
let mut iter = vec.into_iter();
37-
for i in array.iter_mut() {
38-
*i = iter.next().unwrap();
39-
}
40-
Ok(WebSocketAccept(array))
41-
}
42-
Err(_) => {
43-
return Err(WebSocketError::ProtocolError(
44-
"Invalid Sec-WebSocket-Accept "
45-
));
46-
}
47-
}
48-
}
26+
fn from_str(accept: &str) -> WebSocketResult<WebSocketAccept> {
27+
match accept.from_base64() {
28+
Ok(vec) => {
29+
if vec.len() != 20 {
30+
return Err(WebSocketError::ProtocolError(
31+
"Sec-WebSocket-Accept must be 20 bytes"
32+
));
33+
}
34+
let mut array = [0u8; 20];
35+
let mut iter = vec.into_iter();
36+
for i in array.iter_mut() {
37+
*i = iter.next().unwrap();
38+
}
39+
Ok(WebSocketAccept(array))
40+
}
41+
Err(_) => {
42+
return Err(WebSocketError::ProtocolError(
43+
"Invalid Sec-WebSocket-Accept "
44+
));
45+
}
46+
}
47+
}
4948
}
5049

5150
impl WebSocketAccept {
52-
/// Create a new WebSocketAccept from the given WebSocketKey
53-
pub fn new(key: &WebSocketKey) -> Result<WebSocketAccept, SslError> {
54-
let serialized = key.serialize();
55-
let mut concat_key = String::with_capacity(serialized.len() + 36);
56-
concat_key.push_str(&serialized[..]);
57-
concat_key.push_str(MAGIC_GUID);
58-
let output = try!(hash(hash::MessageDigest::sha1(), concat_key.as_bytes()));
59-
let mut iter = output.into_iter();
60-
let mut bytes = [0u8; 20];
61-
for i in bytes.iter_mut() {
62-
*i = iter.next().unwrap();
63-
}
64-
Ok(WebSocketAccept(bytes))
65-
}
66-
/// Return the Base64 encoding of this WebSocketAccept
67-
pub fn serialize(&self) -> String {
68-
let WebSocketAccept(accept) = *self;
69-
accept.to_base64(STANDARD)
70-
}
51+
/// Create a new WebSocketAccept from the given WebSocketKey
52+
pub fn new(key: &WebSocketKey) -> WebSocketAccept {
53+
let serialized = key.serialize();
54+
let mut concat_key = String::with_capacity(serialized.len() + 36);
55+
concat_key.push_str(&serialized[..]);
56+
concat_key.push_str(MAGIC_GUID);
57+
let mut sha1 = Sha1::new();
58+
sha1.update(concat_key.as_bytes());
59+
let bytes = sha1.digest().bytes();
60+
WebSocketAccept(bytes)
61+
}
62+
/// Return the Base64 encoding of this WebSocketAccept
63+
pub fn serialize(&self) -> String {
64+
let WebSocketAccept(accept) = *self;
65+
accept.to_base64(STANDARD)
66+
}
7167
}
7268

7369
impl Header for WebSocketAccept {
74-
fn header_name() -> &'static str {
75-
"Sec-WebSocket-Accept"
76-
}
70+
fn header_name() -> &'static str {
71+
"Sec-WebSocket-Accept"
72+
}
7773

78-
fn parse_header(raw: &[Vec<u8>]) -> hyper::Result<WebSocketAccept> {
79-
from_one_raw_str(raw)
80-
}
74+
fn parse_header(raw: &[Vec<u8>]) -> hyper::Result<WebSocketAccept> {
75+
from_one_raw_str(raw)
76+
}
8177
}
8278

8379
impl HeaderFormat for WebSocketAccept {
84-
fn fmt_header(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
85-
write!(fmt, "{}", self.serialize())
86-
}
80+
fn fmt_header(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
81+
write!(fmt, "{}", self.serialize())
82+
}
8783
}
8884

8985
#[cfg(all(feature = "nightly", test))]
9086
mod tests {
91-
use super::*;
92-
use test;
93-
use std::str::FromStr;
94-
use header::{Headers, WebSocketKey};
95-
use hyper::header::{Header, HeaderFormatter};
96-
#[test]
97-
fn test_header_accept() {
98-
let key = FromStr::from_str("dGhlIHNhbXBsZSBub25jZQ==").unwrap();
99-
let accept = WebSocketAccept::new(&key);
100-
let mut headers = Headers::new();
101-
headers.set(accept);
102-
103-
assert_eq!(&headers.to_string()[..], "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n");
104-
}
105-
#[bench]
106-
fn bench_header_accept_new(b: &mut test::Bencher) {
107-
let key = WebSocketKey::new();
108-
b.iter(|| {
109-
let mut accept = WebSocketAccept::new(&key);
110-
test::black_box(&mut accept);
111-
});
112-
}
113-
#[bench]
114-
fn bench_header_accept_parse(b: &mut test::Bencher) {
115-
let value = vec![b"s3pPLMBiTxaQ9kYGzzhZRbK+xOo=".to_vec()];
116-
b.iter(|| {
117-
let mut accept: WebSocketAccept = Header::parse_header(&value[..]).unwrap();
118-
test::black_box(&mut accept);
119-
});
120-
}
121-
#[bench]
122-
fn bench_header_accept_format(b: &mut test::Bencher) {
123-
let value = vec![b"s3pPLMBiTxaQ9kYGzzhZRbK+xOo=".to_vec()];
124-
let val: WebSocketAccept = Header::parse_header(&value[..]).unwrap();
125-
let fmt = HeaderFormatter(&val);
126-
b.iter(|| {
127-
format!("{}", fmt);
128-
});
129-
}
87+
use super::*;
88+
use test;
89+
use std::str::FromStr;
90+
use header::{Headers, WebSocketKey};
91+
use hyper::header::{Header, HeaderFormatter};
92+
#[test]
93+
fn test_header_accept() {
94+
let key = FromStr::from_str("dGhlIHNhbXBsZSBub25jZQ==").unwrap();
95+
let accept = WebSocketAccept::new(&key);
96+
let mut headers = Headers::new();
97+
headers.set(accept);
98+
99+
assert_eq!(&headers.to_string()[..], "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n");
100+
}
101+
#[bench]
102+
fn bench_header_accept_new(b: &mut test::Bencher) {
103+
let key = WebSocketKey::new();
104+
b.iter(|| {
105+
let mut accept = WebSocketAccept::new(&key);
106+
test::black_box(&mut accept);
107+
});
108+
}
109+
#[bench]
110+
fn bench_header_accept_parse(b: &mut test::Bencher) {
111+
let value = vec![b"s3pPLMBiTxaQ9kYGzzhZRbK+xOo=".to_vec()];
112+
b.iter(|| {
113+
let mut accept: WebSocketAccept = Header::parse_header(&value[..]).unwrap();
114+
test::black_box(&mut accept);
115+
});
116+
}
117+
#[bench]
118+
fn bench_header_accept_format(b: &mut test::Bencher) {
119+
let value = vec![b"s3pPLMBiTxaQ9kYGzzhZRbK+xOo=".to_vec()];
120+
let val: WebSocketAccept = Header::parse_header(&value[..]).unwrap();
121+
let fmt = HeaderFormatter(&val);
122+
b.iter(|| {
123+
format!("{}", fmt);
124+
});
125+
}
130126
}

src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,11 @@ extern crate hyper;
4040
extern crate unicase;
4141
extern crate url;
4242
extern crate rustc_serialize as serialize;
43-
extern crate openssl;
4443
extern crate rand;
4544
extern crate byteorder;
45+
extern crate sha1;
46+
#[cfg(feature="ssl")]
47+
extern crate openssl;
4648

4749
#[macro_use]
4850
extern crate bitflags;

0 commit comments

Comments
 (0)