Skip to content

Commit 66180ee

Browse files
committed
feat(hyper): switch to std::io, std::net, and std::path.
All instances of `old_io` and `old_path` were switched to use the new shiny `std::io`, `std::net`, and `std::path` modules. This means that `Request` and `Response` implement `Read` and `Write` now. Because of the changes to `TcpListener`, this also takes the opportunity to correct the method usage of `Server`. As with other languages/frameworks, the server is first created with a handler, and then a host/port is passed to a `listen` method. This reverses what `Server` used to do. Closes #347 BREAKING CHANGE: Check the docs. Everything was touched.
1 parent b1b8bf1 commit 66180ee

23 files changed

+670
-668
lines changed

Cargo.toml

+3
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,6 @@ time = "*"
2121
unicase = "*"
2222
unsafe-any = "*"
2323
url = "*"
24+
25+
[profile.bench]
26+
opt-level = 0

README.md

+7-8
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,12 @@ Hello World Server:
2727
```rust
2828
extern crate hyper;
2929

30-
use hyper::status::StatusCode;
31-
use hyper::server::Server;
32-
use hyper::server::request::Request;
33-
use hyper::server::response::Response;
30+
use std::net::IpAddr;
31+
32+
use hyper::Server;
33+
use hyper::server::Request;
34+
use hyper::server::Response;
3435
use hyper::net::Fresh;
35-
use hyper::IpAddr::Ipv4Addr;
3636

3737
fn hello(_: Request, mut res: Response<Fresh>) {
3838
let mut res = res.start().unwrap();
@@ -41,8 +41,7 @@ fn hello(_: Request, mut res: Response<Fresh>) {
4141
}
4242

4343
fn main() {
44-
let server = Server::http(Ipv4Addr(127, 0, 0, 1), 1337);
45-
server.listen(hello).unwrap();
44+
Server::http(hello).listen(IpAddr::new_v4(127, 0, 0, 1), 3000).unwrap();
4645
}
4746
```
4847

@@ -51,7 +50,7 @@ Client:
5150
```rust
5251
extern crate hyper;
5352

54-
use hyper::client::Client;
53+
use hyper::Client;
5554
use hyper::header::Connection;
5655
use hyper::header::ConnectionOption;
5756

benches/client.rs

+64-31
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,47 @@
1-
#![feature(core, old_io, test)]
1+
#![feature(collections, io, net, test)]
22
extern crate hyper;
33

44
extern crate test;
55

66
use std::fmt;
7-
use std::old_io::net::ip::Ipv4Addr;
8-
use hyper::server::{Request, Response, Server};
9-
use hyper::header::Headers;
10-
use hyper::Client;
11-
12-
fn listen() -> hyper::server::Listening {
13-
let server = Server::http(Ipv4Addr(127, 0, 0, 1), 0);
14-
server.listen(handle).unwrap()
7+
use std::io::{self, Read, Write};
8+
use std::net::SocketAddr;
9+
10+
use hyper::net;
11+
12+
static README: &'static [u8] = include_bytes!("../README.md");
13+
14+
15+
#[derive(Clone)]
16+
struct MockStream {
17+
read: Vec<u8>
1518
}
1619

17-
macro_rules! try_return(
18-
($e:expr) => {{
19-
match $e {
20-
Ok(v) => v,
21-
Err(..) => return
20+
impl MockStream {
21+
fn new() -> MockStream {
22+
let head = b"HTTP/1.1 200 OK\r\nServer: Mock\r\n\r\n";
23+
let mut res = head.to_vec();
24+
res.push_all(README);
25+
MockStream {
26+
read: res
2227
}
23-
}}
24-
);
25-
26-
fn handle(_r: Request, res: Response) {
27-
static BODY: &'static [u8] = b"Benchmarking hyper vs others!";
28-
let mut res = try_return!(res.start());
29-
try_return!(res.write_all(BODY));
30-
try_return!(res.end());
28+
}
29+
}
30+
31+
impl Read for MockStream {
32+
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
33+
Read::read(&mut &self.read[..], buf)
34+
}
35+
}
36+
37+
impl Write for MockStream {
38+
fn write(&mut self, msg: &[u8]) -> io::Result<usize> {
39+
// we're mocking, what do we care.
40+
Ok(msg.len())
41+
}
42+
fn flush(&mut self) -> io::Result<()> {
43+
Ok(())
44+
}
3145
}
3246

3347
#[derive(Clone)]
@@ -48,17 +62,36 @@ impl hyper::header::HeaderFormat for Foo {
4862
}
4963
}
5064

65+
impl net::NetworkStream for MockStream {
66+
fn peer_addr(&mut self) -> io::Result<SocketAddr> {
67+
Ok("127.0.0.1:1337".parse().unwrap())
68+
}
69+
}
70+
71+
struct MockConnector;
72+
73+
impl net::NetworkConnector for MockConnector {
74+
type Stream = MockStream;
75+
fn connect(&mut self, _: &str, _: u16, _: &str) -> io::Result<MockStream> {
76+
Ok(MockStream::new())
77+
}
78+
79+
}
80+
5181
#[bench]
52-
fn bench_hyper(b: &mut test::Bencher) {
53-
let mut listening = listen();
54-
let s = format!("http://{}/", listening.socket);
55-
let url = s.as_slice();
56-
let mut client = Client::new();
57-
let mut headers = Headers::new();
58-
headers.set(Foo);
82+
fn bench_mock_hyper(b: &mut test::Bencher) {
83+
let url = "http://127.0.0.1:1337/";
5984
b.iter(|| {
60-
client.get(url).header(Foo).send().unwrap().read_to_string().unwrap();
85+
let mut req = hyper::client::Request::with_connector(
86+
hyper::Get, hyper::Url::parse(url).unwrap(), &mut MockConnector
87+
).unwrap();
88+
req.headers_mut().set(Foo);
89+
90+
let mut s = String::new();
91+
req
92+
.start().unwrap()
93+
.send().unwrap()
94+
.read_to_string(&mut s).unwrap()
6195
});
62-
listening.close().unwrap()
6396
}
6497

benches/client_mock_tcp.rs

-98
This file was deleted.

benches/server.rs

+7-5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
#![feature(old_io, test)]
1+
#![feature(io, net, test)]
22
extern crate hyper;
33
extern crate test;
44

55
use test::Bencher;
6-
use std::old_io::net::ip::Ipv4Addr;
6+
use std::io::{Read, Write};
7+
use std::net::IpAddr;
78

89
use hyper::method::Method::Get;
910
use hyper::server::{Request, Response};
@@ -12,7 +13,8 @@ static PHRASE: &'static [u8] = b"Benchmarking hyper vs others!";
1213

1314
fn request(url: hyper::Url) {
1415
let req = hyper::client::Request::new(Get, url).unwrap();
15-
req.start().unwrap().send().unwrap().read_to_string().unwrap();
16+
let mut s = String::new();
17+
req.start().unwrap().send().unwrap().read_to_string(&mut s).unwrap();
1618
}
1719

1820
fn hyper_handle(_: Request, res: Response) {
@@ -23,8 +25,8 @@ fn hyper_handle(_: Request, res: Response) {
2325

2426
#[bench]
2527
fn bench_hyper(b: &mut Bencher) {
26-
let server = hyper::Server::http(Ipv4Addr(127, 0, 0, 1), 0);
27-
let mut listener = server.listen(hyper_handle).unwrap();
28+
let server = hyper::Server::http(hyper_handle);
29+
let mut listener = server.listen(IpAddr::new_v4(127, 0, 0, 1), 0).unwrap();
2830

2931
let url = hyper::Url::parse(&*format!("http://{}", listener.socket)).unwrap();
3032
b.iter(|| request(url.clone()));

examples/client.rs

+3-9
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
#![feature(env, old_io)]
1+
#![feature(env)]
22
extern crate hyper;
33

44
use std::env;
5-
use std::old_io::stdout;
6-
use std::old_io::util::copy;
75

86
use hyper::Client;
97

@@ -18,16 +16,12 @@ fn main() {
1816

1917
let mut client = Client::new();
2018

21-
let mut res = match client.get(&*url).send() {
19+
let res = match client.get(&*url).send() {
2220
Ok(res) => res,
2321
Err(err) => panic!("Failed to connect: {:?}", err)
2422
};
2523

2624
println!("Response: {}", res.status);
2725
println!("Headers:\n{}", res.headers);
28-
match copy(&mut res, &mut stdout()) {
29-
Ok(..) => (),
30-
Err(e) => panic!("Stream failure: {:?}", e)
31-
};
32-
26+
//TODO: add copy back when std::stdio impls std::io::Write.
3327
}

examples/hello.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
#![feature(old_io)]
1+
#![feature(io, net)]
22
extern crate hyper;
33

4-
use std::old_io::net::ip::Ipv4Addr;
4+
use std::io::Write;
5+
use std::net::IpAddr;
56
use hyper::server::{Request, Response};
67

78
static PHRASE: &'static [u8] = b"Hello World!";
@@ -13,7 +14,7 @@ fn hello(_: Request, res: Response) {
1314
}
1415

1516
fn main() {
16-
let _listening = hyper::Server::http(Ipv4Addr(127, 0, 0, 1), 3000)
17-
.listen(hello).unwrap();
17+
let _listening = hyper::Server::http(hello)
18+
.listen(IpAddr::new_v4(127, 0, 0, 1), 3000).unwrap();
1819
println!("Listening on http://127.0.0.1:3000");
1920
}

examples/server.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
#![feature(old_io)]
1+
#![feature(io, net)]
22
extern crate hyper;
33
#[macro_use] extern crate log;
44

5-
use std::old_io::util::copy;
6-
use std::old_io::net::ip::Ipv4Addr;
5+
use std::io::{Write, copy};
6+
use std::net::IpAddr;
77

88
use hyper::{Get, Post};
99
use hyper::header::ContentLength;
@@ -50,7 +50,7 @@ fn echo(mut req: Request, mut res: Response) {
5050
}
5151

5252
fn main() {
53-
let server = Server::http(Ipv4Addr(127, 0, 0, 1), 1337);
54-
let _guard = server.listen(echo).unwrap();
53+
let server = Server::http(echo);
54+
let _guard = server.listen(IpAddr::new_v4(127, 0, 0, 1), 1337).unwrap();
5555
println!("Listening on http://127.0.0.1:1337");
5656
}

0 commit comments

Comments
 (0)