11use anyhow:: Context ;
22use reqwest:: { header, tls:: Version } ;
3+ use serde:: Deserialize ;
34use std:: path:: PathBuf ;
45
56const USER_AGENT : & str = concat ! ( "OIDC-CLI/" , env!( "CARGO_PKG_VERSION" ) ) ;
67
7- #[ derive( Copy , Clone , Eq , PartialEq , Ord , PartialOrd , Debug , clap:: ValueEnum ) ]
8+ #[ derive( Copy , Clone , Eq , PartialEq , Ord , PartialOrd , Debug , clap:: ValueEnum , Deserialize ) ]
89pub enum TlsVersion {
910 /// TLS 1.0
1011 #[ value( name( "1.0" ) ) ]
12+ #[ serde( rename = "1.0" ) ]
1113 Tls1_0 ,
1214 /// TLS 1.1
1315 #[ value( name( "1.1" ) ) ]
16+ #[ serde( rename = "1.1" ) ]
1417 Tls1_1 ,
1518 /// TLS 1.2
1619 #[ value( name( "1.2" ) ) ]
20+ #[ serde( rename = "1.2" ) ]
1721 Tls1_2 ,
1822 /// TLS 1.3
1923 #[ value( name( "1.3" ) ) ]
24+ #[ serde( rename = "1.3" ) ]
2025 Tls1_3 ,
2126}
2227
@@ -32,8 +37,9 @@ impl From<TlsVersion> for Version {
3237}
3338
3439/// HTTP client options
35- #[ derive( Clone , Debug , PartialEq , Eq , clap:: Args ) ]
40+ #[ derive( Clone , Debug , PartialEq , Eq , clap:: Args , Deserialize ) ]
3641#[ command( next_help_heading = "HTTP client options" ) ]
42+ #[ serde( default ) ]
3743pub struct HttpOptions {
3844 /// Disable TLS validation (INSECURE!)
3945 #[ arg( long) ]
@@ -49,17 +55,64 @@ pub struct HttpOptions {
4955
5056 /// Connect timeout
5157 #[ arg( long, default_value = "30s" ) ]
58+ #[ serde(
59+ default = "default::connect_timeout" ,
60+ deserialize_with = "deserialize_duration"
61+ ) ]
5262 pub connect_timeout : humantime:: Duration ,
5363
5464 /// Request timeout
5565 #[ arg( long, default_value = "60s" , short = 't' ) ]
66+ #[ serde(
67+ default = "default::timeout" ,
68+ deserialize_with = "deserialize_duration"
69+ ) ]
5670 pub timeout : humantime:: Duration ,
5771
5872 /// Minimum TLS version
5973 #[ arg( long, value_enum, default_value_t = TlsVersion :: Tls1_2 ) ]
74+ #[ serde( default = "default::min_tls_version" ) ]
6075 pub min_tls_version : TlsVersion ,
6176}
6277
78+ impl Default for HttpOptions {
79+ fn default ( ) -> Self {
80+ Self {
81+ tls_insecure : false ,
82+ additional_root_certificates : Vec :: new ( ) ,
83+ disable_system_certificates : false ,
84+ connect_timeout : default:: connect_timeout ( ) ,
85+ timeout : default:: timeout ( ) ,
86+ min_tls_version : default:: min_tls_version ( ) ,
87+ }
88+ }
89+ }
90+
91+ mod default {
92+ use super :: TlsVersion ;
93+
94+ pub ( super ) fn connect_timeout ( ) -> humantime:: Duration {
95+ std:: time:: Duration :: from_secs ( 30 ) . into ( )
96+ }
97+
98+ pub ( super ) fn timeout ( ) -> humantime:: Duration {
99+ std:: time:: Duration :: from_secs ( 60 ) . into ( )
100+ }
101+
102+ pub ( super ) fn min_tls_version ( ) -> TlsVersion {
103+ TlsVersion :: Tls1_2
104+ }
105+ }
106+
107+ fn deserialize_duration < ' de , D > ( deserializer : D ) -> Result < humantime:: Duration , D :: Error >
108+ where
109+ D : serde:: Deserializer < ' de > ,
110+ {
111+ String :: deserialize ( deserializer) ?
112+ . parse ( )
113+ . map_err ( serde:: de:: Error :: custom)
114+ }
115+
63116/// A common way to create an HTTP client
64117pub async fn create_client ( options : & HttpOptions ) -> anyhow:: Result < reqwest:: Client > {
65118 let mut headers = header:: HeaderMap :: new ( ) ;
0 commit comments