use actix_web::{HttpRequest, web::Json, HttpResponse};
use reqwest::header::HeaderMap;
use serde_json::Value;
use crate::dto::error::Error;
pub fn convert_actix_request_to_reqwest(inbound_request: &HttpRequest, body: &Value) -> Result<reqwest::RequestBuilder, Error> {
let mut headers: HeaderMap = HeaderMap::new();
for header in inbound_request.headers()
{headers.append(header.0, header.1.to_owned());}
let client = reqwest::Client::new();
let url = inbound_request.uri().to_string();
let request_to_be_sent = client
.request(inbound_request.method().to_owned(), url)
.headers(headers)
.json(&Json(body));
Ok(request_to_be_sent)
}
pub async fn forward_reqwest(request: reqwest::RequestBuilder) -> Result<HttpResponse, Error> {
let response = match request.send().await {
Ok(response) => response,
Err(e) => return Err(Error::ClientError(e))
};
let mut response_build = &mut HttpResponse::build(actix_web::http::StatusCode::from_u16(response.status().as_u16()).unwrap());
for header in response.headers() {
response_build = response_build.append_header(header);
}
let response_to_return = match response.json::<Value>().await {
Ok(json) => {
response_build.json(json)},
Err(_e) => {response_build.finish()}
};
Ok(response_to_return)
}