mirror of
https://github.com/dani-garcia/vaultwarden.git
synced 2026-10-30 08:55:23 +00:00
Route service clients through shared HTTP setup (#7639)
* storage: route OpenDAL through HTTP client OpenDAL 0.58 requires applications to provide an HTTP transport. Its default installer creates a standalone client, bypassing Vaultwarden DNS, redirect, proxy, timeout, and request configuration. Build the client through the internal HTTP interface and inject it into OpenDAL's public reqwest transport. * http: honor block setting on redirects Clients can disable host blocking for administrator-configured private services. DNS resolution honors this setting, but the redirect policy still performs config-backed host checks. Capture the setting in the redirect policy and skip those checks when blocking is disabled. This also avoids re-entering CONFIG when a remote configuration request is redirected during startup. * http: make DNS setup bootstrap-safe Remote configuration can require an HTTP client while CONFIG is still initializing. Building the DNS resolver currently reads CONFIG.dns_prefer_ipv6(), so loading an S3-backed config can deadlock. Build one resolver without consulting CONFIG. Order addresses for each lookup using the merged setting when available, falling back to the environment and then IPv4-first during bootstrap. * aws: use internal HTTP client The AWS SDK connector builds a raw reqwest client, bypassing Vaultwarden TLS, DNS, redirect, proxy, timeout, and request setup. Construct it through the internal HTTP client interface and retain the standard ten-second request deadline. Permit private AWS metadata and service endpoints by disabling non-global IP blocking. Preserve timeout errors when adapting reqwest failures to the AWS SDK so the runtime receives the correct connector error category. * Added comment for the prefer IPv function Signed-off-by: BlackDex <black.dex@gmail.com> --------- Signed-off-by: BlackDex <black.dex@gmail.com> Co-authored-by: BlackDex <black.dex@gmail.com>
This commit is contained in:
1 parent
de7abaaafa
commit
5b51b60f94
4 files changed
+102
-21
No files matched your search
+12
-7
@@ -77,10 +77,18 @@ pub(crate) fn operator_for_path(path: &str) -> Result<opendal::Operator, crate::
|
||||
|
||||
#[cfg(s3)]
|
||||
mod s3 {
|
||||
use std::sync::LazyLock;
|
||||
|
||||
use opendal_http_transport_reqwest::ReqwestTransport;
|
||||
use reqwest::Url;
|
||||
|
||||
use crate::error::Error;
|
||||
|
||||
static HTTP_CLIENT: LazyLock<reqwest::Client> = LazyLock::new(|| {
|
||||
// Storage endpoints are administrator-configured and may be private.
|
||||
crate::http_client::get_reqwest_client_builder(false).build().expect("Failed to build OpenDAL HTTP client")
|
||||
});
|
||||
|
||||
pub(super) fn is_uri(path: &str) -> bool {
|
||||
path.starts_with("s3://")
|
||||
}
|
||||
@@ -177,12 +185,7 @@ mod s3 {
|
||||
|
||||
let chain = DEFAULT_CREDENTIAL_CHAIN
|
||||
.get_or_init(|| {
|
||||
let reqwest_client = reqwest::Client::builder().build().unwrap();
|
||||
let connector = AwsReqwestConnector {
|
||||
client: reqwest_client,
|
||||
};
|
||||
|
||||
let conf = ProviderConfig::default().with_http_client(connector);
|
||||
let conf = ProviderConfig::default().with_http_client(AwsReqwestConnector::new());
|
||||
|
||||
DefaultCredentialsChain::builder().configure(conf).build()
|
||||
})
|
||||
@@ -236,7 +239,9 @@ mod s3 {
|
||||
builder.credential_provider_chain(ProvideCredentialChain::new().push(OpenDALS3CredentialProvider));
|
||||
}
|
||||
|
||||
Ok(opendal::Operator::new(builder)?)
|
||||
let http_transport = opendal::HttpTransporter::new(ReqwestTransport::new(HTTP_CLIENT.clone()));
|
||||
let context = opendal::OperationContext::new().with_http_transport(http_transport);
|
||||
Ok(opendal::Operator::new(builder)?.with_context(context))
|
||||
}
|
||||
|
||||
fn uri_has_option(uri: &opendal::OperatorUri, names: &[&str]) -> bool {
|
||||
|
||||
Reference in new issue
Block a user