1
0
mirror of https://github.com/matrix-org/matrix-authentication-service.git synced 2025-08-09 04:22:45 +03:00

Remove the client features from mas-oidc-client and replace it in tests

This commit is contained in:
Quentin Gliech
2024-07-01 19:18:15 +02:00
parent ea85be55e6
commit dcb9bdeecf
6 changed files with 20 additions and 105 deletions

9
Cargo.lock generated
View File

@@ -3595,9 +3595,7 @@ dependencies = [
"futures-util",
"headers",
"http 1.1.0",
"http-body 1.0.0",
"hyper 1.4.0",
"hyper-rustls",
"http-body-util",
"language-tags",
"mas-http",
"mas-iana",
@@ -3607,8 +3605,6 @@ dependencies = [
"oauth2-types",
"rand",
"rand_chacha",
"rustls 0.23.10",
"rustls-platform-verifier",
"serde",
"serde_json",
"serde_urlencoded",
@@ -3616,7 +3612,6 @@ dependencies = [
"thiserror",
"tokio",
"tower",
"tower-http 0.4.4",
"tracing",
"url",
"wiremock",
@@ -6423,14 +6418,12 @@ dependencies = [
"http-body 0.4.6",
"http-range-header",
"httpdate",
"iri-string",
"mime",
"mime_guess",
"percent-encoding",
"pin-project-lite",
"tokio",
"tokio-util",
"tower",
"tower-layer",
"tower-service",
"tracing",

View File

@@ -16,7 +16,7 @@ use std::time::Duration;
use headers::{ContentLength, HeaderMapExt, Host, UserAgent};
use http::{header::USER_AGENT, HeaderValue, Request, Response};
use hyper::client::connect::HttpInfo;
use hyper_util::client::legacy::connect::HttpInfo;
use mas_tower::{
DurationRecorderLayer, DurationRecorderService, EnrichSpan, InFlightCounterLayer,
InFlightCounterService, MakeSpan, MetricsAttributes, TraceContextLayer, TraceContextService,

View File

@@ -12,16 +12,7 @@ repository.workspace = true
workspace = true
[features]
default = ["hyper", "keystore"]
hyper = [
"dep:http-body",
"dep:hyper",
"dep:hyper-rustls",
"dep:rustls",
"dep:rustls-platform-verifier",
"dep:tower-http",
"tower/limit",
]
default = ["keystore"]
keystore = ["dep:mas-keystore"]
[dependencies]
@@ -50,18 +41,6 @@ mas-jose.workspace = true
mas-keystore = { workspace = true, optional = true }
oauth2-types.workspace = true
# Default http service
http-body = { workspace = true, optional = true }
hyper = { workspace = true, optional = true }
hyper-rustls = { workspace = true, optional = true }
rustls = { workspace = true, optional = true }
rustls-platform-verifier = { workspace = true, optional = true }
[dependencies.tower-http]
version = "0.4.4"
features = ["follow-redirect", "set-header", "timeout", "map-request-body", "util"]
optional = true
[dev-dependencies]
assert_matches = "1.5.0"
bitflags = "2.6.0"
@@ -69,3 +48,6 @@ mas-keystore.workspace = true
rand_chacha = "0.3.1"
tokio.workspace = true
wiremock = "0.6.0"
http-body-util.workspace = true
mas-http = { workspace = true, features = ["client"] }

View File

@@ -15,7 +15,4 @@
//! Reexports of traits to implement to provide a custom HTTP service for
//! `Client`.
#[cfg(feature = "hyper")]
pub mod hyper;
pub use mas_http::{BoxCloneSyncService, HttpService};

View File

@@ -1,69 +0,0 @@
// Copyright 2022 Kévin Commaille.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! A [`HttpService`] that uses [hyper] as a backend.
//!
//! [hyper]: https://crates.io/crates/hyper
use std::time::Duration;
use http::{header::USER_AGENT, HeaderValue};
use http_body::Full;
use hyper::client::{connect::dns::GaiResolver, HttpConnector};
use hyper_rustls::HttpsConnectorBuilder;
use mas_http::BodyToBytesResponseLayer;
use tower::{BoxError, ServiceBuilder};
use tower_http::{timeout::TimeoutLayer, ServiceBuilderExt};
use super::HttpService;
static MAS_USER_AGENT: HeaderValue = HeaderValue::from_static("mas-oidc-client/0.0.1");
/// Constructs a [`HttpService`] using [hyper] as a backend.
///
/// # Panics
///
/// If the native TLS root certificates fail to load
///
/// [hyper]: https://crates.io/crates/hyper
#[must_use]
pub fn hyper_service() -> HttpService {
let resolver = ServiceBuilder::new().service(GaiResolver::new());
let mut http = HttpConnector::new_with_resolver(resolver);
http.enforce_http(false);
let tls_config = rustls_platform_verifier::tls_config();
let https = HttpsConnectorBuilder::new()
.with_tls_config(tls_config)
.https_or_http()
.enable_http1()
.enable_http2()
.wrap_connector(http);
let client = hyper::Client::builder().build(https);
let client = ServiceBuilder::new()
.map_err(BoxError::from)
.map_request_body(Full::new)
.layer(BodyToBytesResponseLayer)
.override_request_header(USER_AGENT, MAS_USER_AGENT.clone())
.concurrency_limit(10)
.follow_redirects()
.layer(TimeoutLayer::new(Duration::from_secs(10)))
.service(client);
HttpService::new(client)
}

View File

@@ -15,6 +15,8 @@
use std::collections::HashMap;
use chrono::{DateTime, Duration, Utc};
use http_body_util::Full;
use mas_http::{BodyToBytesResponseLayer, BoxCloneSyncService};
use mas_iana::{jose::JsonWebSignatureAlg, oauth::OAuthClientAuthenticationMethod};
use mas_jose::{
claims::{self, hash_token},
@@ -24,7 +26,7 @@ use mas_jose::{
};
use mas_keystore::{JsonWebKey, JsonWebKeySet, Keystore, PrivateKey};
use mas_oidc_client::{
http_service::{hyper::hyper_service, HttpService},
http_service::HttpService,
types::{
client_credentials::{ClientCredentials, JwtSigningFn, JwtSigningMethod},
IdToken,
@@ -34,6 +36,10 @@ use rand::{
distributions::{Alphanumeric, DistString},
SeedableRng,
};
use tower::{
util::{MapErrLayer, MapRequestLayer},
BoxError, Layer,
};
use url::Url;
use wiremock::MockServer;
@@ -58,7 +64,13 @@ fn now() -> DateTime<Utc> {
}
async fn init_test() -> (HttpService, MockServer, Url) {
let http_service = hyper_service();
let http_service = (
MapErrLayer::new(BoxError::from),
MapRequestLayer::new(|req: http::Request<_>| req.map(Full::new)),
BodyToBytesResponseLayer,
)
.layer(mas_http::make_untraced_client());
let http_service = BoxCloneSyncService::new(http_service);
let mock_server = MockServer::start().await;
let issuer = Url::parse(&mock_server.uri()).expect("Couldn't parse URL");