From 89e3d91f54c7d2143c288081773e2c695e1c15b8 Mon Sep 17 00:00:00 2001 From: Adrian Malacoda Date: Sun, 12 Mar 2017 15:49:16 -0500 Subject: [PATCH] Use retry crate to retry http requests, since the hyper connection may be closed when we try to use it. --- Cargo.toml | 1 + src/lib.rs | 18 +++++++++++++++++- src/ninjas.rs | 8 +++++++- src/pirates.rs | 8 +++++++- 4 files changed, 32 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 2317416..d7e0fc7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,3 +9,4 @@ env_logger = "0.4.0" lru-cache = "0.1.0" select = "0.3.0" hyper = "0.10.4" +retry = { git = "https://github.com/jimmycuadra/retry", rev = "3fa812e650d64ede61ea243fb83ef1a222ff0f84" } diff --git a/src/lib.rs b/src/lib.rs index 804983e..1452182 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,16 +1,22 @@ extern crate lru_cache; extern crate hyper; extern crate select; +extern crate retry; pub mod pirates; pub mod ninjas; mod parser; +//mod retry; + +#[macro_use] +extern crate log; #[derive(Debug)] pub enum Error { Http(hyper::error::Error), Io(std::io::Error), - Parse(String) + Parse(String), + Unknown(String) } impl From for Error { @@ -31,6 +37,16 @@ impl From for Error { } } +impl From> for Error { + fn from (err: retry::Error) -> Error { + match err { + retry::Error::Operation { error, total_delay, tries } => { + error + } + } + } +} + pub trait Fighter { fn power (&self) -> u8; } diff --git a/src/ninjas.rs b/src/ninjas.rs index 5c59d8c..8b60693 100644 --- a/src/ninjas.rs +++ b/src/ninjas.rs @@ -2,11 +2,17 @@ use lru_cache::LruCache; use hyper::client::Client; use select::document::Document; +use retry::retry; +use retry::delay::Fixed; + use std::io::Read; use {Error, Fighter}; use parser::Parser; +const NUM_RETRIES: usize = 10; +const RETRY_WAIT_MILLIS: u64 = 500; + pub struct Ninjas { cache: LruCache, client: Client @@ -29,7 +35,7 @@ impl Ninjas { 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); Result::Ok(self.cache.get_mut(name).unwrap()) } diff --git a/src/pirates.rs b/src/pirates.rs index 0be5ca5..bc9a1e9 100644 --- a/src/pirates.rs +++ b/src/pirates.rs @@ -2,11 +2,17 @@ use lru_cache::LruCache; use hyper::client::Client; use select::document::Document; +use retry::retry; +use retry::delay::Fixed; + use std::io::Read; use {Error, Fighter}; use parser::Parser; +const NUM_RETRIES: usize = 10; +const RETRY_WAIT_MILLIS: u64 = 500; + pub struct Pirates { cache: LruCache, client: Client @@ -29,7 +35,7 @@ impl Pirates { 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); Result::Ok(self.cache.get_mut(name).unwrap()) }