mirror of
https://github.com/neondatabase/neon.git
synced 2026-01-13 16:32:56 +00:00
## Problem There are some places in the code where we create `reqwest::Client` without providing SSL CA certs from `ssl_ca_file`. These will break after we enable TLS everywhere. - Part of https://github.com/neondatabase/cloud/issues/22686 ## Summary of changes - Support `ssl_ca_file` in storage scrubber. - Add `use_https_safekeeper_api` option to safekeeper to use https for peer requests. - Propagate SSL CA certs to storage_controller/client, storcon's ComputeHook, PeerClient and maybe_forward.
56 lines
1.5 KiB
Rust
56 lines
1.5 KiB
Rust
use pageserver_client::mgmt_api::{self, ResponseErrorMessageExt};
|
|
use reqwest::{Method, Url};
|
|
use serde::Serialize;
|
|
use serde::de::DeserializeOwned;
|
|
|
|
pub struct Client {
|
|
base_url: Url,
|
|
jwt_token: Option<String>,
|
|
client: reqwest::Client,
|
|
}
|
|
|
|
impl Client {
|
|
pub fn new(http_client: reqwest::Client, base_url: Url, jwt_token: Option<String>) -> Self {
|
|
Self {
|
|
base_url,
|
|
jwt_token,
|
|
client: http_client,
|
|
}
|
|
}
|
|
|
|
/// Simple HTTP request wrapper for calling into storage controller
|
|
pub async fn dispatch<RQ, RS>(
|
|
&self,
|
|
method: Method,
|
|
path: String,
|
|
body: Option<RQ>,
|
|
) -> mgmt_api::Result<RS>
|
|
where
|
|
RQ: Serialize + Sized,
|
|
RS: DeserializeOwned + Sized,
|
|
{
|
|
let request_path = self
|
|
.base_url
|
|
.join(&path)
|
|
.expect("Failed to build request path");
|
|
let mut builder = self.client.request(method, request_path);
|
|
if let Some(body) = body {
|
|
builder = builder.json(&body)
|
|
}
|
|
if let Some(jwt_token) = &self.jwt_token {
|
|
builder = builder.header(
|
|
reqwest::header::AUTHORIZATION,
|
|
format!("Bearer {jwt_token}"),
|
|
);
|
|
}
|
|
|
|
let response = builder.send().await.map_err(mgmt_api::Error::ReceiveBody)?;
|
|
let response = response.error_from_body().await?;
|
|
|
|
response
|
|
.json()
|
|
.await
|
|
.map_err(pageserver_client::mgmt_api::Error::ReceiveBody)
|
|
}
|
|
}
|