Skip to content

Commit c219cfd

Browse files
authored
Merge pull request #566 from input-output-hk/greg/565/api_version
add API version in HTTP headers
2 parents 5ae721a + 8e45da1 commit c219cfd

File tree

5 files changed

+80
-14
lines changed

5 files changed

+80
-14
lines changed

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ use crate::http_server::routes::{
33
};
44
use crate::http_server::SERVER_BASE_PATH;
55
use crate::DependencyManager;
6+
7+
use mithril_common::MITHRIL_API_VERSION;
8+
9+
use reqwest::header::{HeaderMap, HeaderValue};
610
use std::sync::Arc;
711
use warp::http::Method;
812
use warp::Filter;
@@ -15,13 +19,19 @@ pub fn routes(
1519
.allow_any_origin()
1620
.allow_headers(vec!["content-type"])
1721
.allow_methods(vec![Method::GET, Method::POST, Method::OPTIONS]);
22+
let mut headers = HeaderMap::new();
23+
headers.insert(
24+
"mithril-api-version",
25+
HeaderValue::from_static(MITHRIL_API_VERSION),
26+
);
1827

1928
warp::any().and(warp::path(SERVER_BASE_PATH)).and(
2029
certificate_routes::routes(dependency_manager.clone())
2130
.or(snapshot_routes::routes(dependency_manager.clone()))
2231
.or(signer_routes::routes(dependency_manager.clone()))
2332
.or(signatures_routes::routes(dependency_manager.clone()))
2433
.or(epoch_routes::routes(dependency_manager))
25-
.with(cors),
34+
.with(cors)
35+
.with(warp::reply::with::headers(headers)),
2636
)
2737
}

mithril-client/src/aggregator.rs

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use async_trait::async_trait;
22
use flate2::read::GzDecoder;
33
use futures::StreamExt;
44
use reqwest::{self, StatusCode};
5+
use reqwest::{Client, RequestBuilder};
56
use slog_scope::debug;
67
use std::env;
78
use std::fs;
@@ -12,7 +13,10 @@ use std::sync::Arc;
1213
use tar::Archive;
1314
use thiserror::Error;
1415

15-
use mithril_common::entities::{Certificate, Snapshot};
16+
use mithril_common::{
17+
entities::{Certificate, Snapshot},
18+
MITHRIL_API_VERSION,
19+
};
1620

1721
use mithril_common::certificate_chain::CertificateRetriever;
1822
use mithril_common::certificate_chain::CertificateRetrieverError;
@@ -86,6 +90,11 @@ impl AggregatorHTTPClient {
8690
}
8791
}
8892

93+
/// Forge a client request adding protocol version in the headers.
94+
pub fn prepare_request_builder(&self, request_builder: RequestBuilder) -> RequestBuilder {
95+
request_builder.header("API_VERSION", MITHRIL_API_VERSION)
96+
}
97+
8998
/// Download certificate details
9099
async fn download_certificate_details(
91100
&self,
@@ -96,7 +105,11 @@ impl AggregatorHTTPClient {
96105
"{}/certificate/{}",
97106
self.aggregator_endpoint, certificate_hash
98107
);
99-
let response = reqwest::get(url.clone()).await;
108+
let response = self
109+
.prepare_request_builder(Client::new().get(url.clone()))
110+
.send()
111+
.await;
112+
100113
match response {
101114
Ok(response) => match response.status() {
102115
StatusCode::OK => match response.json::<Certificate>().await {
@@ -123,7 +136,11 @@ impl AggregatorHandler for AggregatorHTTPClient {
123136
async fn list_snapshots(&self) -> Result<Vec<Snapshot>, AggregatorHandlerError> {
124137
debug!("List snapshots");
125138
let url = format!("{}/snapshots", self.aggregator_endpoint);
126-
let response = reqwest::get(url.clone()).await;
139+
let response = self
140+
.prepare_request_builder(Client::new().get(url.clone()))
141+
.send()
142+
.await;
143+
127144
match response {
128145
Ok(response) => match response.status() {
129146
StatusCode::OK => match response.json::<Vec<Snapshot>>().await {
@@ -144,7 +161,11 @@ impl AggregatorHandler for AggregatorHTTPClient {
144161
async fn get_snapshot_details(&self, digest: &str) -> Result<Snapshot, AggregatorHandlerError> {
145162
debug!("Details snapshot {}", digest);
146163
let url = format!("{}/snapshot/{}", self.aggregator_endpoint, digest);
147-
let response = reqwest::get(url.clone()).await;
164+
let response = self
165+
.prepare_request_builder(Client::new().get(url.clone()))
166+
.send()
167+
.await;
168+
148169
match response {
149170
Ok(response) => match response.status() {
150171
StatusCode::OK => match response.json::<Snapshot>().await {
@@ -171,7 +192,11 @@ impl AggregatorHandler for AggregatorHTTPClient {
171192
location: &str,
172193
) -> Result<String, AggregatorHandlerError> {
173194
debug!("Download snapshot {} from {}", digest, location);
174-
let response = reqwest::get(location).await;
195+
let response = self
196+
.prepare_request_builder(Client::new().get(location.to_owned()))
197+
.send()
198+
.await;
199+
175200
match response {
176201
Ok(response) => match response.status() {
177202
StatusCode::OK => {

mithril-common/src/lib.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,9 @@ pub const NEXT_SIGNER_EPOCH_RETRIEVAL_OFFSET: i64 = 0;
3535

3636
/// The epoch offset used for signers stake distribution and verification keys recording.
3737
pub const SIGNER_EPOCH_RECORDING_OFFSET: i64 = 1;
38+
39+
/// Mithril API protocol version
40+
/// this is the same as the one in openapi.yml file.
41+
/// If you want to update this version to reflect changes in the protocol,
42+
/// please also update the entry in the openapi.yml
43+
pub const MITHRIL_API_VERSION: &str = "0.0.1";

mithril-signer/src/certificate_handler.rs

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
use async_trait::async_trait;
2-
use reqwest::{self, StatusCode};
2+
use reqwest::{self, Client, RequestBuilder, StatusCode};
33
use slog_scope::debug;
44
use std::io;
55
use thiserror::Error;
66
use tokio::sync::RwLock;
77

88
use mithril_common::{
99
entities::{CertificatePending, EpochSettings, Signer, SingleSignatures},
10-
fake_data,
10+
fake_data, MITHRIL_API_VERSION,
1111
};
1212

1313
#[cfg(test)]
@@ -74,6 +74,11 @@ impl CertificateHandlerHTTPClient {
7474
aggregator_endpoint,
7575
}
7676
}
77+
78+
/// Forge a client request adding protocol version in the headers.
79+
pub fn prepare_request_builder(&self, request_builder: RequestBuilder) -> RequestBuilder {
80+
request_builder.header("API_VERSION", MITHRIL_API_VERSION)
81+
}
7782
}
7883

7984
#[async_trait]
@@ -83,7 +88,11 @@ impl CertificateHandler for CertificateHandlerHTTPClient {
8388
) -> Result<Option<EpochSettings>, CertificateHandlerError> {
8489
debug!("Retrieve epoch settings");
8590
let url = format!("{}/epoch-settings", self.aggregator_endpoint);
86-
let response = reqwest::get(url.clone()).await;
91+
let response = self
92+
.prepare_request_builder(Client::new().get(url.clone()))
93+
.send()
94+
.await;
95+
8796
match response {
8897
Ok(response) => match response.status() {
8998
StatusCode::OK => match response.json::<EpochSettings>().await {
@@ -105,7 +114,11 @@ impl CertificateHandler for CertificateHandlerHTTPClient {
105114
) -> Result<Option<CertificatePending>, CertificateHandlerError> {
106115
debug!("Retrieve pending certificate");
107116
let url = format!("{}/certificate-pending", self.aggregator_endpoint);
108-
let response = reqwest::get(url.clone()).await;
117+
let response = self
118+
.prepare_request_builder(Client::new().get(url.clone()))
119+
.send()
120+
.await;
121+
109122
match response {
110123
Ok(response) => match response.status() {
111124
StatusCode::OK => match response.json::<CertificatePending>().await {
@@ -126,8 +139,12 @@ impl CertificateHandler for CertificateHandlerHTTPClient {
126139
async fn register_signer(&self, signer: &Signer) -> Result<(), CertificateHandlerError> {
127140
debug!("Register signer");
128141
let url = format!("{}/register-signer", self.aggregator_endpoint);
129-
let client = reqwest::Client::new();
130-
let response = client.post(url.clone()).json(signer).send().await;
142+
let response = self
143+
.prepare_request_builder(Client::new().post(url.clone()))
144+
.json(signer)
145+
.send()
146+
.await;
147+
131148
match response {
132149
Ok(response) => match response.status() {
133150
StatusCode::CREATED => Ok(()),
@@ -150,8 +167,12 @@ impl CertificateHandler for CertificateHandlerHTTPClient {
150167
) -> Result<(), CertificateHandlerError> {
151168
debug!("Register signatures");
152169
let url = format!("{}/register-signatures", self.aggregator_endpoint);
153-
let client = reqwest::Client::new();
154-
let response = client.post(url.clone()).json(signatures).send().await;
170+
let response = self
171+
.prepare_request_builder(Client::new().post(url.clone()))
172+
.json(signatures)
173+
.send()
174+
.await;
175+
155176
match response {
156177
Ok(response) => match response.status() {
157178
StatusCode::CREATED => Ok(()),

openapi.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
openapi: "3.0.0"
22
info:
3+
# The protocol version is embedded in the code as constant in the
4+
# `mithril-aggregator/src/http_server/mod.rs` file. If you plan to update it
5+
# here to reflect changes in the API, please also update the constant in the
6+
# Rust file.
37
version: 0.0.1
48
title: Mithril Aggregator Server
59
description: |

0 commit comments

Comments
 (0)