mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-31 01:57:45 +08:00
refactor: move Request and RequestBuilder structs to common_utils crate (#2145)
This commit is contained in:
11
Cargo.lock
generated
11
Cargo.lock
generated
@ -497,9 +497,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "async-channel"
|
name = "async-channel"
|
||||||
version = "1.8.0"
|
version = "1.9.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833"
|
checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"concurrent-queue",
|
"concurrent-queue",
|
||||||
"event-listener",
|
"event-listener",
|
||||||
@ -1464,6 +1464,7 @@ dependencies = [
|
|||||||
"fake",
|
"fake",
|
||||||
"futures",
|
"futures",
|
||||||
"hex",
|
"hex",
|
||||||
|
"http",
|
||||||
"masking",
|
"masking",
|
||||||
"md5",
|
"md5",
|
||||||
"nanoid",
|
"nanoid",
|
||||||
@ -1473,6 +1474,7 @@ dependencies = [
|
|||||||
"quick-xml",
|
"quick-xml",
|
||||||
"rand 0.8.5",
|
"rand 0.8.5",
|
||||||
"regex",
|
"regex",
|
||||||
|
"reqwest",
|
||||||
"ring",
|
"ring",
|
||||||
"router_env",
|
"router_env",
|
||||||
"serde",
|
"serde",
|
||||||
@ -1480,6 +1482,7 @@ dependencies = [
|
|||||||
"serde_urlencoded",
|
"serde_urlencoded",
|
||||||
"signal-hook",
|
"signal-hook",
|
||||||
"signal-hook-tokio",
|
"signal-hook-tokio",
|
||||||
|
"strum 0.24.1",
|
||||||
"test-case",
|
"test-case",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"time 0.3.22",
|
"time 0.3.22",
|
||||||
@ -2080,9 +2083,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fake"
|
name = "fake"
|
||||||
version = "2.6.1"
|
version = "2.8.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0a44c765350db469b774425ff1c833890b16ceb9612fb5d7c4bbdf4a1b55f876"
|
checksum = "9af7b0c58ac9d03169e27f080616ce9f64004edca3d2ef4147a811c21b23b319"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"rand 0.8.5",
|
"rand 0.8.5",
|
||||||
"unidecode",
|
"unidecode",
|
||||||
|
|||||||
@ -19,17 +19,20 @@ diesel = "2.1.0"
|
|||||||
error-stack = "0.3.1"
|
error-stack = "0.3.1"
|
||||||
futures = { version = "0.3.28", optional = true }
|
futures = { version = "0.3.28", optional = true }
|
||||||
hex = "0.4.3"
|
hex = "0.4.3"
|
||||||
|
http = "0.2.9"
|
||||||
md5 = "0.7.0"
|
md5 = "0.7.0"
|
||||||
nanoid = "0.4.0"
|
nanoid = "0.4.0"
|
||||||
once_cell = "1.18.0"
|
once_cell = "1.18.0"
|
||||||
quick-xml = { version = "0.28.2", features = ["serialize"] }
|
quick-xml = { version = "0.28.2", features = ["serialize"] }
|
||||||
rand = "0.8.5"
|
rand = "0.8.5"
|
||||||
regex = "1.8.4"
|
regex = "1.8.4"
|
||||||
|
reqwest = { version = "0.11.18", features = ["json", "native-tls", "gzip", "multipart"] }
|
||||||
ring = { version = "0.16.20", features = ["std"] }
|
ring = { version = "0.16.20", features = ["std"] }
|
||||||
serde = { version = "1.0.163", features = ["derive"] }
|
serde = { version = "1.0.163", features = ["derive"] }
|
||||||
serde_json = "1.0.96"
|
serde_json = "1.0.96"
|
||||||
serde_urlencoded = "0.7.1"
|
serde_urlencoded = "0.7.1"
|
||||||
signal-hook = { version = "0.3.15", optional = true }
|
signal-hook = { version = "0.3.15", optional = true }
|
||||||
|
strum = { version = "0.24.1", features = ["derive"] }
|
||||||
thiserror = "1.0.40"
|
thiserror = "1.0.40"
|
||||||
time = { version = "0.3.21", features = ["serde", "serde-well-known", "std"] }
|
time = { version = "0.3.21", features = ["serde", "serde-well-known", "std"] }
|
||||||
tokio = { version = "1.28.2", features = ["macros", "rt-multi-thread"], optional = true }
|
tokio = { version = "1.28.2", features = ["macros", "rt-multi-thread"], optional = true }
|
||||||
|
|||||||
@ -9,6 +9,8 @@ pub mod errors;
|
|||||||
pub mod ext_traits;
|
pub mod ext_traits;
|
||||||
pub mod fp_utils;
|
pub mod fp_utils;
|
||||||
pub mod pii;
|
pub mod pii;
|
||||||
|
#[allow(missing_docs)] // Todo: add docs
|
||||||
|
pub mod request;
|
||||||
#[cfg(feature = "signals")]
|
#[cfg(feature = "signals")]
|
||||||
pub mod signals;
|
pub mod signals;
|
||||||
pub mod validation;
|
pub mod validation;
|
||||||
|
|||||||
206
crates/common_utils/src/request.rs
Normal file
206
crates/common_utils/src/request.rs
Normal file
@ -0,0 +1,206 @@
|
|||||||
|
use masking::{Maskable, Secret};
|
||||||
|
#[cfg(feature = "logs")]
|
||||||
|
use router_env::logger;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
use crate::errors;
|
||||||
|
|
||||||
|
pub type Headers = std::collections::HashSet<(String, Maskable<String>)>;
|
||||||
|
|
||||||
|
#[derive(
|
||||||
|
Clone, Copy, Debug, Eq, PartialEq, Deserialize, Serialize, strum::Display, strum::EnumString,
|
||||||
|
)]
|
||||||
|
#[serde(rename_all = "UPPERCASE")]
|
||||||
|
#[strum(serialize_all = "UPPERCASE")]
|
||||||
|
pub enum Method {
|
||||||
|
Get,
|
||||||
|
Post,
|
||||||
|
Put,
|
||||||
|
Delete,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Serialize, Debug)]
|
||||||
|
pub enum ContentType {
|
||||||
|
Json,
|
||||||
|
FormUrlEncoded,
|
||||||
|
FormData,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn default_request_headers() -> [(String, Maskable<String>); 1] {
|
||||||
|
use http::header;
|
||||||
|
|
||||||
|
[(header::VIA.to_string(), "HyperSwitch".to_string().into())]
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct Request {
|
||||||
|
pub url: String,
|
||||||
|
pub headers: Headers,
|
||||||
|
pub payload: Option<Secret<String>>,
|
||||||
|
pub method: Method,
|
||||||
|
pub content_type: Option<ContentType>,
|
||||||
|
pub certificate: Option<String>,
|
||||||
|
pub certificate_key: Option<String>,
|
||||||
|
pub form_data: Option<reqwest::multipart::Form>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Request {
|
||||||
|
pub fn new(method: Method, url: &str) -> Self {
|
||||||
|
Self {
|
||||||
|
method,
|
||||||
|
url: String::from(url),
|
||||||
|
headers: std::collections::HashSet::new(),
|
||||||
|
payload: None,
|
||||||
|
content_type: None,
|
||||||
|
certificate: None,
|
||||||
|
certificate_key: None,
|
||||||
|
form_data: None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_body(&mut self, body: String) {
|
||||||
|
self.payload = Some(body.into());
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn add_default_headers(&mut self) {
|
||||||
|
self.headers.extend(default_request_headers());
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn add_header(&mut self, header: &str, value: Maskable<String>) {
|
||||||
|
self.headers.insert((String::from(header), value));
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn add_content_type(&mut self, content_type: ContentType) {
|
||||||
|
self.content_type = Some(content_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn add_certificate(&mut self, certificate: Option<String>) {
|
||||||
|
self.certificate = certificate;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn add_certificate_key(&mut self, certificate_key: Option<String>) {
|
||||||
|
self.certificate = certificate_key;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_form_data(&mut self, form_data: reqwest::multipart::Form) {
|
||||||
|
self.form_data = Some(form_data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct RequestBuilder {
|
||||||
|
pub url: String,
|
||||||
|
pub headers: Headers,
|
||||||
|
pub payload: Option<Secret<String>>,
|
||||||
|
pub method: Method,
|
||||||
|
pub content_type: Option<ContentType>,
|
||||||
|
pub certificate: Option<String>,
|
||||||
|
pub certificate_key: Option<String>,
|
||||||
|
pub form_data: Option<reqwest::multipart::Form>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RequestBuilder {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self {
|
||||||
|
method: Method::Get,
|
||||||
|
url: String::with_capacity(1024),
|
||||||
|
headers: std::collections::HashSet::new(),
|
||||||
|
payload: None,
|
||||||
|
content_type: None,
|
||||||
|
certificate: None,
|
||||||
|
certificate_key: None,
|
||||||
|
form_data: None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn url(mut self, url: &str) -> Self {
|
||||||
|
self.url = url.into();
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn method(mut self, method: Method) -> Self {
|
||||||
|
self.method = method;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn attach_default_headers(mut self) -> Self {
|
||||||
|
self.headers.extend(default_request_headers());
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn header(mut self, header: &str, value: &str) -> Self {
|
||||||
|
self.headers.insert((header.into(), value.into()));
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn headers(mut self, headers: Vec<(String, Maskable<String>)>) -> Self {
|
||||||
|
let mut h = headers.into_iter().map(|(h, v)| (h, v));
|
||||||
|
self.headers.extend(&mut h);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn form_data(mut self, form_data: Option<reqwest::multipart::Form>) -> Self {
|
||||||
|
self.form_data = form_data;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn body(mut self, option_body: Option<RequestBody>) -> Self {
|
||||||
|
self.payload = option_body.map(RequestBody::get_inner_value);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn content_type(mut self, content_type: ContentType) -> Self {
|
||||||
|
self.content_type = Some(content_type);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn add_certificate(mut self, certificate: Option<String>) -> Self {
|
||||||
|
self.certificate = certificate;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn add_certificate_key(mut self, certificate_key: Option<String>) -> Self {
|
||||||
|
self.certificate_key = certificate_key;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn build(self) -> Request {
|
||||||
|
Request {
|
||||||
|
method: self.method,
|
||||||
|
url: self.url,
|
||||||
|
headers: self.headers,
|
||||||
|
payload: self.payload,
|
||||||
|
content_type: self.content_type,
|
||||||
|
certificate: self.certificate,
|
||||||
|
certificate_key: self.certificate_key,
|
||||||
|
form_data: self.form_data,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for RequestBuilder {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct RequestBody(Secret<String>);
|
||||||
|
|
||||||
|
impl RequestBody {
|
||||||
|
pub fn log_and_get_request_body<T, F>(
|
||||||
|
body: T,
|
||||||
|
encoder: F,
|
||||||
|
) -> errors::CustomResult<Self, errors::ParsingError>
|
||||||
|
where
|
||||||
|
F: FnOnce(T) -> errors::CustomResult<String, errors::ParsingError>,
|
||||||
|
T: std::fmt::Debug,
|
||||||
|
{
|
||||||
|
#[cfg(feature = "logs")]
|
||||||
|
logger::info!(connector_request_body=?body);
|
||||||
|
Ok(Self(Secret::new(encoder(body)?)))
|
||||||
|
}
|
||||||
|
pub fn get_inner_value(request_body: Self) -> Secret<String> {
|
||||||
|
request_body.0
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -14,14 +14,14 @@ use actix_web::{body, HttpRequest, HttpResponse, Responder, ResponseError};
|
|||||||
use api_models::enums::CaptureMethod;
|
use api_models::enums::CaptureMethod;
|
||||||
pub use client::{proxy_bypass_urls, ApiClient, MockApiClient, ProxyClient};
|
pub use client::{proxy_bypass_urls, ApiClient, MockApiClient, ProxyClient};
|
||||||
use common_utils::errors::ReportSwitchExt;
|
use common_utils::errors::ReportSwitchExt;
|
||||||
|
pub use common_utils::request::{ContentType, Method, Request, RequestBuilder};
|
||||||
use error_stack::{report, IntoReport, Report, ResultExt};
|
use error_stack::{report, IntoReport, Report, ResultExt};
|
||||||
use masking::{ExposeOptionInterface, PeekInterface};
|
use masking::{ExposeOptionInterface, PeekInterface};
|
||||||
use router_env::{instrument, tracing, Tag};
|
use router_env::{instrument, tracing, Tag};
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use serde_json::json;
|
use serde_json::json;
|
||||||
|
|
||||||
use self::request::{ContentType, HeaderExt, RequestBuilderExt};
|
use self::request::{HeaderExt, RequestBuilderExt};
|
||||||
pub use self::request::{Method, Request, RequestBuilder};
|
|
||||||
use crate::{
|
use crate::{
|
||||||
configs::settings::{Connectors, Settings},
|
configs::settings::{Connectors, Settings},
|
||||||
consts,
|
consts,
|
||||||
|
|||||||
@ -1,193 +1,12 @@
|
|||||||
use std::{collections, str::FromStr};
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
pub use common_utils::request::ContentType;
|
||||||
|
use common_utils::request::Headers;
|
||||||
use error_stack::{IntoReport, ResultExt};
|
use error_stack::{IntoReport, ResultExt};
|
||||||
use masking::Secret;
|
|
||||||
pub use masking::{Mask, Maskable};
|
pub use masking::{Mask, Maskable};
|
||||||
use router_env::{instrument, tracing};
|
use router_env::{instrument, tracing};
|
||||||
use serde::{Deserialize, Serialize};
|
|
||||||
|
|
||||||
use crate::{
|
use crate::core::errors::{self, CustomResult};
|
||||||
core::errors::{self, CustomResult},
|
|
||||||
types,
|
|
||||||
};
|
|
||||||
|
|
||||||
pub(crate) type Headers = collections::HashSet<(String, Maskable<String>)>;
|
|
||||||
|
|
||||||
#[derive(
|
|
||||||
Clone, Copy, Debug, Eq, PartialEq, Deserialize, Serialize, strum::Display, strum::EnumString,
|
|
||||||
)]
|
|
||||||
#[serde(rename_all = "UPPERCASE")]
|
|
||||||
#[strum(serialize_all = "UPPERCASE")]
|
|
||||||
pub enum Method {
|
|
||||||
Get,
|
|
||||||
Post,
|
|
||||||
Put,
|
|
||||||
Delete,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Debug)]
|
|
||||||
pub enum ContentType {
|
|
||||||
Json,
|
|
||||||
FormUrlEncoded,
|
|
||||||
FormData,
|
|
||||||
}
|
|
||||||
|
|
||||||
fn default_request_headers() -> [(String, Maskable<String>); 1] {
|
|
||||||
use http::header;
|
|
||||||
|
|
||||||
[(header::VIA.to_string(), "HyperSwitch".to_string().into())]
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub struct Request {
|
|
||||||
pub url: String,
|
|
||||||
pub headers: Headers,
|
|
||||||
pub payload: Option<Secret<String>>,
|
|
||||||
pub method: Method,
|
|
||||||
pub content_type: Option<ContentType>,
|
|
||||||
pub certificate: Option<String>,
|
|
||||||
pub certificate_key: Option<String>,
|
|
||||||
pub form_data: Option<reqwest::multipart::Form>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Request {
|
|
||||||
pub fn new(method: Method, url: &str) -> Self {
|
|
||||||
Self {
|
|
||||||
method,
|
|
||||||
url: String::from(url),
|
|
||||||
headers: collections::HashSet::new(),
|
|
||||||
payload: None,
|
|
||||||
content_type: None,
|
|
||||||
certificate: None,
|
|
||||||
certificate_key: None,
|
|
||||||
form_data: None,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn set_body(&mut self, body: String) {
|
|
||||||
self.payload = Some(body.into());
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn add_default_headers(&mut self) {
|
|
||||||
self.headers.extend(default_request_headers());
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn add_header(&mut self, header: &str, value: Maskable<String>) {
|
|
||||||
self.headers.insert((String::from(header), value));
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn add_content_type(&mut self, content_type: ContentType) {
|
|
||||||
self.content_type = Some(content_type);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn add_certificate(&mut self, certificate: Option<String>) {
|
|
||||||
self.certificate = certificate;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn add_certificate_key(&mut self, certificate_key: Option<String>) {
|
|
||||||
self.certificate = certificate_key;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn set_form_data(&mut self, form_data: reqwest::multipart::Form) {
|
|
||||||
self.form_data = Some(form_data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct RequestBuilder {
|
|
||||||
pub url: String,
|
|
||||||
pub headers: Headers,
|
|
||||||
pub payload: Option<Secret<String>>,
|
|
||||||
pub method: Method,
|
|
||||||
pub content_type: Option<ContentType>,
|
|
||||||
pub certificate: Option<String>,
|
|
||||||
pub certificate_key: Option<String>,
|
|
||||||
pub form_data: Option<reqwest::multipart::Form>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl RequestBuilder {
|
|
||||||
pub fn new() -> Self {
|
|
||||||
Self {
|
|
||||||
method: Method::Get,
|
|
||||||
url: String::with_capacity(1024),
|
|
||||||
headers: std::collections::HashSet::new(),
|
|
||||||
payload: None,
|
|
||||||
content_type: None,
|
|
||||||
certificate: None,
|
|
||||||
certificate_key: None,
|
|
||||||
form_data: None,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn url(mut self, url: &str) -> Self {
|
|
||||||
self.url = url.into();
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn method(mut self, method: Method) -> Self {
|
|
||||||
self.method = method;
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn attach_default_headers(mut self) -> Self {
|
|
||||||
self.headers.extend(default_request_headers());
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn header(mut self, header: &str, value: &str) -> Self {
|
|
||||||
self.headers.insert((header.into(), value.into()));
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn headers(mut self, headers: Vec<(String, Maskable<String>)>) -> Self {
|
|
||||||
let mut h = headers.into_iter().map(|(h, v)| (h, v));
|
|
||||||
self.headers.extend(&mut h);
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn form_data(mut self, form_data: Option<reqwest::multipart::Form>) -> Self {
|
|
||||||
self.form_data = form_data;
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn body(mut self, option_body: Option<types::RequestBody>) -> Self {
|
|
||||||
self.payload = option_body.map(types::RequestBody::get_inner_value);
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn content_type(mut self, content_type: ContentType) -> Self {
|
|
||||||
self.content_type = Some(content_type);
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn add_certificate(mut self, certificate: Option<String>) -> Self {
|
|
||||||
self.certificate = certificate;
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn add_certificate_key(mut self, certificate_key: Option<String>) -> Self {
|
|
||||||
self.certificate_key = certificate_key;
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn build(self) -> Request {
|
|
||||||
Request {
|
|
||||||
method: self.method,
|
|
||||||
url: self.url,
|
|
||||||
headers: self.headers,
|
|
||||||
payload: self.payload,
|
|
||||||
content_type: self.content_type,
|
|
||||||
certificate: self.certificate,
|
|
||||||
certificate_key: self.certificate_key,
|
|
||||||
form_data: self.form_data,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for RequestBuilder {
|
|
||||||
fn default() -> Self {
|
|
||||||
Self::new()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(super) trait HeaderExt {
|
pub(super) trait HeaderExt {
|
||||||
fn construct_header_map(
|
fn construct_header_map(
|
||||||
|
|||||||
@ -17,6 +17,7 @@ pub use api_models::{
|
|||||||
enums::{Connector, PayoutConnectors},
|
enums::{Connector, PayoutConnectors},
|
||||||
payouts as payout_types,
|
payouts as payout_types,
|
||||||
};
|
};
|
||||||
|
pub use common_utils::request::RequestBody;
|
||||||
use common_utils::{pii, pii::Email};
|
use common_utils::{pii, pii::Email};
|
||||||
use data_models::mandates::MandateData;
|
use data_models::mandates::MandateData;
|
||||||
use error_stack::{IntoReport, ResultExt};
|
use error_stack::{IntoReport, ResultExt};
|
||||||
@ -1062,26 +1063,6 @@ impl<F1, F2, T1, T2> From<(&RouterData<F1, T1, PaymentsResponseData>, T2)>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
|
||||||
pub struct RequestBody(Secret<String>);
|
|
||||||
|
|
||||||
impl RequestBody {
|
|
||||||
pub fn log_and_get_request_body<T, F>(
|
|
||||||
body: T,
|
|
||||||
encoder: F,
|
|
||||||
) -> errors::CustomResult<Self, errors::ParsingError>
|
|
||||||
where
|
|
||||||
F: FnOnce(T) -> errors::CustomResult<String, errors::ParsingError>,
|
|
||||||
T: std::fmt::Debug,
|
|
||||||
{
|
|
||||||
router_env::logger::info!(connector_request_body=?body);
|
|
||||||
Ok(Self(Secret::new(encoder(body)?)))
|
|
||||||
}
|
|
||||||
pub fn get_inner_value(request_body: Self) -> Secret<String> {
|
|
||||||
request_body.0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(feature = "payouts")]
|
#[cfg(feature = "payouts")]
|
||||||
impl<F1, F2>
|
impl<F1, F2>
|
||||||
From<(
|
From<(
|
||||||
|
|||||||
Reference in New Issue
Block a user