Skip to content

Commit 3d32bb7

Browse files
Tom Flennertomflenner
Tom Flenner
authored andcommitted
feat(relayproxy): allow disable VersionHeader middleware
add a boolean DisableVersionHeader in configuration with Skipper on the VersionHeader middleware to issue: thomaspoignant#3140
1 parent d30337b commit 3d32bb7

File tree

7 files changed

+88
-46
lines changed

7 files changed

+88
-46
lines changed

cmd/relayproxy/api/middleware/version.go

+31-3
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,43 @@ package middleware
22

33
import (
44
"github.com/labstack/echo/v4"
5+
"github.com/labstack/echo/v4/middleware"
56
"github.com/thomaspoignant/go-feature-flag/cmd/relayproxy/config"
67
)
78

8-
// VersionHeader is a middleware that adds the version of the relayproxy in the header
9-
func VersionHeader(config *config.Config) echo.MiddlewareFunc {
9+
// VersionHeaderConfig defines the configuration for the middleware.
10+
type VersionHeaderConfig struct {
11+
Skipper middleware.Skipper
12+
RelayProxyConfig *config.Config
13+
}
14+
15+
// VersionHeader is a middleware that adds the version of the relayproxy in the header.
16+
func VersionHeader(cfg VersionHeaderConfig) echo.MiddlewareFunc {
17+
// Use provided skipper or fallback to the default skipper.
18+
skipper := cfg.Skipper
19+
if skipper == nil {
20+
skipper = DefaultVersionHeaderSkipper
21+
}
22+
1023
return func(next echo.HandlerFunc) echo.HandlerFunc {
1124
return func(c echo.Context) error {
12-
c.Response().Header().Set("X-GOFEATUREFLAG-VERSION", config.Version)
25+
if skipper(c) {
26+
return next(c)
27+
}
28+
29+
c.Response().Header().Set("X-GOFEATUREFLAG-VERSION", cfg.RelayProxyConfig.Version)
1330
return next(c)
1431
}
1532
}
1633
}
34+
35+
func DefaultVersionHeaderSkipper(c echo.Context) bool {
36+
return false
37+
}
38+
39+
// DDisableVersionHeaderSkipper returns a middleware.Skipper function that checks config.
40+
func DisableVersionHeaderSkipper(relayProxyConfig *config.Config) middleware.Skipper {
41+
return func(c echo.Context) bool {
42+
return relayProxyConfig.DisableVersionHeader
43+
}
44+
}

cmd/relayproxy/api/middleware/version_test.go

+26-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ func TestVersion(t *testing.T) {
2020
conf := &config.Config{
2121
Version: "1.0.0",
2222
}
23-
middleware := middleware2.VersionHeader(conf)
23+
middleware := middleware2.VersionHeader(middleware2.VersionHeaderConfig{
24+
RelayProxyConfig: conf,
25+
})
2426
handler := middleware(func(c echo.Context) error {
2527
return c.String(http.StatusOK, "Authorized")
2628
})
@@ -29,3 +31,26 @@ func TestVersion(t *testing.T) {
2931
assert.NoError(t, err)
3032
assert.Equal(t, "1.0.0", rec.Header().Get("X-GOFEATUREFLAG-VERSION"))
3133
}
34+
35+
func TestNoVersion(t *testing.T) {
36+
e := echo.New()
37+
req := httptest.NewRequest(http.MethodGet, "/whatever", nil)
38+
req.Header.Set(echo.HeaderContentType, echo.MIMEApplicationJSON)
39+
rec := httptest.NewRecorder()
40+
c := e.NewContext(req, rec)
41+
conf := &config.Config{
42+
Version: "1.0.0",
43+
DisableVersionHeader: true,
44+
}
45+
middleware := middleware2.VersionHeader(middleware2.VersionHeaderConfig{
46+
Skipper: middleware2.DisableVersionHeaderSkipper(conf),
47+
RelayProxyConfig: conf,
48+
})
49+
handler := middleware(func(c echo.Context) error {
50+
return c.String(http.StatusOK, "Authorized")
51+
})
52+
53+
err := handler(c)
54+
assert.NoError(t, err)
55+
assert.Empty(t, rec.Header().Get("X-GOFEATUREFLAG-VERSION"))
56+
}

cmd/relayproxy/api/routes_monitoring.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -18,9 +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-
if s.config.EnableVersionHeader {
22-
s.monitoringEcho.Use(custommiddleware.VersionHeader(s.config))
23-
}
21+
s.apiEcho.Use(custommiddleware.VersionHeader(custommiddleware.VersionHeaderConfig{
22+
RelayProxyConfig: s.config,
23+
}))
2424
s.monitoringEcho.Use(middleware.Recover())
2525
s.initMonitoringEndpoint(s.monitoringEcho)
2626
} else {

cmd/relayproxy/api/server.go

+6-3
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,12 @@ func (s *Server) initRoutes() {
7171
}))
7272
}
7373
s.apiEcho.Use(middleware.CORSWithConfig(middleware.DefaultCORSConfig))
74-
if s.config.EnableVersionHeader {
75-
s.apiEcho.Use(custommiddleware.VersionHeader(s.config))
76-
}
74+
75+
s.apiEcho.Use(custommiddleware.VersionHeader(custommiddleware.VersionHeaderConfig{
76+
Skipper: custommiddleware.DisableVersionHeaderSkipper(s.config),
77+
RelayProxyConfig: s.config,
78+
}))
79+
7780
s.apiEcho.Use(middleware.Recover())
7881

7982
// Init controllers

cmd/relayproxy/api/server_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -260,8 +260,8 @@ func Test_VersionHeader_Disabled(t *testing.T) {
260260
Kind: "file",
261261
Path: "../../../testdata/flag-config.yaml",
262262
},
263-
ListenPort: 11024,
264-
EnableVersionHeader: false,
263+
ListenPort: 11024,
264+
DisableVersionHeader: true,
265265
}
266266
log := log.InitLogger()
267267
defer func() { _ = log.ZapLogger.Sync() }()

cmd/relayproxy/config/config.go

+8-9
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,11 @@ 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,
71-
"enableVersionHeader": true,
66+
"listen": "1031",
67+
"host": "localhost",
68+
"fileFormat": "yaml",
69+
"pollingInterval": 60000,
70+
"logLevel": DefaultLogLevel,
7271
}, "."), nil)
7372

7473
// mapping command line parameters to koanf
@@ -263,9 +262,9 @@ type Config struct {
263262
// Version is the version of the relay-proxy
264263
Version string `mapstructure:"version" koanf:"version"`
265264

266-
// Enable x-gofeatureflag-version header in the relay-proxy HTTP response
267-
// Default: true
268-
EnableVersionHeader bool `mapstructure:"enableVersionHeader" koanf:"enableversionheader"`
265+
// Disable x-gofeatureflag-version header in the relay-proxy HTTP response
266+
// Default: false
267+
DisableVersionHeader bool `mapstructure:"disableVersionHeader" koanf:"disableversionheader"`
269268

270269
// Deprecated: use AuthorizedKeys instead
271270
// APIKeys list of API keys that authorized to use endpoints

cmd/relayproxy/config/config_test.go

+12-25
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ func TestParseConfig_fileFromPflag(t *testing.T) {
3838
},
3939
StartWithRetrieverError: false,
4040
Version: "1.X.X",
41-
EnableVersionHeader: true,
4241
EnableSwagger: true,
4342
AuthorizedKeys: config.APIKeys{
4443
Admin: []string{
@@ -76,7 +75,6 @@ func TestParseConfig_fileFromPflag(t *testing.T) {
7675
},
7776
StartWithRetrieverError: false,
7877
Version: "1.X.X",
79-
EnableVersionHeader: true,
8078
EnableSwagger: true,
8179
AuthorizedKeys: config.APIKeys{
8280
Admin: nil,
@@ -106,7 +104,6 @@ func TestParseConfig_fileFromPflag(t *testing.T) {
106104
},
107105
StartWithRetrieverError: false,
108106
Version: "1.X.X",
109-
EnableVersionHeader: true,
110107
EnableSwagger: true,
111108
APIKeys: []string{
112109
"apikey1",
@@ -134,7 +131,6 @@ func TestParseConfig_fileFromPflag(t *testing.T) {
134131
},
135132
StartWithRetrieverError: false,
136133
Version: "1.X.X",
137-
EnableVersionHeader: true,
138134
EnableSwagger: true,
139135
APIKeys: []string{
140136
"apikey1",
@@ -154,7 +150,6 @@ func TestParseConfig_fileFromPflag(t *testing.T) {
154150
Host: "localhost",
155151
StartWithRetrieverError: false,
156152
Version: "1.X.X",
157-
EnableVersionHeader: true,
158153
LogLevel: config.DefaultLogLevel,
159154
},
160155
wantErr: assert.NoError,
@@ -168,13 +163,12 @@ func TestParseConfig_fileFromPflag(t *testing.T) {
168163
name: "Valid YAML with OTel config",
169164
fileLocation: "../testdata/config/valid-otel.yaml",
170165
want: &config.Config{
171-
ListenPort: 1031,
172-
PollingInterval: 60000,
173-
FileFormat: "yaml",
174-
Host: "localhost",
175-
LogLevel: config.DefaultLogLevel,
176-
Version: "1.X.X",
177-
EnableVersionHeader: true,
166+
ListenPort: 1031,
167+
PollingInterval: 60000,
168+
FileFormat: "yaml",
169+
Host: "localhost",
170+
LogLevel: config.DefaultLogLevel,
171+
Version: "1.X.X",
178172
Retrievers: &[]config.RetrieverConf{
179173
{
180174
Kind: "file",
@@ -239,7 +233,6 @@ func TestParseConfig_fileFromFolder(t *testing.T) {
239233
},
240234
StartWithRetrieverError: false,
241235
Version: "1.X.X",
242-
EnableVersionHeader: true,
243236
EnableSwagger: true,
244237
AuthorizedKeys: config.APIKeys{
245238
Admin: []string{
@@ -264,7 +257,6 @@ func TestParseConfig_fileFromFolder(t *testing.T) {
264257
Host: "localhost",
265258
StartWithRetrieverError: false,
266259
Version: "1.X.X",
267-
EnableVersionHeader: true,
268260
LogLevel: config.DefaultLogLevel,
269261
},
270262
wantErr: assert.NoError,
@@ -285,7 +277,6 @@ func TestParseConfig_fileFromFolder(t *testing.T) {
285277
Host: "localhost",
286278
StartWithRetrieverError: false,
287279
Version: "1.X.X",
288-
EnableVersionHeader: true,
289280
LogLevel: config.DefaultLogLevel,
290281
},
291282
},
@@ -300,7 +291,6 @@ func TestParseConfig_fileFromFolder(t *testing.T) {
300291
Host: "localhost",
301292
StartWithRetrieverError: false,
302293
Version: "1.X.X",
303-
EnableVersionHeader: true,
304294
LogLevel: config.DefaultLogLevel,
305295
},
306296
},
@@ -315,7 +305,6 @@ func TestParseConfig_fileFromFolder(t *testing.T) {
315305
Host: "localhost",
316306
StartWithRetrieverError: false,
317307
Version: "1.X.X",
318-
EnableVersionHeader: true,
319308
LogLevel: config.DefaultLogLevel,
320309
},
321310
disableDefaultFileCreation: true,
@@ -838,7 +827,6 @@ func TestMergeConfig_FromOSEnv(t *testing.T) {
838827
},
839828
StartWithRetrieverError: false,
840829
Version: "1.X.X",
841-
EnableVersionHeader: true,
842830
EnableSwagger: true,
843831
AuthorizedKeys: config.APIKeys{
844832
Admin: []string{
@@ -866,13 +854,12 @@ func TestMergeConfig_FromOSEnv(t *testing.T) {
866854
fileLocation: "../testdata/config/valid-otel.yaml",
867855
disableDefaultFileCreation: true,
868856
want: &config.Config{
869-
ListenPort: 1031,
870-
PollingInterval: 60000,
871-
FileFormat: "yaml",
872-
Host: "localhost",
873-
LogLevel: config.DefaultLogLevel,
874-
Version: "1.X.X",
875-
EnableVersionHeader: true,
857+
ListenPort: 1031,
858+
PollingInterval: 60000,
859+
FileFormat: "yaml",
860+
Host: "localhost",
861+
LogLevel: config.DefaultLogLevel,
862+
Version: "1.X.X",
876863
Retrievers: &[]config.RetrieverConf{
877864
{
878865
Kind: "file",

0 commit comments

Comments
 (0)