From 8e45da1d42e0cee7767f86a114b9527107ddb7d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20HUBERT=20/=20PALO-IT?= Date: Mon, 14 Nov 2022 17:01:27 +0100 Subject: [PATCH] add API version to client headers --- mithril-aggregator/src/http_server/mod.rs | 6 --- .../src/http_server/routes/router.rs | 5 ++- mithril-client/src/aggregator.rs | 35 +++++++++++++++--- mithril-common/src/lib.rs | 6 +++ mithril-signer/src/certificate_handler.rs | 37 +++++++++++++++---- 5 files changed, 69 insertions(+), 20 deletions(-) diff --git a/mithril-aggregator/src/http_server/mod.rs b/mithril-aggregator/src/http_server/mod.rs index 1e3ad452f11..920abfcf3d0 100644 --- a/mithril-aggregator/src/http_server/mod.rs +++ b/mithril-aggregator/src/http_server/mod.rs @@ -2,9 +2,3 @@ mod routes; mod server; pub use server::{Server, SERVER_BASE_PATH}; - -/// Mithril API protocol version -/// this is the same as the one in openapi.yml file. -/// If you want to update this version to reflect changes in the protocol, -/// please also update the entry in the openapi.yml -pub const MITHRIL_API_VERSION: &str = "0.0.1"; diff --git a/mithril-aggregator/src/http_server/routes/router.rs b/mithril-aggregator/src/http_server/routes/router.rs index bf4d614c7c9..06832ed6264 100644 --- a/mithril-aggregator/src/http_server/routes/router.rs +++ b/mithril-aggregator/src/http_server/routes/router.rs @@ -1,8 +1,11 @@ use crate::http_server::routes::{ certificate_routes, epoch_routes, signatures_routes, signer_routes, snapshot_routes, }; -use crate::http_server::{MITHRIL_API_VERSION, SERVER_BASE_PATH}; +use crate::http_server::SERVER_BASE_PATH; use crate::DependencyManager; + +use mithril_common::MITHRIL_API_VERSION; + use reqwest::header::{HeaderMap, HeaderValue}; use std::sync::Arc; use warp::http::Method; diff --git a/mithril-client/src/aggregator.rs b/mithril-client/src/aggregator.rs index fee36ddd037..bac0c9bed25 100644 --- a/mithril-client/src/aggregator.rs +++ b/mithril-client/src/aggregator.rs @@ -2,6 +2,7 @@ use async_trait::async_trait; use flate2::read::GzDecoder; use futures::StreamExt; use reqwest::{self, StatusCode}; +use reqwest::{Client, RequestBuilder}; use slog_scope::debug; use std::env; use std::fs; @@ -12,7 +13,10 @@ use std::sync::Arc; use tar::Archive; use thiserror::Error; -use mithril_common::entities::{Certificate, Snapshot}; +use mithril_common::{ + entities::{Certificate, Snapshot}, + MITHRIL_API_VERSION, +}; use mithril_common::certificate_chain::CertificateRetriever; use mithril_common::certificate_chain::CertificateRetrieverError; @@ -86,6 +90,11 @@ impl AggregatorHTTPClient { } } + /// Forge a client request adding protocol version in the headers. + pub fn prepare_request_builder(&self, request_builder: RequestBuilder) -> RequestBuilder { + request_builder.header("API_VERSION", MITHRIL_API_VERSION) + } + /// Download certificate details async fn download_certificate_details( &self, @@ -96,7 +105,11 @@ impl AggregatorHTTPClient { "{}/certificate/{}", self.aggregator_endpoint, certificate_hash ); - let response = reqwest::get(url.clone()).await; + let response = self + .prepare_request_builder(Client::new().get(url.clone())) + .send() + .await; + match response { Ok(response) => match response.status() { StatusCode::OK => match response.json::().await { @@ -123,7 +136,11 @@ impl AggregatorHandler for AggregatorHTTPClient { async fn list_snapshots(&self) -> Result, AggregatorHandlerError> { debug!("List snapshots"); let url = format!("{}/snapshots", self.aggregator_endpoint); - let response = reqwest::get(url.clone()).await; + let response = self + .prepare_request_builder(Client::new().get(url.clone())) + .send() + .await; + match response { Ok(response) => match response.status() { StatusCode::OK => match response.json::>().await { @@ -144,7 +161,11 @@ impl AggregatorHandler for AggregatorHTTPClient { async fn get_snapshot_details(&self, digest: &str) -> Result { debug!("Details snapshot {}", digest); let url = format!("{}/snapshot/{}", self.aggregator_endpoint, digest); - let response = reqwest::get(url.clone()).await; + let response = self + .prepare_request_builder(Client::new().get(url.clone())) + .send() + .await; + match response { Ok(response) => match response.status() { StatusCode::OK => match response.json::().await { @@ -171,7 +192,11 @@ impl AggregatorHandler for AggregatorHTTPClient { location: &str, ) -> Result { debug!("Download snapshot {} from {}", digest, location); - let response = reqwest::get(location).await; + let response = self + .prepare_request_builder(Client::new().get(location.to_owned())) + .send() + .await; + match response { Ok(response) => match response.status() { StatusCode::OK => { diff --git a/mithril-common/src/lib.rs b/mithril-common/src/lib.rs index a53b9676a97..49542780759 100644 --- a/mithril-common/src/lib.rs +++ b/mithril-common/src/lib.rs @@ -35,3 +35,9 @@ pub const NEXT_SIGNER_EPOCH_RETRIEVAL_OFFSET: i64 = 0; /// The epoch offset used for signers stake distribution and verification keys recording. pub const SIGNER_EPOCH_RECORDING_OFFSET: i64 = 1; + +/// Mithril API protocol version +/// this is the same as the one in openapi.yml file. +/// If you want to update this version to reflect changes in the protocol, +/// please also update the entry in the openapi.yml +pub const MITHRIL_API_VERSION: &str = "0.0.1"; diff --git a/mithril-signer/src/certificate_handler.rs b/mithril-signer/src/certificate_handler.rs index bf09a6059fe..e66b6b3ea7b 100644 --- a/mithril-signer/src/certificate_handler.rs +++ b/mithril-signer/src/certificate_handler.rs @@ -1,5 +1,5 @@ use async_trait::async_trait; -use reqwest::{self, StatusCode}; +use reqwest::{self, Client, RequestBuilder, StatusCode}; use slog_scope::debug; use std::io; use thiserror::Error; @@ -7,7 +7,7 @@ use tokio::sync::RwLock; use mithril_common::{ entities::{CertificatePending, EpochSettings, Signer, SingleSignatures}, - fake_data, + fake_data, MITHRIL_API_VERSION, }; #[cfg(test)] @@ -74,6 +74,11 @@ impl CertificateHandlerHTTPClient { aggregator_endpoint, } } + + /// Forge a client request adding protocol version in the headers. + pub fn prepare_request_builder(&self, request_builder: RequestBuilder) -> RequestBuilder { + request_builder.header("API_VERSION", MITHRIL_API_VERSION) + } } #[async_trait] @@ -83,7 +88,11 @@ impl CertificateHandler for CertificateHandlerHTTPClient { ) -> Result, CertificateHandlerError> { debug!("Retrieve epoch settings"); let url = format!("{}/epoch-settings", self.aggregator_endpoint); - let response = reqwest::get(url.clone()).await; + let response = self + .prepare_request_builder(Client::new().get(url.clone())) + .send() + .await; + match response { Ok(response) => match response.status() { StatusCode::OK => match response.json::().await { @@ -105,7 +114,11 @@ impl CertificateHandler for CertificateHandlerHTTPClient { ) -> Result, CertificateHandlerError> { debug!("Retrieve pending certificate"); let url = format!("{}/certificate-pending", self.aggregator_endpoint); - let response = reqwest::get(url.clone()).await; + let response = self + .prepare_request_builder(Client::new().get(url.clone())) + .send() + .await; + match response { Ok(response) => match response.status() { StatusCode::OK => match response.json::().await { @@ -126,8 +139,12 @@ impl CertificateHandler for CertificateHandlerHTTPClient { async fn register_signer(&self, signer: &Signer) -> Result<(), CertificateHandlerError> { debug!("Register signer"); let url = format!("{}/register-signer", self.aggregator_endpoint); - let client = reqwest::Client::new(); - let response = client.post(url.clone()).json(signer).send().await; + let response = self + .prepare_request_builder(Client::new().post(url.clone())) + .json(signer) + .send() + .await; + match response { Ok(response) => match response.status() { StatusCode::CREATED => Ok(()), @@ -150,8 +167,12 @@ impl CertificateHandler for CertificateHandlerHTTPClient { ) -> Result<(), CertificateHandlerError> { debug!("Register signatures"); let url = format!("{}/register-signatures", self.aggregator_endpoint); - let client = reqwest::Client::new(); - let response = client.post(url.clone()).json(signatures).send().await; + let response = self + .prepare_request_builder(Client::new().post(url.clone())) + .json(signatures) + .send() + .await; + match response { Ok(response) => match response.status() { StatusCode::CREATED => Ok(()),