@@ -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
4383func (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
346393func 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
401449func (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
907956func (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
13041354func 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
13131363func 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