use body::Body;
use error::Error;
use futures::executor;
use futures::prelude::*;
use http::{self, Request, Response};
use internal::agent;
use internal::request;
use options::*;
#[derive(Clone, Default)]
pub struct ClientBuilder {
default_options: Options,
}
impl ClientBuilder {
pub fn options(&mut self, options: Options) -> &mut Self {
self.default_options = options;
self
}
pub fn build(&self) -> Result<Client, Error> {
let agent = agent::create()?;
Ok(Client {
agent: agent,
default_options: self.default_options.clone(),
})
}
}
pub struct Client {
agent: agent::Handle,
default_options: Options,
}
impl Client {
pub fn new() -> Result<Self, Error> {
Self::builder().build()
}
pub fn builder() -> ClientBuilder {
ClientBuilder::default()
}
pub fn get<U>(&self, uri: U) -> Result<Response<Body>, Error> where http::Uri: http::HttpTryFrom<U> {
let request = http::Request::get(uri).body(Body::default())?;
self.send(request)
}
pub fn head<U>(&self, uri: U) -> Result<Response<Body>, Error> where http::Uri: http::HttpTryFrom<U> {
let request = http::Request::head(uri).body(Body::default())?;
self.send(request)
}
pub fn post<U>(&self, uri: U, body: impl Into<Body>) -> Result<Response<Body>, Error> where http::Uri: http::HttpTryFrom<U> {
let request = http::Request::post(uri).body(body)?;
self.send(request)
}
pub fn put<U>(&self, uri: U, body: impl Into<Body>) -> Result<Response<Body>, Error> where http::Uri: http::HttpTryFrom<U> {
let request = http::Request::put(uri).body(body)?;
self.send(request)
}
pub fn delete<U>(&self, uri: U) -> Result<Response<Body>, Error> where http::Uri: http::HttpTryFrom<U> {
let request = http::Request::delete(uri).body(Body::default())?;
self.send(request)
}
pub fn send<B: Into<Body>>(&self, request: Request<B>) -> Result<Response<Body>, Error> {
executor::block_on(self.send_async(request))
}
fn send_async<B: Into<Body>>(&self, request: Request<B>) -> impl Future<Item=Response<Body>, Error=Error> {
return request::create(request, &self.default_options)
.and_then(|(request, future)| {
self.agent.begin_execute(request).map(|_| future)
})
.into_future()
.flatten();
}
}