2017-07-25 1 views
1

Comment définir un délai d'attente pour la requête HTTP à l'aide d'Hyper (> = 0.11) asynchrone?Comment définir le délai d'expiration de la requête HTTP avec hyper, tokio et futures dans Rust?

Voici l'exemple du code sans délai:

extern crate hyper; 
extern crate tokio_core; 
extern crate futures; 

use futures::Future; 
use hyper::Client; 
use tokio_core::reactor::Core; 

fn main() { 
    let mut core = Core::new().unwrap(); 
    let client = Client::new(&core.handle()); 

    let uri = "http://stackoverflow.com".parse().unwrap(); 
    let work = client.get(uri).map(|res| { 
     res.status() 
    }); 

    match core.run(work) { 
     Ok(status) => println!("Status: {}", status), 
     Err(e) => println!("Error: {:?}", e) 
    } 
} 

Répondre

1

répondre à ma propre question avec un exemple de code de travail, basé sur le lien fourni par seanmonstar au Hyper Guide/General Timeout:

extern crate hyper; 
extern crate tokio_core; 
extern crate futures; 

use futures::Future; 
use futures::future::Either; 
use hyper::Client; 
use tokio_core::reactor::Core; 
use std::time::Duration; 
use std::io; 

fn main() { 
    let mut core = Core::new().unwrap(); 
    let handle = core.handle(); 
    let client = Client::new(&handle); 

    let uri: hyper::Uri = "http://stackoverflow.com".parse().unwrap(); 
    let request = client.get(uri.clone()).map(|res| res.status()); 

    let timeout = tokio_core::reactor::Timeout::new(Duration::from_millis(170), &handle).unwrap(); 

    let work = request.select2(timeout).then(|res| match res { 
     Ok(Either::A((got, _timeout))) => Ok(got), 
     Ok(Either::B((_timeout_error, _get))) => { 
      Err(hyper::Error::Io(io::Error::new(
       io::ErrorKind::TimedOut, 
       "Client timed out while connecting", 
      ))) 
     } 
     Err(Either::A((get_error, _timeout))) => Err(get_error), 
     Err(Either::B((timeout_error, _get))) => Err(From::from(timeout_error)), 
    }); 

    match core.run(work) { 
     Ok(status) => println!("OK: {:?}", status), 
     Err(e) => println!("Error: {:?}", e) 
    } 
}