Skip to content

Commit 4492685

Browse files
committed
refactor: add inject receipt middleware
Signed-off-by: Gustavo Inacio <[email protected]>
1 parent 916f9c8 commit 4492685

File tree

2 files changed

+64
-0
lines changed

2 files changed

+64
-0
lines changed

crates/service/src/middleware.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@
22
// SPDX-License-Identifier: Apache-2.0
33

44
mod inject_deployment;
5+
mod inject_receipt;
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
// Copyright 2023-, Edge & Node, GraphOps, and Semiotic Labs.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
use axum::{extract::Request, middleware::Next, response::Response, RequestExt};
5+
use axum_extra::TypedHeader;
6+
7+
use crate::service::TapReceipt;
8+
9+
pub async fn receipt_middleware(mut request: Request, next: Next) -> Response {
10+
if let Ok(TypedHeader(receipt)) = request.extract_parts::<TypedHeader<TapReceipt>>().await {
11+
if let Some(receipt) = receipt.into_signed_receipt() {
12+
request.extensions_mut().insert(receipt);
13+
}
14+
}
15+
next.run(request).await
16+
}
17+
18+
#[cfg(test)]
19+
mod tests {
20+
use crate::{middleware::inject_receipt::receipt_middleware, service::TapReceipt};
21+
22+
use alloy::primitives::Address;
23+
use axum::{
24+
body::Body,
25+
http::{Extensions, Request},
26+
middleware::from_fn,
27+
routing::get,
28+
Router,
29+
};
30+
use axum_extra::headers::Header;
31+
use reqwest::StatusCode;
32+
use tap_core::receipt::SignedReceipt;
33+
use test_assets::create_signed_receipt;
34+
use tower::ServiceExt;
35+
36+
#[tokio::test]
37+
async fn test_receipt_middleware() {
38+
let middleware = from_fn(receipt_middleware);
39+
40+
async fn handle(extensions: Extensions) -> Body {
41+
extensions
42+
.get::<SignedReceipt>()
43+
.expect("Should decode tap receipt");
44+
Body::empty()
45+
}
46+
47+
let app = Router::new().route("/", get(handle)).layer(middleware);
48+
49+
let receipt = create_signed_receipt(Address::ZERO, 1, 1, 1).await;
50+
51+
let res = app
52+
.oneshot(
53+
Request::builder()
54+
.uri("/")
55+
.header(TapReceipt::name(), serde_json::to_string(&receipt).unwrap())
56+
.body(Body::empty())
57+
.unwrap(),
58+
)
59+
.await
60+
.unwrap();
61+
assert_eq!(res.status(), StatusCode::OK);
62+
}
63+
}

0 commit comments

Comments
 (0)