use std::time::Duration;
use rotor::{Scope, Time};
use recvmode::RecvMode;
use super::{Head, Request, ResponseError, ProtocolError};
use super::{Connection};
pub enum Task<M: Client> {
Sleep(M, Time),
Request(M, M::Requester),
Close,
}
pub trait Client: Sized {
type Requester: Requester;
type Seed: Clone + Sized;
fn create(seed: Self::Seed,
scope: &mut Scope<<Self::Requester as Requester>::Context>)
-> Self;
fn connection_idle(self,
connection: &Connection,
scope: &mut Scope<<Self::Requester as Requester>::Context>)
-> Task<Self>;
fn connection_error(self,
reason: &ProtocolError,
scope: &mut Scope<<Self::Requester as Requester>::Context>);
fn wakeup(self,
connection: &Connection,
scope: &mut Scope<<Self::Requester as Requester>::Context>)
-> Task<Self>;
fn timeout(self,
connection: &Connection,
scope: &mut Scope<<Self::Requester as Requester>::Context>)
-> Task<Self>;
fn connect_timeout(&self,
_scope: &mut Scope<<Self::Requester as Requester>::Context>)
-> Duration
{
Duration::new(15, 0)
}
fn idle_timeout(&self,
_scope: &mut Scope<<Self::Requester as Requester>::Context>)
-> Duration
{
Duration::new(120, 0)
}
}
pub trait Requester: Sized {
type Context;
fn prepare_request(self, req: &mut Request,
scope: &mut Scope<Self::Context>) -> Option<Self>;
fn headers_received(self, head: Head, request: &mut Request,
scope: &mut Scope<Self::Context>)
-> Option<(Self, RecvMode, Time)>;
fn response_received(self, data: &[u8], request: &mut Request,
scope: &mut Scope<Self::Context>);
fn bad_response(self, _error: &ResponseError,
_scope: &mut Scope<Self::Context>)
{}
fn response_chunk(self, chunk: &[u8], request: &mut Request,
scope: &mut Scope<Self::Context>)
-> Option<Self>;
fn response_end(self, request: &mut Request,
scope: &mut Scope<Self::Context>);
fn timeout(self, request: &mut Request, scope: &mut Scope<Self::Context>)
-> Option<(Self, Time)>;
fn wakeup(self, request: &mut Request, scope: &mut Scope<Self::Context>)
-> Option<Self>;
fn byte_timeout(&self, _scope: &mut Scope<Self::Context>) -> Duration {
Duration::new(120, 0)
}
}