@O01eg, Скомпилируй, плиз!
use std::env;
use std::io::{self, Write};
use hyper::rt::{Future, Stream};
use hyper::Client;
fn main() {
pretty_env_logger::init();
let url = match env::args().nth(1) {
Some(url) => url,
None => {
println!("Usage: client <url>");
return;
}
};
hyper::rt::run(fetch(&url));
}
fn fetch(url: &str) -> impl Future<Item = (), Error = ()> {
let url = url.parse::<hyper::Uri>().unwrap();
if url.scheme_part().map(|s| s.as_ref()) != Some("http") {
fetch_https(url)
} else {
fetch_http(url)
}
}
fn fetch_https(url: http::uri::Uri) -> impl Future<Item = (), Error = ()> {
let https = hyper_tls::HttpsConnector::new(4).unwrap();
let client = hyper::Client::builder().build::<_, hyper::Body>(https);
client_handle(&client, url)
}
fn fetch_http(url: http::uri::Uri) -> impl Future<Item = (), Error = ()> {
let client = Client::new();
client_handle(&client, url)
}
fn client_handle<'a, T: 'static>(
client: &'a Client<T>,
url: http::uri::Uri,
) -> impl Future<Item = (), Error = ()>
where
T: hyper::client::connect::Connect,
{
client
.get(url)
.and_then(|res| {
println!("Response: {}", res.status());
println!("Headers: {:#?}", res.headers());
if res.status() == 302 {
let location: &str = res.headers()[http::header::LOCATION].to_str().unwrap();
fetch(location)
} else {
res.into_body().for_each(|chunk| {
io::stdout()
.write_all(&chunk)
.map_err(|e| panic!("example expects stdout is open, err={}", e))
})
}
})
.map(|_| {
println!("\n\nDone");
})
.map_err(|err| {
eprintln!("Error {}", err);
})
}