@@ -6,10 +6,12 @@ use open_feature::provider::{FeatureProvider, ProviderMetadata, ResolutionDetail
6
6
use open_feature:: { EvaluationContext , EvaluationError , StructValue } ;
7
7
use reqwest:: header:: HeaderMap ;
8
8
use resolver:: Resolver ;
9
+ use std:: fmt;
9
10
use std:: sync:: Arc ;
10
11
use std:: time:: Duration ;
11
12
use tracing:: debug;
12
13
use tracing:: instrument;
14
+ use url:: Url ;
13
15
14
16
use async_trait:: async_trait;
15
17
@@ -37,10 +39,30 @@ pub struct OfrepProvider {
37
39
provider : Arc < dyn FeatureProvider + Send + Sync > ,
38
40
}
39
41
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
+
40
50
impl OfrepProvider {
41
51
#[ instrument( skip( options) ) ]
42
52
pub async fn new ( options : OfrepOptions ) -> Result < Self , OfrepError > {
43
53
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
+
44
66
Ok ( Self {
45
67
provider : Arc :: new ( Resolver :: new ( & options) ) ,
46
68
} )
@@ -93,3 +115,36 @@ impl FeatureProvider for OfrepProvider {
93
115
self . provider . resolve_struct_value ( flag_key, context) . await
94
116
}
95
117
}
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
+ } )
130
+ . await ;
131
+
132
+ let provider_with_invalid_scheme = OfrepProvider :: new ( OfrepOptions {
133
+ base_url : "invalid://" . to_string ( ) ,
134
+ ..Default :: default ( )
135
+ } )
136
+ . await ;
137
+
138
+ assert ! ( provider_with_empty_host. is_err( ) ) ;
139
+ assert ! ( provider_with_invalid_scheme. is_err( ) ) ;
140
+
141
+ assert_eq ! (
142
+ provider_with_empty_host. unwrap_err( ) ,
143
+ OfrepError :: Config ( "Invalid base url: 'http://' (empty host)" . to_string( ) )
144
+ ) ;
145
+ assert_eq ! (
146
+ provider_with_invalid_scheme. unwrap_err( ) ,
147
+ OfrepError :: Config ( "Invalid base url: 'invalid' (unsupported scheme)" . to_string( ) )
148
+ ) ;
149
+ }
150
+ }
0 commit comments