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 64 65 66 67 68 69 70
use reqwest::blocking::multipart; use reqwest::{Url, Method}; use crate::{FhttpError, Response, Result, ResponseHandler}; use crate::request_def::body::{Body, File}; use reqwest::header::HeaderMap; use std::time::Duration; pub struct Client; impl Client { pub fn new() -> Self { Client {} } pub fn exec( &self, method: Method, url: &str, headers: HeaderMap, body: Body, response_handler: Option<ResponseHandler>, timeout: Option<Duration>, ) -> Result<Response> { let client = reqwest::blocking::Client::new(); let url = Url::parse(&url) .map_err(|_| FhttpError::new(format!("Invalid URL: '{}'", url)))?; let mut req_builder = client .request(method, url) .headers(headers); if let Some(timeout) = timeout { req_builder = req_builder.timeout(timeout); } let req_builder = match body { Body::Plain(body) => req_builder.body(body), 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())))?; } 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 response_handler { Some(handler) => { handler.process_body(&text)? }, None => text }, false => text, }; Ok( Response::new( status, headers, body ) ) } }