Skip to content

Commit 0e5d378

Browse files
author
Guanqun Lu
committed
modify to enum/struct and add test for SslVersionConfig
1 parent cec20e8 commit 0e5d378

File tree

3 files changed

+128
-33
lines changed

3 files changed

+128
-33
lines changed

src/cargo/ops/registry.rs

Lines changed: 14 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use crate::core::source::Source;
1818
use crate::core::{Package, SourceId, Workspace};
1919
use crate::ops;
2020
use crate::sources::{RegistrySource, SourceConfigMap, CRATES_IO_REGISTRY};
21-
use crate::util::config::{self, Config};
21+
use crate::util::config::{self, Config, SslVersionConfig, SslVersionConfigRange};
2222
use crate::util::errors::{CargoResult, CargoResultExt};
2323
use crate::util::important_paths::find_root_manifest_for_wd;
2424
use crate::util::IntoUrl;
@@ -413,16 +413,14 @@ pub fn needs_custom_http_transport(config: &Config) -> CargoResult<bool> {
413413
let cainfo = config.get_path("http.cainfo")?;
414414
let check_revoke = config.get_bool("http.check-revoke")?;
415415
let user_agent = config.get_string("http.user-agent")?;
416-
let has_ssl_version = config.get_string("http.ssl-version")?.is_some()
417-
|| config.get_string("http.ssl-version.min")?.is_some()
418-
|| config.get_string("http.ssl-version.max")?.is_some();
416+
let ssl_version = config.get::<SslVersionConfig>("http.ssl-version")?;
419417

420418
Ok(proxy_exists
421419
|| timeout
422420
|| cainfo.is_some()
423421
|| check_revoke.is_some()
424422
|| user_agent.is_some()
425-
|| has_ssl_version)
423+
|| !ssl_version.is_empty())
426424
}
427425

428426
/// Configure a libcurl http handle with the defaults options for Cargo
@@ -456,34 +454,18 @@ pub fn configure_http_handle(config: &Config, handle: &mut Easy) -> CargoResult<
456454
};
457455
Ok(version)
458456
}
459-
if config.get_string("http.ssl-version")?.is_some()
460-
|| config.get_string("http.ssl-version.min")?.is_some()
461-
|| config.get_string("http.ssl-version.max")?.is_some() {
462-
463-
let mut min_version = SslVersion::Default;
464-
let mut max_version = SslVersion::Default;
465-
466-
// There are two ways to configure `ssl-version`:
467-
// 1. set single `ssl-version`
468-
// [http]
469-
// ssl-version = "tlsv1.3"
470-
if let Some(ssl_version) = config.get_string("http.ssl-version")? {
471-
min_version = to_ssl_version(ssl_version.val.as_str())?;
472-
max_version = min_version;
473-
}
474-
475-
// 2. set min and max of ssl version respectively
476-
// [http]
477-
// ssl-version.min = "tlsv1.2"
478-
// ssl-version.max = "tlsv1.3"
479-
if let Some(ssl_version) = config.get_string("http.ssl-version.min")? {
480-
min_version = to_ssl_version(ssl_version.val.as_str())?;
481-
}
482-
if let Some(ssl_version) = config.get_string("http.ssl-version.max")? {
483-
max_version = to_ssl_version(ssl_version.val.as_str())?;
457+
if let Some(ssl_version) = config.get::<Option<SslVersionConfig>>("http.ssl-version")? {
458+
match ssl_version {
459+
SslVersionConfig::Exactly(s) => {
460+
let version = to_ssl_version(s.as_str())?;
461+
handle.ssl_version(version)?;
462+
},
463+
SslVersionConfig::Range(SslVersionConfigRange{ min, max}) => {
464+
let min_version = min.map_or(Ok(SslVersion::Default), |s| to_ssl_version(s.as_str()))?;
465+
let max_version = max.map_or(Ok(SslVersion::Default), |s| to_ssl_version(s.as_str()))?;
466+
handle.ssl_min_max_version(min_version, max_version)?;
467+
}
484468
}
485-
486-
handle.ssl_min_max_version(min_version, max_version)?;
487469
}
488470

489471
if let Some(true) = config.get::<Option<bool>>("http.debug")? {

src/cargo/util/config.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1854,3 +1854,40 @@ pub fn clippy_driver() -> PathBuf {
18541854
.unwrap_or_else(|_| "clippy-driver".into())
18551855
.into()
18561856
}
1857+
1858+
/// Configuration for `ssl-version` in `http` section
1859+
/// There are two ways to configure:
1860+
///
1861+
/// ```text
1862+
/// [http]
1863+
/// ssl-version = "tlsv.13"
1864+
/// ```
1865+
///
1866+
/// ```text
1867+
/// [http]
1868+
/// ssl-version.min = "tlsv1.2"
1869+
/// ssl-version.max = "tlsv1.3"
1870+
/// ```
1871+
#[derive(Clone, Debug, Deserialize)]
1872+
#[serde(untagged)]
1873+
pub enum SslVersionConfig {
1874+
Exactly(String),
1875+
Range(SslVersionConfigRange),
1876+
}
1877+
1878+
#[derive(Clone, Debug, Deserialize)]
1879+
pub struct SslVersionConfigRange {
1880+
pub min: Option<String>,
1881+
pub max: Option<String>,
1882+
}
1883+
1884+
impl SslVersionConfig {
1885+
pub fn is_empty(&self) -> bool {
1886+
match self {
1887+
SslVersionConfig::Exactly(_) => false,
1888+
SslVersionConfig::Range(SslVersionConfigRange{ min, max}) =>
1889+
min.is_none() && max.is_none(),
1890+
}
1891+
}
1892+
}
1893+

tests/testsuite/config.rs

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::os;
66
use std::path::Path;
77

88
use cargo::core::{enable_nightly_features, Shell};
9-
use cargo::util::config::{self, Config};
9+
use cargo::util::config::{self, Config, SslVersionConfig};
1010
use cargo::util::toml::{self, VecStringOrBool as VSOB};
1111
use cargo_test_support::{paths, project, t};
1212
use serde::Deserialize;
@@ -833,3 +833,79 @@ i64max = 9223372036854775807
833833
invalid value: integer `123456789`, expected i8",
834834
);
835835
}
836+
837+
#[cargo_test]
838+
fn config_get_ssl_version_missing() {
839+
write_config(
840+
"\
841+
[http]
842+
hello = 'world'
843+
",
844+
);
845+
846+
let config = new_config(&[]);
847+
848+
assert!(config.get::<Option<SslVersionConfig>>("http.ssl-version").unwrap().is_none());
849+
850+
let b = config.get_string("http.ssl-version").unwrap();
851+
println!("b: {:?}", if b.is_some() { "some" } else { "none" });
852+
}
853+
854+
#[cargo_test]
855+
fn config_get_ssl_version_exact() {
856+
write_config(
857+
"\
858+
[http]
859+
ssl-version = 'tlsv1.2'
860+
",
861+
);
862+
863+
let config = new_config(&[]);
864+
865+
let a = config.get::<Option<SslVersionConfig>>("http.ssl-version").unwrap().unwrap();
866+
match a {
867+
SslVersionConfig::Exactly(v) => assert_eq!(&v, "tlsv1.2"),
868+
SslVersionConfig::Range(_) => panic!("Did not expect ssl version min/max."),
869+
};
870+
}
871+
872+
#[cargo_test]
873+
fn config_get_ssl_version_min_max() {
874+
write_config(
875+
"\
876+
[http]
877+
ssl-version.min = 'tlsv1.2'
878+
ssl-version.max = 'tlsv1.3'
879+
",
880+
);
881+
882+
let config = new_config(&[]);
883+
884+
let a = config.get::<Option<SslVersionConfig>>("http.ssl-version").unwrap().unwrap();
885+
match a {
886+
SslVersionConfig::Exactly(_) => panic!("Did not expect exact ssl version."),
887+
SslVersionConfig::Range(range) => {
888+
assert_eq!(range.min, Some(String::from("tlsv1.2")));
889+
assert_eq!(range.max, Some(String::from("tlsv1.3")));
890+
}
891+
};
892+
}
893+
894+
#[cargo_test]
895+
fn config_get_ssl_version_both_forms_configured() {
896+
// this is not allowed
897+
write_config(
898+
"\
899+
[http]
900+
ssl-version = 'tlsv1.1'
901+
ssl-version.min = 'tlsv1.2'
902+
ssl-version.max = 'tlsv1.3'
903+
",
904+
);
905+
906+
let config = new_config(&[]);
907+
908+
assert!(config.get::<SslVersionConfig>("http.ssl-version").is_err());
909+
assert!(config.get::<Option<SslVersionConfig>>("http.ssl-version").unwrap().is_none());
910+
}
911+

0 commit comments

Comments
 (0)