Skip to content

Commit bdba91e

Browse files
Merge pull request #14 from hhftechnology/dev
Dev
2 parents f0e5eeb + effc0b1 commit bdba91e

File tree

1 file changed

+78
-12
lines changed

1 file changed

+78
-12
lines changed

api/handlers.go

Lines changed: 78 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,46 @@ func (s *Server) getMiddlewares(c *gin.Context) {
3939
c.JSON(http.StatusOK, middlewares)
4040
}
4141

42+
// ensureEmptyStringsPreserved ensures empty strings are properly preserved in middleware configs
43+
func ensureEmptyStringsPreserved(config map[string]interface{}) map[string]interface{} {
44+
if config == nil {
45+
return nil
46+
}
47+
48+
// Process custom headers which commonly use empty strings
49+
if customResponseHeaders, ok := config["customResponseHeaders"].(map[string]interface{}); ok {
50+
for key, value := range customResponseHeaders {
51+
// Ensure nil or null values are converted to empty strings where appropriate
52+
if value == nil {
53+
customResponseHeaders[key] = ""
54+
}
55+
}
56+
}
57+
58+
if customRequestHeaders, ok := config["customRequestHeaders"].(map[string]interface{}); ok {
59+
for key, value := range customRequestHeaders {
60+
if value == nil {
61+
customRequestHeaders[key] = ""
62+
}
63+
}
64+
}
65+
66+
// Common header fields that might have empty strings
67+
headerFields := []string{
68+
"Server", "X-Powered-By", "customFrameOptionsValue",
69+
"contentSecurityPolicy", "referrerPolicy", "permissionsPolicy",
70+
}
71+
72+
for _, field := range headerFields {
73+
if value, exists := config[field]; exists && value == nil {
74+
config[field] = ""
75+
}
76+
}
77+
78+
// Return the processed config
79+
return config
80+
}
81+
4282
// createMiddleware creates a new middleware configuration
4383
func (s *Server) createMiddleware(c *gin.Context) {
4484
var middleware struct {
@@ -66,6 +106,9 @@ func (s *Server) createMiddleware(c *gin.Context) {
66106
return
67107
}
68108

109+
// Ensure empty strings are properly preserved in config
110+
middleware.Config = ensureEmptyStringsPreserved(middleware.Config)
111+
69112
// Convert config to JSON string
70113
configJSON, err := json.Marshal(middleware.Config)
71114
if err != nil {
@@ -269,6 +312,9 @@ func (s *Server) updateMiddleware(c *gin.Context) {
269312
return
270313
}
271314

315+
// Ensure empty strings are properly preserved in config
316+
middleware.Config = ensureEmptyStringsPreserved(middleware.Config)
317+
272318
// Convert config to JSON string
273319
configJSON, err := json.Marshal(middleware.Config)
274320
if err != nil {
@@ -342,6 +388,7 @@ func (s *Server) updateMiddleware(c *gin.Context) {
342388
"config": middleware.Config,
343389
})
344390
}
391+
345392
// sanitizeMiddlewareConfig ensures proper formatting of duration values and strings
346393
func sanitizeMiddlewareConfig(config map[string]interface{}) {
347394
// List of keys that should be treated as duration values
@@ -397,6 +444,7 @@ func sanitizeConfigRecursive(data interface{}, durationKeys map[string]bool) {
397444
}
398445
}
399446
}
447+
400448
// deleteMiddleware deletes a middleware configuration
401449
func (s *Server) deleteMiddleware(c *gin.Context) {
402450
id := c.Param("id")
@@ -903,6 +951,7 @@ func (s *Server) removeMiddleware(c *gin.Context) {
903951
log.Printf("Successfully removed middleware %s from resource %s", middlewareID, resourceID)
904952
c.JSON(http.StatusOK, gin.H{"message": "Middleware removed from resource successfully"})
905953
}
954+
906955
// updateHTTPConfig updates the HTTP router entrypoints configuration
907956
func (s *Server) updateHTTPConfig(c *gin.Context) {
908957
id := c.Param("id")
@@ -1300,6 +1349,7 @@ func (s *Server) updateHeadersConfig(c *gin.Context) {
13001349
"custom_headers": input.CustomHeaders,
13011350
})
13021351
}
1352+
13031353
// generateID generates a random 16-character hex string
13041354
func generateID() (string, error) {
13051355
bytes := make([]byte, 8)
@@ -1312,18 +1362,34 @@ func generateID() (string, error) {
13121362
// isValidMiddlewareType checks if a middleware type is valid
13131363
func isValidMiddlewareType(typ string) bool {
13141364
validTypes := map[string]bool{
1315-
"basicAuth": true,
1316-
"forwardAuth": true,
1317-
"ipWhiteList": true,
1318-
"rateLimit": true,
1319-
"headers": true,
1320-
"stripPrefix": true,
1321-
"addPrefix": true,
1322-
"redirectRegex": true,
1323-
"redirectScheme": true,
1324-
"chain": true,
1325-
"replacepathregex": true,
1326-
"plugin": true,
1365+
// Currently supported types
1366+
"basicAuth": true,
1367+
"forwardAuth": true,
1368+
"ipWhiteList": true,
1369+
"rateLimit": true,
1370+
"headers": true,
1371+
"stripPrefix": true,
1372+
"addPrefix": true,
1373+
"redirectRegex": true,
1374+
"redirectScheme": true,
1375+
"chain": true,
1376+
"replacepathregex": true,
1377+
"replacePathRegex": true, // Adding correct camelCase version
1378+
"plugin": true,
1379+
// Additional middleware types from templates.yaml
1380+
"digestAuth": true,
1381+
"ipAllowList": true,
1382+
"stripPrefixRegex": true,
1383+
"replacePath": true,
1384+
"compress": true,
1385+
"circuitBreaker": true,
1386+
"contentType": true,
1387+
"errors": true,
1388+
"grpcWeb": true,
1389+
"inFlightReq": true,
1390+
"passTLSClientCert": true,
1391+
"retry": true,
1392+
"buffering": true,
13271393
}
13281394

13291395
return validTypes[typ]

0 commit comments

Comments
 (0)