mod background;
mod connect;
mod connection;
mod future;
pub use self::connect::{Connect, ConnectError, ConnectExecutor, ConnectFuture};
pub use self::connection::Connection;
pub use self::future::ResponseFuture;
pub use hyper::client::conn::Builder;
use crate::body::{Body, LiftBody};
use futures::{Async, Poll};
use http_body::Body as HttpBody;
use hyper::{
client::connect::Connect as HyperConnect,
client::{self, HttpConnector},
Request, Response,
};
use tower_service::Service;
#[derive(Clone, Debug)]
pub struct Client<C, B> {
inner: hyper::Client<C, LiftBody<B>>,
}
impl<B> Client<HttpConnector, B>
where
B: HttpBody + Send + 'static,
B::Data: Send,
B::Error: Into<crate::Error>,
{
pub fn new() -> Self {
let inner = hyper::Client::builder().build_http();
Client { inner }
}
}
impl<C, B> Client<C, B> {
pub fn with_client(inner: hyper::Client<C, LiftBody<B>>) -> Self {
Self { inner }
}
}
impl<C, B> Service<Request<B>> for Client<C, B>
where
C: HyperConnect + Sync + 'static,
C::Transport: 'static,
C::Future: 'static,
B: HttpBody + Send + 'static,
B::Data: Send,
B::Error: Into<crate::Error>,
{
type Response = Response<Body>;
type Error = hyper::Error;
type Future = ResponseFuture<client::ResponseFuture>;
fn poll_ready(&mut self) -> Poll<(), Self::Error> {
Ok(Async::Ready(()))
}
fn call(&mut self, req: Request<B>) -> Self::Future {
let inner = self.inner.request(req.map(LiftBody::from));
ResponseFuture { inner }
}
}