Skip to content

Commit b0dd00b

Browse files
committed
fix: when using rustls-no-provider with reqwest we need to set a crypto provider
1 parent eb591a6 commit b0dd00b

4 files changed

Lines changed: 38 additions & 3 deletions

File tree

compatibility-suite/tests/v4_steps/http_provider.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ async fn the_verification_is_run(world: &mut V4World) -> anyhow::Result<()> {
260260
if rustls::crypto::CryptoProvider::get_default().is_none() {
261261
let _ = rustls::crypto::ring::default_provider().install_default();
262262
}
263-
263+
264264
let options = VerificationOptions::<ProviderWorldRequestFilter>::default();
265265
world.verification_results = verify_provider_async(
266266
world.provider_info.clone(),

rust/pact_ffi/tests/tests.rs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use chrono::Local;
1414
use expectest::prelude::*;
1515
use itertools::Itertools;
1616
use libc::c_char;
17-
use log::LevelFilter;
17+
use log::{warn, LevelFilter};
1818
use maplit::*;
1919
use multipart_2021 as multipart;
2020
use pretty_assertions::assert_eq;
@@ -483,6 +483,8 @@ fn add_interaction_reference() {
483483

484484
#[test_log::test]
485485
fn http_consumer_feature_test() {
486+
init_crypto();
487+
486488
let consumer_name = CString::new("http-consumer").unwrap();
487489
let provider_name = CString::new("http-provider").unwrap();
488490
let pact_handle = pactffi_new_pact(consumer_name.as_ptr(), provider_name.as_ptr());
@@ -560,6 +562,8 @@ fn http_consumer_feature_test() {
560562
#[test]
561563
#[allow(deprecated)]
562564
fn http_xml_consumer_feature_test() {
565+
init_crypto();
566+
563567
let consumer_name = CString::new("http-consumer").unwrap();
564568
let provider_name = CString::new("http-provider").unwrap();
565569
let pact_handle = pactffi_new_pact(consumer_name.as_ptr(), provider_name.as_ptr());
@@ -682,6 +686,8 @@ fn message_xml_consumer_feature_test() {
682686

683687
#[test]
684688
fn http_xml_consumer_with_examples_and_content_test() {
689+
init_crypto();
690+
685691
let consumer_name = CString::new("http-consumer").unwrap();
686692
let provider_name = CString::new("http-provider").unwrap();
687693
let pact_handle = pactffi_new_pact(consumer_name.as_ptr(), provider_name.as_ptr());
@@ -857,6 +863,8 @@ fn pactffi_with_binary_file_feature_test(specification: PactSpecification, expec
857863
#[test_log::test]
858864
#[allow(deprecated)]
859865
fn http_verification_from_directory_feature_test() {
866+
init_crypto();
867+
860868
let name = CString::new("tests").unwrap();
861869
let version = CString::new("1.0.0").unwrap();
862870
let handle = pactffi_verifier_new_for_application(name.as_ptr(), version.as_ptr());
@@ -908,6 +916,8 @@ fn test_missing_plugin() {
908916
// Issue #299
909917
#[test_log::test]
910918
fn each_value_matcher() {
919+
init_crypto();
920+
911921
let consumer_name = CString::new("each_value_matcher-consumer").unwrap();
912922
let provider_name = CString::new("each_value_matcher-provider").unwrap();
913923
let pact_handle = pactffi_new_pact(consumer_name.as_ptr(), provider_name.as_ptr());
@@ -973,6 +983,8 @@ fn each_value_matcher() {
973983
// Issue #301
974984
#[test_log::test]
975985
fn each_key_matcher() {
986+
init_crypto();
987+
976988
let consumer_name = CString::new("each_key_matcher-consumer").unwrap();
977989
let provider_name = CString::new("each_key_matcher-provider").unwrap();
978990
let pact_handle = pactffi_new_pact(consumer_name.as_ptr(), provider_name.as_ptr());
@@ -1046,6 +1058,8 @@ fn each_key_matcher() {
10461058
// Issue #324
10471059
#[test_log::test]
10481060
fn array_contains_matcher() {
1061+
init_crypto();
1062+
10491063
let consumer_name = CString::new("array_contains_matcher-consumer").unwrap();
10501064
let provider_name = CString::new("array_contains_matcher-provider").unwrap();
10511065
let pact_handle = pactffi_new_pact(consumer_name.as_ptr(), provider_name.as_ptr());
@@ -1122,6 +1136,14 @@ fn array_contains_matcher() {
11221136
])));
11231137
}
11241138

1139+
fn init_crypto() {
1140+
if rustls::crypto::CryptoProvider::get_default().is_none() {
1141+
if let Err(_) = rustls::crypto::ring::default_provider().install_default() {
1142+
warn!("failed to installed the default crypto provider");
1143+
}
1144+
}
1145+
}
1146+
11251147
// Issue #332
11261148
#[test_log::test]
11271149
#[allow(deprecated)]
@@ -1795,6 +1817,8 @@ fn provider_states_ignoring_parameter_types() {
17951817
// Issue #399
17961818
#[test_log::test]
17971819
fn combined_each_key_and_each_value_matcher() {
1820+
init_crypto();
1821+
17981822
let consumer_name = CString::new("combined_matcher-consumer").unwrap();
17991823
let provider_name = CString::new("combined_matcher-provider").unwrap();
18001824
let pact_handle = pactffi_new_pact(consumer_name.as_ptr(), provider_name.as_ptr());
@@ -1991,6 +2015,8 @@ fn returns_mock_server_logs() {
19912015
#[test]
19922016
#[allow(deprecated)]
19932017
fn http_form_urlencoded_consumer_feature_test() {
2018+
init_crypto();
2019+
19942020
let consumer_name = CString::new("http-consumer").unwrap();
19952021
let provider_name = CString::new("http-provider").unwrap();
19962022
let pact_handle = pactffi_new_pact(consumer_name.as_ptr(), provider_name.as_ptr());
@@ -2303,6 +2329,8 @@ fn mime_multipart() {
23032329
// Response returns current date in the provided format when pact:generator:type is present in date matcher
23042330
#[test_log::test]
23052331
fn date_matcher_in_response_body_with_generator_type() {
2332+
init_crypto();
2333+
23062334
let consumer_name = CString::new("date-consumer").unwrap();
23072335
let provider_name = CString::new("date-provider").unwrap();
23082336
let pact_handle = pactffi_new_pact(consumer_name.as_ptr(), provider_name.as_ptr());
@@ -2378,6 +2406,8 @@ fn date_matcher_in_response_body_with_generator_type() {
23782406
// Response returns provided date value itself when pact:generator:type is not provided in date matcher
23792407
#[test_log::test]
23802408
fn date_matcher_in_response_body_without_generator_type() {
2409+
init_crypto();
2410+
23812411
let consumer_name = CString::new("date-consumer").unwrap();
23822412
let provider_name = CString::new("date-provider").unwrap();
23832413
let pact_handle = pactffi_new_pact(consumer_name.as_ptr(), provider_name.as_ptr());

rust/pact_verifier/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ uuid = { version = "1.24.0", features = ["v4"], optional = true }
4242
regex = "1.13.1"
4343
httpdate = "1.0.3"
4444
reqwest = { version = "0.13.4", default-features = false, features = ["rustls-no-provider", "blocking", "json", "query"] }
45+
rustls = { version = "0.23.43", features = ["ring"] }
4546
serde = "1.0.229"
4647
serde_json = "1.0.151"
4748
serde_with = { version = "3.21.0", features = ["json"] }
@@ -66,6 +67,5 @@ pretty_assertions = "1.4.1"
6667
quickcheck = "1.1.0"
6768
insta = "1.48.0"
6869
rstest = "0.26.1"
69-
rustls = { version = "0.23.43", features = ["ring"] }
7070
test-log = { version = "0.2.21", features = ["trace"] }
7171
tracing-subscriber = { version = "0.3.23", features = ["env-filter", "tracing-log", "fmt"] }

rust/pact_verifier/src/lib.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -702,6 +702,11 @@ async fn execute_provider_states<S: ProviderStateExecutor>(
702702
pub(crate) fn configure_http_client<F: RequestFilterExecutor>(
703703
options: &VerificationOptions<F>
704704
) -> anyhow::Result<Client> {
705+
if rustls::crypto::CryptoProvider::get_default().is_none() {
706+
if let Err(_) = rustls::crypto::ring::default_provider().install_default() {
707+
warn!("failed to installed the default crypto provider");
708+
}
709+
}
705710
let mut client_builder = reqwest::Client::builder()
706711
.user_agent(concat!(env!("CARGO_PKG_NAME"), "/", env!("CARGO_PKG_VERSION")))
707712
.danger_accept_invalid_certs(options.disable_ssl_verification)

0 commit comments

Comments
 (0)