@@ -10,6 +10,8 @@ use std::sync::Arc;
1010use std:: time:: Duration ;
1111use tracing:: debug;
1212use tracing:: instrument;
13+ use url:: Url ;
14+ use std:: fmt;
1315
1416use async_trait:: async_trait;
1517
@@ -37,10 +39,30 @@ pub struct OfrepProvider {
3739 provider : Arc < dyn FeatureProvider + Send + Sync > ,
3840}
3941
42+ impl fmt:: Debug for OfrepProvider {
43+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
44+ f. debug_struct ( "OfrepProvider" )
45+ . field ( "provider" , & "<FeatureProvider>" )
46+ . finish ( )
47+ }
48+ }
49+
4050impl OfrepProvider {
4151 #[ instrument( skip( options) ) ]
4252 pub async fn new ( options : OfrepOptions ) -> Result < Self , OfrepError > {
4353 debug ! ( "Initializing OfrepProvider with options: {:?}" , options) ;
54+
55+ let url = Url :: parse ( & options. base_url ) . map_err ( |e| {
56+ OfrepError :: Config ( format ! ( "Invalid base url: '{}' ({})" , options. base_url, e) )
57+ } ) ?;
58+
59+ if !matches ! ( url. scheme( ) , "http" | "https" ) {
60+ return Err ( OfrepError :: Config ( format ! (
61+ "Invalid base url: '{}' (unsupported scheme)" ,
62+ url. scheme( )
63+ ) ) ) ;
64+ }
65+
4466 Ok ( Self {
4567 provider : Arc :: new ( Resolver :: new ( & options) ) ,
4668 } )
@@ -93,3 +115,28 @@ impl FeatureProvider for OfrepProvider {
93115 self . provider . resolve_struct_value ( flag_key, context) . await
94116 }
95117}
118+
119+ #[ cfg( test) ]
120+ mod tests {
121+ use super :: * ;
122+ use test_log:: test;
123+
124+ #[ test( tokio:: test) ]
125+ async fn test_ofrep_options_validation ( ) {
126+ let provider_with_empty_host = OfrepProvider :: new ( OfrepOptions {
127+ base_url : "http://" . to_string ( ) ,
128+ ..Default :: default ( )
129+ } ) . await ;
130+
131+ let provider_with_invalid_scheme = OfrepProvider :: new ( OfrepOptions {
132+ base_url : "invalid://" . to_string ( ) ,
133+ ..Default :: default ( )
134+ } ) . await ;
135+
136+ assert ! ( provider_with_empty_host. is_err( ) ) ;
137+ assert ! ( provider_with_invalid_scheme. is_err( ) ) ;
138+
139+ assert_eq ! ( provider_with_empty_host. unwrap_err( ) , OfrepError :: Config ( "Invalid base url: 'http://' (empty host)" . to_string( ) ) ) ;
140+ assert_eq ! ( provider_with_invalid_scheme. unwrap_err( ) , OfrepError :: Config ( "Invalid base url: 'invalid' (unsupported scheme)" . to_string( ) ) ) ;
141+ }
142+ }
0 commit comments