Skip to content

Commit d30337b

Browse files
Tom Flennertomflenner
Tom Flenner
authored andcommitted
feat(relayproxy): allow disable VersionHeader middleware
add a boolean EnableVersionHeader in configuration to conditionnally register the VersionHeader custom middleware and disable the header x-gofeatureflag-version issue: thomaspoignant#3140
1 parent a42c902 commit d30337b

File tree

5 files changed

+112
-19
lines changed

5 files changed

+112
-19
lines changed

Diff for: cmd/relayproxy/api/routes_monitoring.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ func (s *Server) addMonitoringRoutes() {
1818
s.monitoringEcho.Debug = s.config.IsDebugEnabled()
1919
s.monitoringEcho.Use(custommiddleware.ZapLogger(s.zapLog, s.config))
2020
s.monitoringEcho.Use(middleware.CORSWithConfig(middleware.DefaultCORSConfig))
21-
s.monitoringEcho.Use(custommiddleware.VersionHeader(s.config))
21+
if s.config.EnableVersionHeader {
22+
s.monitoringEcho.Use(custommiddleware.VersionHeader(s.config))
23+
}
2224
s.monitoringEcho.Use(middleware.Recover())
2325
s.initMonitoringEndpoint(s.monitoringEcho)
2426
} else {

Diff for: cmd/relayproxy/api/server.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,9 @@ func (s *Server) initRoutes() {
7171
}))
7272
}
7373
s.apiEcho.Use(middleware.CORSWithConfig(middleware.DefaultCORSConfig))
74-
s.apiEcho.Use(custommiddleware.VersionHeader(s.config))
74+
if s.config.EnableVersionHeader {
75+
s.apiEcho.Use(custommiddleware.VersionHeader(s.config))
76+
}
7577
s.apiEcho.Use(middleware.Recover())
7678

7779
// Init controllers

Diff for: cmd/relayproxy/api/server_test.go

+71
Original file line numberDiff line numberDiff line change
@@ -218,3 +218,74 @@ func Test_CheckOFREPAPIExists(t *testing.T) {
218218
assert.NoError(t, err)
219219
assert.Equal(t, http.StatusOK, response.StatusCode)
220220
}
221+
222+
func Test_Middleware_VersionHeader_Enabled_Default(t *testing.T) {
223+
proxyConf := &config.Config{
224+
Retriever: &config.RetrieverConf{
225+
Kind: "file",
226+
Path: "../../../testdata/flag-config.yaml",
227+
},
228+
ListenPort: 11024,
229+
}
230+
log := log.InitLogger()
231+
defer func() { _ = log.ZapLogger.Sync() }()
232+
233+
metricsV2, _ := metric.NewMetrics()
234+
wsService := service.NewWebsocketService()
235+
defer wsService.Close()
236+
goff, _ := service.NewGoFeatureFlagClient(proxyConf, log.ZapLogger, nil)
237+
238+
services := service.Services{
239+
MonitoringService: service.NewMonitoring(goff),
240+
WebsocketService: wsService,
241+
GOFeatureFlagService: goff,
242+
Metrics: metricsV2,
243+
}
244+
245+
s := api.New(proxyConf, services, log.ZapLogger)
246+
go func() { s.Start() }()
247+
defer s.Stop(context.Background())
248+
249+
time.Sleep(10 * time.Millisecond)
250+
251+
response, err := http.Get("http://localhost:11024/health")
252+
assert.NoError(t, err)
253+
assert.Equal(t, http.StatusOK, response.StatusCode)
254+
assert.Equal(t, proxyConf.Version, response.Header.Get("X-GOFEATUREFLAG-VERSION"))
255+
}
256+
257+
func Test_VersionHeader_Disabled(t *testing.T) {
258+
proxyConf := &config.Config{
259+
Retriever: &config.RetrieverConf{
260+
Kind: "file",
261+
Path: "../../../testdata/flag-config.yaml",
262+
},
263+
ListenPort: 11024,
264+
EnableVersionHeader: false,
265+
}
266+
log := log.InitLogger()
267+
defer func() { _ = log.ZapLogger.Sync() }()
268+
269+
metricsV2, _ := metric.NewMetrics()
270+
wsService := service.NewWebsocketService()
271+
defer wsService.Close()
272+
goff, _ := service.NewGoFeatureFlagClient(proxyConf, log.ZapLogger, nil)
273+
274+
services := service.Services{
275+
MonitoringService: service.NewMonitoring(goff),
276+
WebsocketService: wsService,
277+
GOFeatureFlagService: goff,
278+
Metrics: metricsV2,
279+
}
280+
281+
s := api.New(proxyConf, services, log.ZapLogger)
282+
go func() { s.Start() }()
283+
defer s.Stop(context.Background())
284+
285+
time.Sleep(10 * time.Millisecond)
286+
287+
response, err := http.Get("http://localhost:11024/health")
288+
assert.NoError(t, err)
289+
assert.Equal(t, http.StatusOK, response.StatusCode)
290+
assert.Empty(t, response.Header.Get("X-GOFEATUREFLAG-VERSION"))
291+
}

Diff for: cmd/relayproxy/config/config.go

+10-5
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,12 @@ func New(flagSet *pflag.FlagSet, log *zap.Logger, version string) (*Config, erro
6363

6464
// Default values
6565
_ = k.Load(confmap.Provider(map[string]interface{}{
66-
"listen": "1031",
67-
"host": "localhost",
68-
"fileFormat": "yaml",
69-
"pollingInterval": 60000,
70-
"logLevel": DefaultLogLevel,
66+
"listen": "1031",
67+
"host": "localhost",
68+
"fileFormat": "yaml",
69+
"pollingInterval": 60000,
70+
"logLevel": DefaultLogLevel,
71+
"enableVersionHeader": true,
7172
}, "."), nil)
7273

7374
// mapping command line parameters to koanf
@@ -262,6 +263,10 @@ type Config struct {
262263
// Version is the version of the relay-proxy
263264
Version string `mapstructure:"version" koanf:"version"`
264265

266+
// Enable x-gofeatureflag-version header in the relay-proxy HTTP response
267+
// Default: true
268+
EnableVersionHeader bool `mapstructure:"enableVersionHeader" koanf:"enableversionheader"`
269+
265270
// Deprecated: use AuthorizedKeys instead
266271
// APIKeys list of API keys that authorized to use endpoints
267272
APIKeys []string `mapstructure:"apiKeys" koanf:"apikeys"`

Diff for: cmd/relayproxy/config/config_test.go

+25-12
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ func TestParseConfig_fileFromPflag(t *testing.T) {
3838
},
3939
StartWithRetrieverError: false,
4040
Version: "1.X.X",
41+
EnableVersionHeader: true,
4142
EnableSwagger: true,
4243
AuthorizedKeys: config.APIKeys{
4344
Admin: []string{
@@ -75,6 +76,7 @@ func TestParseConfig_fileFromPflag(t *testing.T) {
7576
},
7677
StartWithRetrieverError: false,
7778
Version: "1.X.X",
79+
EnableVersionHeader: true,
7880
EnableSwagger: true,
7981
AuthorizedKeys: config.APIKeys{
8082
Admin: nil,
@@ -104,6 +106,7 @@ func TestParseConfig_fileFromPflag(t *testing.T) {
104106
},
105107
StartWithRetrieverError: false,
106108
Version: "1.X.X",
109+
EnableVersionHeader: true,
107110
EnableSwagger: true,
108111
APIKeys: []string{
109112
"apikey1",
@@ -131,6 +134,7 @@ func TestParseConfig_fileFromPflag(t *testing.T) {
131134
},
132135
StartWithRetrieverError: false,
133136
Version: "1.X.X",
137+
EnableVersionHeader: true,
134138
EnableSwagger: true,
135139
APIKeys: []string{
136140
"apikey1",
@@ -150,6 +154,7 @@ func TestParseConfig_fileFromPflag(t *testing.T) {
150154
Host: "localhost",
151155
StartWithRetrieverError: false,
152156
Version: "1.X.X",
157+
EnableVersionHeader: true,
153158
LogLevel: config.DefaultLogLevel,
154159
},
155160
wantErr: assert.NoError,
@@ -163,12 +168,13 @@ func TestParseConfig_fileFromPflag(t *testing.T) {
163168
name: "Valid YAML with OTel config",
164169
fileLocation: "../testdata/config/valid-otel.yaml",
165170
want: &config.Config{
166-
ListenPort: 1031,
167-
PollingInterval: 60000,
168-
FileFormat: "yaml",
169-
Host: "localhost",
170-
LogLevel: config.DefaultLogLevel,
171-
Version: "1.X.X",
171+
ListenPort: 1031,
172+
PollingInterval: 60000,
173+
FileFormat: "yaml",
174+
Host: "localhost",
175+
LogLevel: config.DefaultLogLevel,
176+
Version: "1.X.X",
177+
EnableVersionHeader: true,
172178
Retrievers: &[]config.RetrieverConf{
173179
{
174180
Kind: "file",
@@ -233,6 +239,7 @@ func TestParseConfig_fileFromFolder(t *testing.T) {
233239
},
234240
StartWithRetrieverError: false,
235241
Version: "1.X.X",
242+
EnableVersionHeader: true,
236243
EnableSwagger: true,
237244
AuthorizedKeys: config.APIKeys{
238245
Admin: []string{
@@ -257,6 +264,7 @@ func TestParseConfig_fileFromFolder(t *testing.T) {
257264
Host: "localhost",
258265
StartWithRetrieverError: false,
259266
Version: "1.X.X",
267+
EnableVersionHeader: true,
260268
LogLevel: config.DefaultLogLevel,
261269
},
262270
wantErr: assert.NoError,
@@ -277,6 +285,7 @@ func TestParseConfig_fileFromFolder(t *testing.T) {
277285
Host: "localhost",
278286
StartWithRetrieverError: false,
279287
Version: "1.X.X",
288+
EnableVersionHeader: true,
280289
LogLevel: config.DefaultLogLevel,
281290
},
282291
},
@@ -291,6 +300,7 @@ func TestParseConfig_fileFromFolder(t *testing.T) {
291300
Host: "localhost",
292301
StartWithRetrieverError: false,
293302
Version: "1.X.X",
303+
EnableVersionHeader: true,
294304
LogLevel: config.DefaultLogLevel,
295305
},
296306
},
@@ -305,6 +315,7 @@ func TestParseConfig_fileFromFolder(t *testing.T) {
305315
Host: "localhost",
306316
StartWithRetrieverError: false,
307317
Version: "1.X.X",
318+
EnableVersionHeader: true,
308319
LogLevel: config.DefaultLogLevel,
309320
},
310321
disableDefaultFileCreation: true,
@@ -827,6 +838,7 @@ func TestMergeConfig_FromOSEnv(t *testing.T) {
827838
},
828839
StartWithRetrieverError: false,
829840
Version: "1.X.X",
841+
EnableVersionHeader: true,
830842
EnableSwagger: true,
831843
AuthorizedKeys: config.APIKeys{
832844
Admin: []string{
@@ -854,12 +866,13 @@ func TestMergeConfig_FromOSEnv(t *testing.T) {
854866
fileLocation: "../testdata/config/valid-otel.yaml",
855867
disableDefaultFileCreation: true,
856868
want: &config.Config{
857-
ListenPort: 1031,
858-
PollingInterval: 60000,
859-
FileFormat: "yaml",
860-
Host: "localhost",
861-
LogLevel: config.DefaultLogLevel,
862-
Version: "1.X.X",
869+
ListenPort: 1031,
870+
PollingInterval: 60000,
871+
FileFormat: "yaml",
872+
Host: "localhost",
873+
LogLevel: config.DefaultLogLevel,
874+
Version: "1.X.X",
875+
EnableVersionHeader: true,
863876
Retrievers: &[]config.RetrieverConf{
864877
{
865878
Kind: "file",

0 commit comments

Comments
 (0)