Use retry crate to retry http requests, since the hyper connection may be closed when we try to use it.
This commit is contained in:
parent
6c9adc161f
commit
89e3d91f54
@ -9,3 +9,4 @@ env_logger = "0.4.0"
|
|||||||
lru-cache = "0.1.0"
|
lru-cache = "0.1.0"
|
||||||
select = "0.3.0"
|
select = "0.3.0"
|
||||||
hyper = "0.10.4"
|
hyper = "0.10.4"
|
||||||
|
retry = { git = "https://github.com/jimmycuadra/retry", rev = "3fa812e650d64ede61ea243fb83ef1a222ff0f84" }
|
||||||
|
18
src/lib.rs
18
src/lib.rs
@ -1,16 +1,22 @@
|
|||||||
extern crate lru_cache;
|
extern crate lru_cache;
|
||||||
extern crate hyper;
|
extern crate hyper;
|
||||||
extern crate select;
|
extern crate select;
|
||||||
|
extern crate retry;
|
||||||
|
|
||||||
pub mod pirates;
|
pub mod pirates;
|
||||||
pub mod ninjas;
|
pub mod ninjas;
|
||||||
mod parser;
|
mod parser;
|
||||||
|
//mod retry;
|
||||||
|
|
||||||
|
#[macro_use]
|
||||||
|
extern crate log;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum Error {
|
pub enum Error {
|
||||||
Http(hyper::error::Error),
|
Http(hyper::error::Error),
|
||||||
Io(std::io::Error),
|
Io(std::io::Error),
|
||||||
Parse(String)
|
Parse(String),
|
||||||
|
Unknown(String)
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<hyper::error::Error> for Error {
|
impl From<hyper::error::Error> for Error {
|
||||||
@ -31,6 +37,16 @@ impl From<std::num::ParseIntError> for Error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<retry::Error<Error>> for Error {
|
||||||
|
fn from (err: retry::Error<Error>) -> Error {
|
||||||
|
match err {
|
||||||
|
retry::Error::Operation { error, total_delay, tries } => {
|
||||||
|
error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub trait Fighter {
|
pub trait Fighter {
|
||||||
fn power (&self) -> u8;
|
fn power (&self) -> u8;
|
||||||
}
|
}
|
||||||
|
@ -2,11 +2,17 @@ use lru_cache::LruCache;
|
|||||||
use hyper::client::Client;
|
use hyper::client::Client;
|
||||||
use select::document::Document;
|
use select::document::Document;
|
||||||
|
|
||||||
|
use retry::retry;
|
||||||
|
use retry::delay::Fixed;
|
||||||
|
|
||||||
use std::io::Read;
|
use std::io::Read;
|
||||||
|
|
||||||
use {Error, Fighter};
|
use {Error, Fighter};
|
||||||
use parser::Parser;
|
use parser::Parser;
|
||||||
|
|
||||||
|
const NUM_RETRIES: usize = 10;
|
||||||
|
const RETRY_WAIT_MILLIS: u64 = 500;
|
||||||
|
|
||||||
pub struct Ninjas {
|
pub struct Ninjas {
|
||||||
cache: LruCache<String, Ninja>,
|
cache: LruCache<String, Ninja>,
|
||||||
client: Client
|
client: Client
|
||||||
@ -29,7 +35,7 @@ impl Ninjas {
|
|||||||
return Result::Ok(self.cache.get_mut(name).unwrap())
|
return Result::Ok(self.cache.get_mut(name).unwrap())
|
||||||
}
|
}
|
||||||
|
|
||||||
let ninja = self.get_by_name(name)?;
|
let ninja = retry(Fixed::from_millis(RETRY_WAIT_MILLIS).take(NUM_RETRIES), || self.get_by_name(name))?;
|
||||||
self.cache.insert(String::from(name), ninja);
|
self.cache.insert(String::from(name), ninja);
|
||||||
Result::Ok(self.cache.get_mut(name).unwrap())
|
Result::Ok(self.cache.get_mut(name).unwrap())
|
||||||
}
|
}
|
||||||
|
@ -2,11 +2,17 @@ use lru_cache::LruCache;
|
|||||||
use hyper::client::Client;
|
use hyper::client::Client;
|
||||||
use select::document::Document;
|
use select::document::Document;
|
||||||
|
|
||||||
|
use retry::retry;
|
||||||
|
use retry::delay::Fixed;
|
||||||
|
|
||||||
use std::io::Read;
|
use std::io::Read;
|
||||||
|
|
||||||
use {Error, Fighter};
|
use {Error, Fighter};
|
||||||
use parser::Parser;
|
use parser::Parser;
|
||||||
|
|
||||||
|
const NUM_RETRIES: usize = 10;
|
||||||
|
const RETRY_WAIT_MILLIS: u64 = 500;
|
||||||
|
|
||||||
pub struct Pirates {
|
pub struct Pirates {
|
||||||
cache: LruCache<String, Pirate>,
|
cache: LruCache<String, Pirate>,
|
||||||
client: Client
|
client: Client
|
||||||
@ -29,7 +35,7 @@ impl Pirates {
|
|||||||
return Result::Ok(self.cache.get_mut(name).unwrap())
|
return Result::Ok(self.cache.get_mut(name).unwrap())
|
||||||
}
|
}
|
||||||
|
|
||||||
let pirate = self.get_by_name(name)?;
|
let pirate = retry(Fixed::from_millis(RETRY_WAIT_MILLIS).take(NUM_RETRIES), || self.get_by_name(name))?;
|
||||||
self.cache.insert(String::from(name), pirate);
|
self.cache.insert(String::from(name), pirate);
|
||||||
Result::Ok(self.cache.get_mut(name).unwrap())
|
Result::Ok(self.cache.get_mut(name).unwrap())
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user