feat: support POST body proxy

This commit is contained in:
Udit Karode 2022-08-07 14:50:31 +05:30
parent 1394301ffc
commit 60cbb78354
No known key found for this signature in database
GPG Key ID: 864BAA48465205F0

View File

@ -1,6 +1,10 @@
#![feature(slice_pattern)]
pub mod utils;
use core::slice::SlicePattern;
use curl::easy::Easy;
use std::io::Read;
use std::str::from_utf8;
use std::{error::Error, net::SocketAddr};
use utils::QueryParameters;
@ -9,16 +13,26 @@ use warp::{http::Method, hyper::body::Bytes, path::FullPath, Filter};
const BASE: &str = "https://www.bankofmaldives.com.mv/internetbanking/api/";
const ERR: &str = "{ code: 407, message: \"Proxy failed\" }";
fn get_proxied_body(uri: &String) -> Result<String, Box<dyn Error>> {
fn get_proxied_body(uri: &String, method: &Method, body: &Bytes) -> Result<String, Box<dyn Error>> {
let mut handle = Easy::new();
handle.url(format!("{}{}", BASE, uri).as_str())?;
let mut buf = Vec::new();
if method == Method::POST {
handle.post(true)?;
handle.post_field_size(body.len() as u64)?;
}
let mut buf = Vec::new();
{
let mut transfer = handle.transfer();
if method == Method::POST {
transfer.read_function(|into| {
let read = body.as_slice().read(into).unwrap_or(0);
Ok(read)
})?;
}
transfer.write_function(|data| {
buf.extend_from_slice(data);
Ok(data.len())
@ -36,8 +50,8 @@ fn get_proxied_body(uri: &String) -> Result<String, Box<dyn Error>> {
fn handler(
uri: FullPath,
_: QueryParameters,
_: Method,
_: Bytes,
method: Method,
body: Bytes,
ip: Option<SocketAddr>,
) -> String {
let uri = uri.as_str().clone().to_string();
@ -48,7 +62,7 @@ fn handler(
println!("({}) {}", ip_str, uri);
let proxy_response = get_proxied_body(&uri);
let proxy_response = get_proxied_body(&uri, &method, &body);
let res = match proxy_response {
Ok(v) => v,