Skip to content

Commit cc3b1ea

Browse files
authored
Merge pull request #1270 from input-output-hk/damien/1103/add-custom-response-on-aggregator-endpoint-call
Add a JSON message response on aggregator root endpoint calls
2 parents ca67a31 + 20c8221 commit cc3b1ea

File tree

6 files changed

+135
-7
lines changed

6 files changed

+135
-7
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mithril-aggregator/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mithril-aggregator"
3-
version = "0.3.105"
3+
version = "0.3.106"
44
description = "A Mithril Aggregator server"
55
authors = { workspace = true }
66
edition = { workspace = true }

mithril-aggregator/src/http_server/routes/middlewares.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::{
77
SignerRegisterer, VerificationKeyStorer,
88
};
99

10-
use mithril_common::BeaconProvider;
10+
use mithril_common::{api_version::APIVersionProvider, BeaconProvider};
1111
use std::convert::Infallible;
1212
use std::sync::Arc;
1313
use warp::Filter;
@@ -88,3 +88,10 @@ pub fn with_verification_key_store(
8888
) -> impl Filter<Extract = (Arc<dyn VerificationKeyStorer>,), Error = Infallible> + Clone {
8989
warp::any().map(move || dependency_manager.verification_key_store.clone())
9090
}
91+
92+
/// With API version provider
93+
pub fn with_api_version_provider(
94+
dependency_manager: Arc<DependencyContainer>,
95+
) -> impl Filter<Extract = (Arc<APIVersionProvider>,), Error = Infallible> + Clone {
96+
warp::any().map(move || dependency_manager.api_version_provider.clone())
97+
}

mithril-aggregator/src/http_server/routes/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ mod certificate_routes;
33
mod epoch_routes;
44
mod middlewares;
55
mod reply;
6+
mod root_routes;
67
pub mod router;
78
mod signatures_routes;
89
mod signer_routes;
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
use crate::DependencyContainer;
2+
use serde::{Deserialize, Serialize};
3+
use std::sync::Arc;
4+
use warp::Filter;
5+
6+
use super::middlewares;
7+
8+
#[derive(Debug, Serialize, Deserialize, PartialEq)]
9+
pub struct RootRouteMessage {
10+
pub open_api_version: String,
11+
pub documentation_url: String,
12+
}
13+
14+
pub fn routes(
15+
dependency_manager: Arc<DependencyContainer>,
16+
) -> impl Filter<Extract = (impl warp::Reply,), Error = warp::Rejection> + Clone {
17+
root(dependency_manager)
18+
}
19+
20+
/// GET /
21+
fn root(
22+
dependency_manager: Arc<DependencyContainer>,
23+
) -> impl Filter<Extract = (impl warp::Reply,), Error = warp::Rejection> + Clone {
24+
warp::path::end()
25+
.and(middlewares::with_api_version_provider(dependency_manager))
26+
.and_then(handlers::root)
27+
}
28+
29+
mod handlers {
30+
use mithril_common::api_version::APIVersionProvider;
31+
use reqwest::StatusCode;
32+
use slog_scope::{debug, warn};
33+
34+
use crate::http_server::routes::{
35+
reply::{self, json},
36+
root_routes::RootRouteMessage,
37+
};
38+
use std::{convert::Infallible, sync::Arc};
39+
40+
/// Root
41+
pub async fn root(
42+
api_version_provider: Arc<APIVersionProvider>,
43+
) -> Result<impl warp::Reply, Infallible> {
44+
debug!("⇄ HTTP SERVER: root");
45+
46+
match api_version_provider.compute_current_version() {
47+
Ok(open_api_version) => Ok(json(
48+
&RootRouteMessage {
49+
open_api_version: open_api_version.to_string(),
50+
documentation_url: env!("CARGO_PKG_HOMEPAGE").to_string(),
51+
},
52+
StatusCode::OK,
53+
)),
54+
Err(err) => {
55+
warn!("root::error"; "error" => ?err);
56+
Ok(reply::internal_server_error(err.to_string()))
57+
}
58+
}
59+
}
60+
}
61+
62+
#[cfg(test)]
63+
mod tests {
64+
use crate::http_server::SERVER_BASE_PATH;
65+
use crate::{initialize_dependencies, DependencyContainer};
66+
use reqwest::StatusCode;
67+
use std::sync::Arc;
68+
use warp::http::Method;
69+
use warp::test::request;
70+
use warp::Filter;
71+
72+
use super::*;
73+
74+
fn setup_router(
75+
dependency_manager: Arc<DependencyContainer>,
76+
) -> impl Filter<Extract = (impl warp::Reply,), Error = warp::Rejection> + Clone {
77+
let cors = warp::cors()
78+
.allow_any_origin()
79+
.allow_headers(vec!["content-type"])
80+
.allow_methods(vec![Method::GET, Method::POST, Method::OPTIONS]);
81+
82+
warp::any()
83+
.and(warp::path(SERVER_BASE_PATH))
84+
.and(routes(dependency_manager).with(cors))
85+
}
86+
87+
#[tokio::test]
88+
async fn test_root_route_ok() {
89+
let method = Method::GET.as_str();
90+
let path = "/";
91+
let dependency_manager = initialize_dependencies().await;
92+
let expected_open_api_version = dependency_manager
93+
.api_version_provider
94+
.clone()
95+
.compute_current_version()
96+
.unwrap()
97+
.to_string();
98+
99+
let response = request()
100+
.method(method)
101+
.path(&format!("/{SERVER_BASE_PATH}{path}"))
102+
.reply(&setup_router(Arc::new(dependency_manager)))
103+
.await;
104+
105+
let response_body: RootRouteMessage = serde_json::from_slice(response.body()).unwrap();
106+
107+
assert_eq!(response.status(), StatusCode::OK);
108+
109+
assert_eq!(
110+
response_body,
111+
RootRouteMessage {
112+
open_api_version: expected_open_api_version,
113+
documentation_url: env!("CARGO_PKG_HOMEPAGE").to_string(),
114+
}
115+
);
116+
}
117+
}

mithril-aggregator/src/http_server/routes/router.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::http_server::routes::{
2-
artifact_routes, certificate_routes, epoch_routes, signatures_routes, signer_routes,
3-
statistics_routes,
2+
artifact_routes, certificate_routes, epoch_routes, root_routes, signatures_routes,
3+
signer_routes, statistics_routes,
44
};
55
use crate::http_server::SERVER_BASE_PATH;
66
use crate::DependencyContainer;
@@ -15,6 +15,8 @@ use warp::http::Method;
1515
use warp::reject::Reject;
1616
use warp::{Filter, Rejection, Reply};
1717

18+
use super::middlewares;
19+
1820
#[derive(Debug)]
1921
pub struct VersionMismatchError;
2022

@@ -36,7 +38,7 @@ pub fn routes(
3638

3739
warp::any()
3840
.and(header_must_be(
39-
dependency_manager.clone().api_version_provider.clone(),
41+
dependency_manager.api_version_provider.clone(),
4042
))
4143
.and(warp::path(SERVER_BASE_PATH))
4244
.and(
@@ -51,10 +53,11 @@ pub fn routes(
5153
.or(signatures_routes::routes(dependency_manager.clone()))
5254
.or(epoch_routes::routes(dependency_manager.clone()))
5355
.or(statistics_routes::routes(dependency_manager.clone()))
56+
.or(root_routes::routes(dependency_manager.clone()))
5457
.with(cors),
5558
)
5659
.recover(handle_custom)
57-
.and(warp::any().map(move || dependency_manager.clone().api_version_provider.clone()))
60+
.and(middlewares::with_api_version_provider(dependency_manager))
5861
.map(|reply, api_version_provider: Arc<APIVersionProvider>| {
5962
warp::reply::with_header(
6063
reply,

0 commit comments

Comments
 (0)