Skip to content

Commit 0fd6fcd

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 7235d3f commit 0fd6fcd

22 files changed

+641
-639
lines changed

Diff for: README.md

+12-9
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,13 @@ 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::io::Write;
31+
use std::net::IpAddr;
32+
33+
use hyper::Server;
34+
use hyper::server::Request;
35+
use hyper::server::Response;
3436
use hyper::net::Fresh;
35-
use hyper::IpAddr::Ipv4Addr;
3637

3738
fn hello(_: Request, mut res: Response<Fresh>) {
3839
let mut res = res.start().unwrap();
@@ -41,8 +42,7 @@ fn hello(_: Request, mut res: Response<Fresh>) {
4142
}
4243

4344
fn main() {
44-
let server = Server::http(Ipv4Addr(127, 0, 0, 1), 1337);
45-
server.listen(hello).unwrap();
45+
Server::http(hello).listen(IpAddr::new_v4(127, 0, 0, 1), 3000).unwrap();
4646
}
4747
```
4848

@@ -51,7 +51,9 @@ Client:
5151
```rust
5252
extern crate hyper;
5353

54-
use hyper::client::Client;
54+
use std::io::Read;
55+
56+
use hyper::Client;
5557
use hyper::header::Connection;
5658
use hyper::header::ConnectionOption;
5759

@@ -67,7 +69,8 @@ fn main() {
6769
.send().unwrap();
6870

6971
// Read the Response.
70-
let body = res.read_to_string().unwrap();
72+
let mut body = String::new();
73+
res.read_to_string(&mut body).unwrap();
7174

7275
println!("Response: {}", body);
7376
}

Diff for: benches/client.rs

+70-31
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,53 @@
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, Cursor};
8+
use std::net::SocketAddr;
9+
10+
use hyper::net;
11+
12+
static README: &'static [u8] = include_bytes!("../README.md");
13+
14+
struct MockStream {
15+
read: Cursor<Vec<u8>>
16+
}
17+
18+
impl MockStream {
19+
fn new() -> MockStream {
20+
let head = b"HTTP/1.1 200 OK\r\nServer: Mock\r\n\r\n";
21+
let mut res = head.to_vec();
22+
res.push_all(README);
23+
MockStream {
24+
read: Cursor::new(res)
25+
}
26+
}
1527
}
1628

17-
macro_rules! try_return(
18-
($e:expr) => {{
19-
match $e {
20-
Ok(v) => v,
21-
Err(..) => return
29+
impl Clone for MockStream {
30+
fn clone(&self) -> MockStream {
31+
MockStream {
32+
read: Cursor::new(self.read.get_ref().clone())
2233
}
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());
34+
}
35+
}
36+
37+
impl Read for MockStream {
38+
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
39+
self.read.read(buf)
40+
}
41+
}
42+
43+
impl Write for MockStream {
44+
fn write(&mut self, msg: &[u8]) -> io::Result<usize> {
45+
// we're mocking, what do we care.
46+
Ok(msg.len())
47+
}
48+
fn flush(&mut self) -> io::Result<()> {
49+
Ok(())
50+
}
3151
}
3252

3353
#[derive(Clone)]
@@ -48,17 +68,36 @@ impl hyper::header::HeaderFormat for Foo {
4868
}
4969
}
5070

71+
impl net::NetworkStream for MockStream {
72+
fn peer_addr(&mut self) -> io::Result<SocketAddr> {
73+
Ok("127.0.0.1:1337".parse().unwrap())
74+
}
75+
}
76+
77+
struct MockConnector;
78+
79+
impl net::NetworkConnector for MockConnector {
80+
type Stream = MockStream;
81+
fn connect(&mut self, _: &str, _: u16, _: &str) -> io::Result<MockStream> {
82+
Ok(MockStream::new())
83+
}
84+
85+
}
86+
5187
#[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);
88+
fn bench_mock_hyper(b: &mut test::Bencher) {
89+
let url = "http://127.0.0.1:1337/";
5990
b.iter(|| {
60-
client.get(url).header(Foo).send().unwrap().read_to_string().unwrap();
91+
let mut req = hyper::client::Request::with_connector(
92+
hyper::Get, hyper::Url::parse(url).unwrap(), &mut MockConnector
93+
).unwrap();
94+
req.headers_mut().set(Foo);
95+
96+
let mut s = String::new();
97+
req
98+
.start().unwrap()
99+
.send().unwrap()
100+
.read_to_string(&mut s).unwrap()
61101
});
62-
listening.close().unwrap()
63102
}
64103

Diff for: benches/client_mock_tcp.rs

-98
This file was deleted.

Diff for: 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()));

Diff for: 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
}

Diff for: 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
}

Diff for: 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)