A Cargo feature `runtime` is added, which is enabled by default, that includes the following: - The `client::HttpConnector`, which uses `tokio::net::TcpStream`. - The `server::AddrStream`, which uses `tokio::net::TcpListener`. - The `hyper::rt` module, which includes useful utilities to work with the runtime without needing to import `futures` or `tokio` explicity. Disabling the feature removes many of these niceties, but allows people to use hyper in environments that have an alternative runtime, without needing to download an unused one.
49 lines
1.2 KiB
Rust
49 lines
1.2 KiB
Rust
#![deny(warnings)]
|
|
extern crate hyper;
|
|
extern crate pretty_env_logger;
|
|
|
|
use std::env;
|
|
use std::io::{self, Write};
|
|
|
|
use hyper::{Body, Client, Request};
|
|
use hyper::rt::{self, Future, Stream};
|
|
|
|
fn main() {
|
|
pretty_env_logger::init();
|
|
|
|
let url = match env::args().nth(1) {
|
|
Some(url) => url,
|
|
None => {
|
|
println!("Usage: client <url>");
|
|
return;
|
|
}
|
|
};
|
|
|
|
let url = url.parse::<hyper::Uri>().unwrap();
|
|
if url.scheme_part().map(|s| s.as_ref()) != Some("http") {
|
|
println!("This example only works with 'http' URLs.");
|
|
return;
|
|
}
|
|
|
|
rt::run(rt::lazy(move || {
|
|
let client = Client::new();
|
|
|
|
let mut req = Request::new(Body::empty());
|
|
*req.uri_mut() = url;
|
|
|
|
client.request(req).and_then(|res| {
|
|
println!("Response: {}", res.status());
|
|
println!("Headers: {:#?}", res.headers());
|
|
|
|
res.into_body().for_each(|chunk| {
|
|
io::stdout().write_all(&chunk)
|
|
.map_err(|e| panic!("example expects stdout is open, error={}", e))
|
|
})
|
|
}).map(|_| {
|
|
println!("\n\nDone.");
|
|
}).map_err(|err| {
|
|
eprintln!("Error {}", err);
|
|
})
|
|
}));
|
|
}
|