-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(lib): redesign API to use Futures and Tokio
There are many changes involved with this, but let's just talk about user-facing changes. - Creating a `Client` and `Server` now needs a Tokio `Core` event loop to attach to. - `Request` and `Response` both no longer implement the `std::io::{Read,Write}` traits, but instead represent their bodies as a `futures::Stream` of items, where each item is a `Chunk`. - The `Client.request` method now takes a `Request`, instead of being used as a builder, and returns a `Future` that resolves to `Response`. - The `Handler` trait for servers is no more, and instead the Tokio `Service` trait is used. This allows interoperability with generic middleware. BREAKING CHANGE: A big sweeping set of breaking changes.
- Loading branch information
1 parent
e236891
commit 2d2d557
Showing
43 changed files
with
2,724 additions
and
4,982 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7,49 +7,34 @@ readme = "README.md" | |
documentation = "http://hyperium.github.io/hyper" | ||
repository = "https://github.com/hyperium/hyper" | ||
license = "MIT" | ||
authors = ["Sean McArthur <[email protected]>", | ||
"Jonathan Reem <[email protected]>"] | ||
authors = ["Sean McArthur <[email protected]>"] | ||
keywords = ["http", "hyper", "hyperium"] | ||
|
||
[dependencies] | ||
futures = "0.1.7" | ||
futures-cpupool = "0.1" | ||
httparse = "1.0" | ||
language-tags = "0.2" | ||
log = "0.3" | ||
mime = "0.2" | ||
rotor = "0.6" | ||
relay = "0.1" | ||
rustc-serialize = "0.3" | ||
spmc = "0.2" | ||
time = "0.1" | ||
tokio-core = "0.1" | ||
tokio-proto = "0.1" | ||
tokio-service = "0.1" | ||
unicase = "1.0" | ||
url = "1.0" | ||
vecio = "0.1" | ||
|
||
[dependencies.cookie] | ||
version = "0.3" | ||
default-features = false | ||
|
||
[dependencies.openssl] | ||
version = "0.7" | ||
optional = true | ||
|
||
[dependencies.openssl-verify] | ||
version = "0.1" | ||
optional = true | ||
|
||
[dependencies.security-framework] | ||
version = "0.1.4" | ||
optional = true | ||
|
||
[dependencies.serde] | ||
version = "0.8" | ||
optional = true | ||
|
||
[dev-dependencies] | ||
env_logger = "0.3" | ||
num_cpus = "1.0" | ||
pretty_env_logger = "0.1" | ||
spmc = "0.2" | ||
|
||
[features] | ||
default = ["ssl"] | ||
ssl = ["openssl", "openssl-verify"] | ||
serde-serialization = ["serde", "mime/serde"] | ||
default = [] | ||
nightly = [] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
#![feature(test)] | ||
|
||
extern crate futures; | ||
extern crate hyper; | ||
extern crate tokio_core; | ||
|
||
extern crate test; | ||
|
||
use futures::{Future, Stream}; | ||
use tokio_core::reactor::Core; | ||
|
||
use hyper::header::{ContentLength, ContentType}; | ||
use hyper::server::{Service, Request, Response}; | ||
|
||
|
||
#[bench] | ||
fn one_request_at_a_time(b: &mut test::Bencher) { | ||
extern crate pretty_env_logger; | ||
let _ = pretty_env_logger::init(); | ||
let mut core = Core::new().unwrap(); | ||
let handle = core.handle(); | ||
|
||
let addr = hyper::Server::http(&"127.0.0.1:0".parse().unwrap(), &handle).unwrap() | ||
.handle(|| Ok(Hello), &handle).unwrap(); | ||
|
||
let mut client = hyper::Client::new(&handle); | ||
|
||
let url: hyper::Url = format!("http://{}/get", addr).parse().unwrap(); | ||
|
||
b.bytes = 160; | ||
b.iter(move || { | ||
let work = client.get(url.clone()).and_then(|res| { | ||
res.body().for_each(|_chunk| { | ||
Ok(()) | ||
}) | ||
}); | ||
|
||
core.run(work).unwrap(); | ||
}); | ||
} | ||
|
||
static PHRASE: &'static [u8] = b"Hello, World!"; | ||
|
||
#[derive(Clone, Copy)] | ||
struct Hello; | ||
|
||
impl Service for Hello { | ||
type Request = Request; | ||
type Response = Response; | ||
type Error = hyper::Error; | ||
type Future = ::futures::Finished<Response, hyper::Error>; | ||
fn call(&mut self, _req: Request) -> Self::Future { | ||
::futures::finished( | ||
Response::new() | ||
.with_header(ContentLength(PHRASE.len() as u64)) | ||
.with_header(ContentType::plaintext()) | ||
.with_body(PHRASE) | ||
) | ||
} | ||
|
||
} |
Oops, something went wrong.