1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
use reqwest::Url; use reqwest::blocking::multipart; use crate::{Result, FhttpError, Response, Request, RequestResponseHandlerExt}; use crate::request::body::{Body, File}; use crate::request::has_body::HasBody; pub struct Client; impl Client { pub fn new() -> Self { Client {} } pub fn exec( &self, request: Request ) -> Result<Response> { let client = reqwest::blocking::Client::new(); let url = request.url()?; let url = Url::parse(url) .map_err(|_| FhttpError::new(format!("Invalid URL: '{}'", url)))?; let req_body = request.body()?; let req_builder = client .request(request.method()?, url) .headers(request.headers()?); let req_builder = match req_body { Body::Plain(body) => req_builder.body(body.into_owned()), Body::Files(files) => { let mut multipart = multipart::Form::new(); for File { name, path } in files { multipart = multipart.file(name, path.clone()) .map_err(|_| FhttpError::new(format!("Error opening file {}", path.to_str().unwrap())))?; } req_builder.multipart(multipart) }, }; let response = req_builder.send()?; let status = response.status(); let headers = response.headers().clone(); let text = response.text().unwrap(); let body = match status.is_success() { true => match request.response_handler()? { Some(handler) => { handler.process_body(&text)? }, None => text }, false => text, }; Ok( Response::new( status, headers, body ) ) } }