Skip to content

Commit 1cf388c

Browse files
committed
feat(client): add a new Client struct with super powers
- Includes ergonomic traits like IntoUrl and IntoBody, allowing easy usage. - Client can have a RedirectPolicy. - Client can have a SslVerifier. Updated benchmarks for client. (Disabled rust-http client bench since it hangs.)
1 parent 7f93184 commit 1cf388c

File tree

13 files changed

+527
-86
lines changed

13 files changed

+527
-86
lines changed

README.md

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -42,18 +42,14 @@ Client:
4242

4343
```rust
4444
fn main() {
45-
// Creating an outgoing request.
46-
let mut req = Request::get(Url::parse("http://www.gooogle.com/").unwrap()).unwrap();
45+
// Create a client.
46+
let mut client = Client::new();
4747

48-
// Setting a header.
49-
req.headers_mut().set(Connection(vec![Close]));
48+
// Creating an outgoing request.
49+
let mut res = client.get("http://www.gooogle.com/");
5050

51-
// Start the Request, writing headers and starting streaming.
52-
let res = req.start().unwrap()
53-
// Send the Request.
54-
.send().unwrap()
55-
// Read the Response.
56-
.read_to_string().unwrap();
51+
// Read the Response.
52+
let body = res.read_to_string().unwrap();
5753

5854
println!("Response: {}", res);
5955
}
@@ -64,22 +60,20 @@ fn main() {
6460
[Client Bench:](./benches/client.rs)
6561

6662
```
67-
6863
running 3 tests
69-
test bench_curl ... bench: 298416 ns/iter (+/- 132455)
70-
test bench_http ... bench: 292725 ns/iter (+/- 167575)
71-
test bench_hyper ... bench: 222819 ns/iter (+/- 86615)
64+
test bench_curl ... bench: 400253 ns/iter (+/- 143539)
65+
test bench_hyper ... bench: 181703 ns/iter (+/- 46529)
7266
73-
test result: ok. 0 passed; 0 failed; 0 ignored; 3 measured
67+
test result: ok. 0 passed; 0 failed; 0 ignored; 2 measured
7468
```
7569

7670
[Mock Client Bench:](./benches/client_mock_tcp.rs)
7771

7872
```
7973
running 3 tests
80-
test bench_mock_curl ... bench: 25254 ns/iter (+/- 2113)
81-
test bench_mock_http ... bench: 43585 ns/iter (+/- 1206)
82-
test bench_mock_hyper ... bench: 27153 ns/iter (+/- 2227)
74+
test bench_mock_curl ... bench: 53987 ns/iter (+/- 1735)
75+
test bench_mock_http ... bench: 43569 ns/iter (+/- 1409)
76+
test bench_mock_hyper ... bench: 20996 ns/iter (+/- 1742)
8377
8478
test result: ok. 0 passed; 0 failed; 0 ignored; 3 measured
8579
```

benches/client.rs

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ extern crate test;
88
use std::fmt::{mod, Show};
99
use std::io::net::ip::Ipv4Addr;
1010
use hyper::server::{Request, Response, Server};
11+
use hyper::method::Method::Get;
12+
use hyper::header::Headers;
13+
use hyper::Client;
14+
use hyper::client::RequestBuilder;
1115

1216
fn listen() -> hyper::server::Listening {
1317
let server = Server::http(Ipv4Addr(127, 0, 0, 1), 0);
@@ -22,9 +26,10 @@ macro_rules! try_return(
2226
}
2327
}})
2428

25-
fn handle(_: Request, res: Response) {
29+
fn handle(_r: Request, res: Response) {
30+
static BODY: &'static [u8] = b"Benchmarking hyper vs others!";
2631
let mut res = try_return!(res.start());
27-
try_return!(res.write(b"Benchmarking hyper vs others!"))
32+
try_return!(res.write(BODY))
2833
try_return!(res.end());
2934
}
3035

@@ -41,7 +46,7 @@ fn bench_curl(b: &mut test::Bencher) {
4146
.exec()
4247
.unwrap()
4348
});
44-
listening.close().unwrap()
49+
listening.close().unwrap();
4550
}
4651

4752
#[deriving(Clone)]
@@ -67,17 +72,17 @@ fn bench_hyper(b: &mut test::Bencher) {
6772
let mut listening = listen();
6873
let s = format!("http://{}/", listening.socket);
6974
let url = s.as_slice();
75+
let mut client = Client::new();
76+
let mut headers = Headers::new();
77+
headers.set(Foo);
7078
b.iter(|| {
71-
let mut req = hyper::client::Request::get(hyper::Url::parse(url).unwrap()).unwrap();
72-
req.headers_mut().set(Foo);
73-
74-
req.start().unwrap()
75-
.send().unwrap()
76-
.read_to_string().unwrap()
79+
client.request(RequestBuilder::new(Get, url).header(Foo)).unwrap().read_to_string().unwrap();
7780
});
7881
listening.close().unwrap()
7982
}
8083

84+
/*
85+
doesn't handle keep-alive properly...
8186
#[bench]
8287
fn bench_http(b: &mut test::Bencher) {
8388
let mut listening = listen();
@@ -92,9 +97,10 @@ fn bench_http(b: &mut test::Bencher) {
9297
// cant unwrap because Err contains RequestWriter, which does not implement Show
9398
let mut res = match req.read_response() {
9499
Ok(res) => res,
95-
Err(..) => panic!("http response failed")
100+
Err((_, ioe)) => panic!("http response failed = {}", ioe)
96101
};
97102
res.read_to_string().unwrap();
98103
});
99104
listening.close().unwrap()
100105
}
106+
*/

benches/server.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,13 @@ use test::Bencher;
99
use std::io::net::ip::{SocketAddr, Ipv4Addr};
1010

1111
use http::server::Server;
12+
use hyper::method::Method::Get;
1213
use hyper::server::{Request, Response};
1314

1415
static PHRASE: &'static [u8] = b"Benchmarking hyper vs others!";
1516

1617
fn request(url: hyper::Url) {
17-
let req = hyper::client::Request::get(url).unwrap();
18+
let req = hyper::client::Request::new(Get, url).unwrap();
1819
req.start().unwrap().send().unwrap().read_to_string().unwrap();
1920
}
2021

examples/client.rs

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ use std::os;
44
use std::io::stdout;
55
use std::io::util::copy;
66

7-
use hyper::Url;
8-
use hyper::client::Request;
7+
use hyper::Client;
98

109
fn main() {
1110
let args = os::args();
@@ -17,26 +16,17 @@ fn main() {
1716
}
1817
};
1918

20-
let url = match Url::parse(args[1].as_slice()) {
21-
Ok(url) => {
22-
println!("GET {}...", url)
23-
url
24-
},
25-
Err(e) => panic!("Invalid URL: {}", e)
26-
};
19+
let url = &*args[1];
2720

21+
let mut client = Client::new();
2822

29-
let req = match Request::get(url) {
30-
Ok(req) => req,
23+
let mut res = match client.get(url) {
24+
Ok(res) => res,
3125
Err(err) => panic!("Failed to connect: {}", err)
3226
};
3327

34-
let mut res = req
35-
.start().unwrap() // failure: Error writing Headers
36-
.send().unwrap(); // failure: Error reading Response head.
37-
3828
println!("Response: {}", res.status);
39-
println!("{}", res.headers);
29+
println!("Headers:\n{}", res.headers);
4030
match copy(&mut res, &mut stdout()) {
4131
Ok(..) => (),
4232
Err(e) => panic!("Stream failure: {}", e)

0 commit comments

Comments
 (0)