Skip to content

Commit

Permalink
feat(lib): redesign API to use Futures and Tokio
Browse files Browse the repository at this point in the history
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
seanmonstar committed Jan 16, 2017
1 parent e236891 commit 2d2d557
Show file tree
Hide file tree
Showing 43 changed files with 2,724 additions and 4,982 deletions.
5 changes: 0 additions & 5 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,10 @@ language: rust
matrix:
fast_finish: true
include:
- os: osx
rust: stable
env: FEATURES="--no-default-features --features security-framework"
- rust: nightly
env: FEATURES="--features nightly"
- rust: beta
- rust: stable
- rust: stable
env: FEATURES="--no-default-features"

cache:
apt: true
Expand Down
35 changes: 10 additions & 25 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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 = []
61 changes: 61 additions & 0 deletions benches/end_to_end.rs
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)
)
}

}
Loading

0 comments on commit 2d2d557

Please sign in to comment.