Skip to content

Commit

Permalink
Testing succesfully with an AWS Lambda CRUD
Browse files Browse the repository at this point in the history
  • Loading branch information
Jerboa-app committed Jun 30, 2024
1 parent 8a3d647 commit be046d0
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 12 deletions.
3 changes: 2 additions & 1 deletion src/server/https.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ use axum::
};
use axum_server::{tls_rustls::RustlsConfig, Handle};

use super::{api::{stats::StatsDigest, ApiRequest}, stats::{hits::{log_stats, HitStats}, StatsSaveTask, StatsDigestTask}};
use super::{api::{stats::StatsDigest, ApiRequest}, relay::request::filter_relay, stats::{hits::{log_stats, HitStats}, StatsDigestTask, StatsSaveTask}};

/// An https server that reads a directory configured with [Config]
/// ```.html``` pages and resources, then serves them.
Expand Down Expand Up @@ -92,6 +92,7 @@ impl Server
let repo_mutex = Arc::new(Mutex::new(SystemTime::now()));

router = router.layer(middleware::from_fn_with_state(repo_mutex.clone(), filter_github));
router = router.layer(middleware::from_fn(filter_relay));

let server = Server
{
Expand Down
34 changes: 23 additions & 11 deletions src/server/relay/request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,24 @@ use serde::Deserialize;
use crate::{config::{Config, RelayConfig, CONFIG_PATH}, util::extract_bytes};

#[derive(Deserialize)]
/// Information to relay a request, name must match a name of
/// a [RelayConfig], see [filter_relay].
struct RelayRequest
{
body: String,
headers: Vec<(String, String)>,
name: String
}

pub async fn filter
/// Relay a request, if the header "relay" is present
/// and matches some [RelayConfig] in [Config].
///
/// The request body should be json deserializable into
/// a [RelayRequest]. Using this proxy one may hide API
/// tokens and urls behind a request sent to Busser. E.g
/// an AWS lambda CRUD API may be called by proxy hiding its
/// url and token.
pub async fn filter_relay
(
headers: HeaderMap,
request: Request<axum::body::Body>,
Expand All @@ -41,13 +51,11 @@ pub async fn filter
let req: RelayRequest = match serde_json::from_str(body)
{
Ok(r) => r,
Err(_) => return Err(StatusCode::BAD_REQUEST)
};

let _: serde::de::IgnoredAny = match serde_json::from_str(&req.body)
{
Ok(j) => j,
Err(_) => return Err(StatusCode::BAD_REQUEST),
Err(_) =>
{
crate::debug(format!("Bad JSON body"), Some("Relay"));
return Err(StatusCode::BAD_REQUEST)
}
};

let mut relay_headers = HeaderMap::new();
Expand All @@ -58,7 +66,11 @@ pub async fn filter

match get_relay_config(req.name)
{
None => return Err(StatusCode::BAD_REQUEST),
None =>
{
crate::debug(format!("No matching config"), Some("Relay"));
return Err(StatusCode::BAD_REQUEST)
},
Some(relay) =>
{
for (key, value) in relay.headers
Expand All @@ -68,7 +80,8 @@ pub async fn filter

let client = reqwest::Client::new();
let response = match client.post(relay.url)
.json(&serde_json::json!(req.body))
.headers(relay_headers)
.body(req.body)
.send()
.await
{
Expand All @@ -77,7 +90,6 @@ pub async fn filter
};

let response_builder = Response::builder().status(response.status().as_u16());
// Here the mapping of headers is required due to reqwest and axum differ on the http crate versions
let mut headers = HeaderMap::with_capacity(response.headers().len());
headers.extend(response.headers().into_iter().map(|(name, value)| {
let name = HeaderName::from_bytes(name.as_ref()).unwrap();
Expand Down

0 comments on commit be046d0

Please sign in to comment.