use client::{Client, Response};
use config::ClientConfig;
use error::Error;
use request::Request;
use std::io::Read;
pub struct DirectClient {
config: ClientConfig,
}
impl DirectClient {
pub fn new() -> Self {
DirectClient {
config: ClientConfig::default(),
}
}
}
impl Client for DirectClient {
fn execute(&self, config: Option<&ClientConfig>, request: Request) -> Result<Response, Error> {
debug!(
"DirectClient performing {} request of URL: {}",
request.header.method, request.header.url
);
trace!("request headers: {:?}", request.header.headers);
let config = config.unwrap_or_else(|| &self.config);
let mut client_builder = ::reqwest::blocking::Client::builder()
.gzip(config.gzip)
.redirect(config.redirect.clone().into())
.referer(config.referer);
if let Some(timeout) = config.timeout.clone() {
client_builder = client_builder.timeout(timeout);
}
let client = client_builder.build()?;
let mut builder = client.request(request.header.method, request.header.url);
if let Some(body) = request.body {
builder = builder.body(::reqwest::blocking::Body::from(body));
}
let mut response = builder.send()?;
Ok(Response {
url: response.url().clone(),
status: response.status().clone(),
headers: response.headers().clone(),
body: {
let mut buf = Vec::<u8>::new();
response.read_to_end(&mut buf)?;
buf
},
})
}
fn config(&self) -> &ClientConfig {
&self.config
}
fn config_mut(&mut self) -> &mut ClientConfig {
&mut self.config
}
}