Skip to content

Commit 9978992

Browse files
committed
Initial commit
0 parents  commit 9978992

File tree

8 files changed

+657
-0
lines changed

8 files changed

+657
-0
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Cargo.lock
2+
target/

Cargo.toml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
[package]
2+
name = "hyper-rustls"
3+
version = "0.1.0"
4+
authors = ["Joseph Birr-Pixton <[email protected]>"]
5+
license = "Apache-2.0/ISC/MIT"
6+
readme = "README.md"
7+
description = "Rustls+hyper integration for pure rust HTTPS"
8+
homepage = "https://github.com/ctz/hyper-rustls"
9+
repository = "https://github.com/ctz/hyper-rustls"
10+
11+
[dependencies]
12+
webpki-roots = "0.4.0"
13+
rotor = "0.6"
14+
vecio = "0.1"
15+
rustls = "0.5.1"
16+
17+
[dependencies.hyper]
18+
version = "0.10.0-a.0"
19+
git = "https://github.com/hyperium/hyper"
20+
default-features = false
21+
22+
[dev-dependencies]
23+
log = "0.3"
24+
env_logger = "0.3"

README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# hyper-rustls
2+
This is an integration between the [rustls rust TLS stack](https://github.com/ctz/rustls)
3+
and the [hyper rust HTTP library](https://github.com/hyperium/hyper).
4+
5+
Implementations are provided of
6+
[`hyper::net::SslClient`](http://hyper.rs/hyper/master/hyper/net/trait.SslClient.html),
7+
[`hyper::net::SslServer`](http://hyper.rs/hyper/master/hyper/net/trait.SslServer.html)
8+
and [`hyper::net::Transport`](http://hyper.rs/hyper/master/hyper/net/trait.Transport.html).
9+
Note that these only exist on hyper master at the moment.
10+
11+
By default clients verify certificates using the `webpki-roots` crate, which includes
12+
the Mozilla root CAs.

examples/client.rs

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
#![deny(warnings)]
2+
extern crate hyper;
3+
extern crate hyper_rustls;
4+
extern crate webpki_roots;
5+
extern crate env_logger;
6+
7+
use std::env;
8+
use std::io;
9+
use std::sync::mpsc;
10+
use std::time::Duration;
11+
12+
use hyper::client::{Config, Request, Response};
13+
use hyper::header::Connection;
14+
use hyper::{Decoder, Encoder, Next};
15+
16+
#[derive(Debug)]
17+
struct Dump(mpsc::Sender<()>);
18+
19+
type HttpStream = hyper::net::HttpsStream<hyper_rustls::TlsStream>;
20+
21+
impl Drop for Dump {
22+
fn drop(&mut self) {
23+
let _ = self.0.send(());
24+
}
25+
}
26+
27+
fn read() -> Next {
28+
Next::read().timeout(Duration::from_secs(10))
29+
}
30+
31+
impl hyper::client::Handler<HttpStream> for Dump {
32+
fn on_request(&mut self, req: &mut Request) -> Next {
33+
req.headers_mut().set(Connection::close());
34+
read()
35+
}
36+
37+
fn on_request_writable(&mut self, _encoder: &mut Encoder<HttpStream>) -> Next {
38+
read()
39+
}
40+
41+
fn on_response(&mut self, res: Response) -> Next {
42+
println!("Response: {}", res.status());
43+
println!("Headers:\n{}", res.headers());
44+
read()
45+
}
46+
47+
fn on_response_readable(&mut self, decoder: &mut Decoder<HttpStream>) -> Next {
48+
match io::copy(decoder, &mut io::stdout()) {
49+
Ok(0) => Next::end(),
50+
Ok(_) => read(),
51+
Err(e) => match e.kind() {
52+
io::ErrorKind::WouldBlock => Next::read(),
53+
_ => {
54+
println!("ERROR:example: {}", e);
55+
Next::end()
56+
}
57+
}
58+
}
59+
}
60+
61+
fn on_error(&mut self, err: hyper::Error) -> Next {
62+
println!("ERROR:example: {}", err);
63+
Next::remove()
64+
}
65+
}
66+
67+
fn main() {
68+
env_logger::init().unwrap();
69+
70+
let url = match env::args().nth(1) {
71+
Some(url) => url,
72+
None => {
73+
println!("Usage: client <url>");
74+
return;
75+
}
76+
};
77+
78+
let (tx, rx) = mpsc::channel();
79+
let connector = hyper::client::HttpsConnector::new(hyper_rustls::TlsClient::new());
80+
let config = Config::default()
81+
.connector(connector);
82+
let client = config.build()
83+
.expect("Failed to create a Client");
84+
client.request(url.parse().unwrap(), Dump(tx)).unwrap();
85+
86+
// wait till done
87+
let _ = rx.recv();
88+
client.close();
89+
}

examples/sample.pem

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIEADCCAmigAwIBAgICAcgwDQYJKoZIhvcNAQELBQAwLDEqMCgGA1UEAwwhcG9u
3+
eXRvd24gUlNBIGxldmVsIDIgaW50ZXJtZWRpYXRlMB4XDTE2MDgxMzE2MDcwNFoX
4+
DTIyMDIwMzE2MDcwNFowGTEXMBUGA1UEAwwOdGVzdHNlcnZlci5jb20wggEiMA0G
5+
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpVhh1/FNP2qvWenbZSghari/UThwe
6+
dynfnHG7gc3JmygkEdErWBO/CHzHgsx7biVE5b8sZYNEDKFojyoPHGWK2bQM/FTy
7+
niJCgNCLdn6hUqqxLAml3cxGW77hAWu94THDGB1qFe+eFiAUnDmob8gNZtAzT6Ky
8+
b/JGJdrEU0wj+Rd7wUb4kpLInNH/Jc+oz2ii2AjNbGOZXnRz7h7Kv3sO9vABByYe
9+
LcCj3qnhejHMqVhbAT1MD6zQ2+YKBjE52MsQKU/xhUpu9KkUyLh0cxkh3zrFiKh4
10+
Vuvtc+n7aeOv2jJmOl1dr0XLlSHBlmoKqH6dCTSbddQLmlK7dms8vE01AgMBAAGj
11+
gb4wgbswDAYDVR0TAQH/BAIwADALBgNVHQ8EBAMCBsAwHQYDVR0OBBYEFMeUzGYV
12+
bXwJNQVbY1+A8YXYZY8pMEIGA1UdIwQ7MDmAFJvEsUi7+D8vp8xcWvnEdVBGkpoW
13+
oR6kHDAaMRgwFgYDVQQDDA9wb255dG93biBSU0EgQ0GCAXswOwYDVR0RBDQwMoIO
14+
dGVzdHNlcnZlci5jb22CFXNlY29uZC50ZXN0c2VydmVyLmNvbYIJbG9jYWxob3N0
15+
MA0GCSqGSIb3DQEBCwUAA4IBgQBsk5ivAaRAcNgjc7LEiWXFkMg703AqDDNx7kB1
16+
RDgLalLvrjOfOp2jsDfST7N1tKLBSQ9bMw9X4Jve+j7XXRUthcwuoYTeeo+Cy0/T
17+
1Q78ctoX74E2nB958zwmtRykGrgE/6JAJDwGcgpY9kBPycGxTlCN926uGxHsDwVs
18+
98cL6ZXptMLTR6T2XP36dAJZuOICSqmCSbFR8knc/gjUO36rXTxhwci8iDbmEVaf
19+
BHpgBXGU5+SQ+QM++v6bHGf4LNQC5NZ4e4xvGax8ioYu/BRsB/T3Lx+RlItz4zdU
20+
XuxCNcm3nhQV2ZHquRdbSdoyIxV5kJXel4wCmOhWIq7A2OBKdu5fQzIAzzLi65EN
21+
RPAKsKB4h7hGgvciZQ7dsMrlGw0DLdJ6UrFyiR5Io7dXYT/+JP91lP5xsl6Lhg9O
22+
FgALt7GSYRm2cZdgi9pO9rRr83Br1VjQT1vHz6yoZMXSqc4A2zcN2a2ZVq//rHvc
23+
FZygs8miAhWPzqnpmgTj1cPiU1M=
24+
-----END CERTIFICATE-----
25+
-----BEGIN CERTIFICATE-----
26+
MIIGnzCCAoegAwIBAgIBezANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA9wb255
27+
dG93biBSU0EgQ0EwHhcNMTYwODEzMTYwNzA0WhcNMjYwODExMTYwNzA0WjAsMSow
28+
KAYDVQQDDCFwb255dG93biBSU0EgbGV2ZWwgMiBpbnRlcm1lZGlhdGUwggGiMA0G
29+
CSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDIO5ONoB6s6oDayEHmxPGSmpDCfc++
30+
A5o0aRdIMerPW/KQlr56YggAiPZ/HOVFGP3lIBVQwUXAkyVn6MxKK1IMjVYh7WdP
31+
WzeXgjMwLEL+7r0XXbbo2P2rzC/6tqFvhANA8GiXjTFmOm5h9GS73z78FkxcNgBo
32+
lN1nsZwM5kf+xawusX5YsxjUFkIFTrlHRRl8A407nO3ZGtHzl8et27ooBlNG/Ys0
33+
fL8kNkyjg/KrowU/qCycSaxL12e066LgINDNdxWWw/jF+dm9gWYrQlRKDWFzw+qG
34+
rnqUMHXwzAw/Qj0UPC1LtCVosysT3KpEPCmYTf1wFrT/TXPXPnYCBlTuo6fOLW0S
35+
YZg5jc94h2JgS4zgCoYghJgnSzxHJ88/SBqEYtxoNbY92mpMHlu8I8XAgRyGjpk/
36+
wRb5gdsZ1vjwftW+cexyhtQDcdBa3csw064hL6018LgO8hM48EFFE0UcXgLk16Ur
37+
awKj+/QXN2salh85529ysRxY3J0PA269h/cCAwEAAaNeMFwwHQYDVR0OBBYEFJvE
38+
sUi7+D8vp8xcWvnEdVBGkpoWMCAGA1UdJQEB/wQWMBQGCCsGAQUFBwMBBggrBgEF
39+
BQcDAjAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIB/jANBgkqhkiG9w0BAQsFAAOC
40+
BAEAAZZhIHjNcLy0oMmi6brkWvaTL42hQPpzgtU8N+N/I8qm+6m3Rgnek8fr1fQX
41+
ndFfrvlbgYUDydlcX7dpy4dJYaNdp+2y1mmor0sSgCuY9jWNpyMQOJ9ihrrIg+7L
42+
CD2Vea/vPl9FAC/R0MOjs1fZ7Pui/ge/dmrF1VrznF3YfjHTbDTQ1rzNHpAhSUb3
43+
5uLgWttsMHVZevJDUa4PWy3wX7zyJsDPfjhGbVLonTYcLx8RmhliXh9U/v6Tmx/1
44+
lGtM4ZulO49D1jG0y5fcjFl63QUpaKh+v6AqfGlTfD5opG6WUJmqXClGEscZFj6b
45+
al58GEmnE4aScYCvSFy87fTM/euHqSzIPGS488JwWDCDmGnNmv3x05+4ENo1vktU
46+
xvW/dtFknbtDOP9J3I073lYi5AC4r6mZP0sxy+CbDHYtm7htpR19c2wTMJ01hUo2
47+
2YHwt412+MlTJjBFCK+PpDEjJ0etJb48lhUXHQJrHC2GL+1zyfA+eoKMMRdGMybm
48+
zwAmqdTwQly1Z6woevtuHJ4fUp3Hv7mK3XtSXQ9kDKpXtcPYbJD2luPM3hDvVsta
49+
SY5SQN1I5lFMDZDoBN8M2suA7RfqleOj6IwNJKS+AbetzMtw4NcNbGJwg6EL5v2n
50+
HbPWoLps8e6MkfqVR9vG8ddz+nBN+QTJvlJv0nDM+z25BlTLrWb2epxyu5vBU5Ln
51+
KE8/objQLSFtN17dnduf11cF08mgq4xaaHOBgvYoI1U/car4f9yZqyZ9+bpjD+4R
52+
/h8N3hlHa7GTnJcrxseZGv/8QtPlJ1SBGlb1/iwCKIv54DLn2r5QEhXML2/SU+RY
53+
LrBJf84TfkTuI4MBluJ+4XfGcLR50s1V7FjIm2lYNzCsvjMvbfcsnZK+krI8Qv4a
54+
0Ivo1mzOBfbk6hpfHjoChvDIM73Rtt44vgdndJWIxvcUxT7dXcAf8ztA62HCicNW
55+
Fh65GboY2VCsdoNfokR5XXJZaEOP9At2wI81XMd8+OvAw01z1aCQGwXHGEFfro9+
56+
RpYKPpMZn+tH0uzdOgbWruHV+Wm9MAI4TJW1pMjFOPam2YMB58MJ5XyulS15jKWW
57+
JsYBTJ5mRJnJJYBsvGRstGJ+NL3hHND0KFzygREMhKWqDRB6zcyV0cQF59LUp9Ui
58+
CPmLrxBvuJ3twn5dF/H3Df3NpyPYGAVsXRjVi7pyV1Vb3AqgRvDh76Jlq9GxTK5Q
59+
3ld+hPXnSIsyqQukTymBsZCNPso8v8E9goGcfLXsTLuXjXOcanRpcA8I36YeDbI5
60+
dV+oLt/PGdEX58NyhG2w5pECGNaUnglJQxlzUsE1O2pJl+JlTc0cs4K9VgHi7OPH
61+
TF3D/w2NKHQKH03neMEtR/O9YA==
62+
-----END CERTIFICATE-----
63+
-----BEGIN CERTIFICATE-----
64+
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
112+
uhZuLDgySxlb2xc=
113+
-----END CERTIFICATE-----

examples/sample.rsa

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIIEpAIBAAKCAQEAqVYYdfxTT9qr1np22UoIWq4v1E4cHncp35xxu4HNyZsoJBHR
3+
K1gTvwh8x4LMe24lROW/LGWDRAyhaI8qDxxlitm0DPxU8p4iQoDQi3Z+oVKqsSwJ
4+
pd3MRlu+4QFrveExwxgdahXvnhYgFJw5qG/IDWbQM0+ism/yRiXaxFNMI/kXe8FG
5+
+JKSyJzR/yXPqM9ootgIzWxjmV50c+4eyr97DvbwAQcmHi3Ao96p4XoxzKlYWwE9
6+
TA+s0NvmCgYxOdjLEClP8YVKbvSpFMi4dHMZId86xYioeFbr7XPp+2njr9oyZjpd
7+
Xa9Fy5UhwZZqCqh+nQk0m3XUC5pSu3ZrPLxNNQIDAQABAoIBAFKtZJgGsK6md4vq
8+
kyiYSufrcBLaaEQ/rkQtYCJKyC0NAlZKFLRy9oEpJbNLm4cQSkYPXn3Qunx5Jj2k
9+
2MYz+SgIDy7f7KHgr52Ew020dzNQ52JFvBgt6NTZaqL1TKOS1fcJSSNIvouTBerK
10+
NCSXHzfb4P+MfEVe/w1c4ilE+kH9SzdEo2jK/sRbzHIY8TX0JbmQ4SCLLayr22YG
11+
usIxtIYcWt3MMP/G2luRnYzzBCje5MXdpAhlHLi4TB6x4h5PmBKYc57uOVNngKLd
12+
YyrQKcszW4Nx5v0a4HG3A5EtUXNCco1+5asXOg2lYphQYVh2R+1wgu5WiDjDVu+6
13+
EYgjFSkCgYEA0NBk6FDoxE/4L/4iJ4zIhu9BptN8Je/uS5c6wRejNC/VqQyw7SHb
14+
hRFNrXPvq5Y+2bI/DxtdzZLKAMXOMjDjj0XEgfOIn2aveOo3uE7zf1i+njxwQhPu
15+
uSYA9AlBZiKGr2PCYSDPnViHOspVJjxRuAgyWM1Qf+CTC0D95aj0oz8CgYEAz5n4
16+
Cb3/WfUHxMJLljJ7PlVmlQpF5Hk3AOR9+vtqTtdxRjuxW6DH2uAHBDdC3OgppUN4
17+
CFj55kzc2HUuiHtmPtx8mK6G+otT7Lww+nLSFL4PvZ6CYxqcio5MPnoYd+pCxrXY
18+
JFo2W7e4FkBOxb5PF5So5plg+d0z/QiA7aFP1osCgYEAtgi1rwC5qkm8prn4tFm6
19+
hkcVCIXc+IWNS0Bu693bXKdGr7RsmIynff1zpf4ntYGpEMaeymClCY0ppDrMYlzU
20+
RBYiFNdlBvDRj6s/H+FTzHRk2DT/99rAhY9nzVY0OQFoQIXK8jlURGrkmI/CYy66
21+
XqBmo5t4zcHM7kaeEBOWEKkCgYAYnO6VaRtPNQfYwhhoFFAcUc+5t+AVeHGW/4AY
22+
M5qlAlIBu64JaQSI5KqwS0T4H+ZgG6Gti68FKPO+DhaYQ9kZdtam23pRVhd7J8y+
23+
xMI3h1kiaBqZWVxZ6QkNFzizbui/2mtn0/JB6YQ/zxwHwcpqx0tHG8Qtm5ZAV7PB
24+
eLCYhQKBgQDALJxU/6hMTdytEU5CLOBSMby45YD/RrfQrl2gl/vA0etPrto4RkVq
25+
UrkDO/9W4mZORClN3knxEFSTlYi8YOboxdlynpFfhcs82wFChs+Ydp1eEsVHAqtu
26+
T+uzn0sroycBiBfVB949LExnzGDFUkhG0i2c2InarQYLTsIyHCIDEA==
27+
-----END RSA PRIVATE KEY-----

0 commit comments

Comments
 (0)