Skip to content

Commit 645bf19

Browse files
author
Sarthak Agrawal
committed
Consolidate filter creation functions
1 parent 85cde46 commit 645bf19

File tree

3 files changed

+71
-64
lines changed

3 files changed

+71
-64
lines changed

pkg/i2gw/providers/nginx/annotations/header_manipulation.go

Lines changed: 3 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727

2828
"github.com/kubernetes-sigs/ingress2gateway/pkg/i2gw/intermediate"
2929
"github.com/kubernetes-sigs/ingress2gateway/pkg/i2gw/providers/common"
30+
nginxcommon "github.com/kubernetes-sigs/ingress2gateway/pkg/i2gw/providers/nginx/common"
3031
)
3132

3233
// HeaderManipulationFeature converts header manipulation annotations to HTTPRoute filters
@@ -87,47 +88,13 @@ func addFilterToHTTPRoute(httpRoute *gatewayv1.HTTPRoute, _ networkingv1.Ingress
8788
// createResponseHeaderModifier creates a ResponseHeaderModifier filter from comma-separated header names
8889
func createResponseHeaderModifier(hideHeaders string) *gatewayv1.HTTPRouteFilter {
8990
headersToRemove := parseCommaSeparatedHeaders(hideHeaders)
90-
if len(headersToRemove) == 0 {
91-
return nil
92-
}
93-
94-
return &gatewayv1.HTTPRouteFilter{
95-
Type: gatewayv1.HTTPRouteFilterResponseHeaderModifier,
96-
ResponseHeaderModifier: &gatewayv1.HTTPHeaderFilter{
97-
Remove: headersToRemove,
98-
},
99-
}
91+
return nginxcommon.CreateResponseHeaderModifier(headersToRemove)
10092
}
10193

10294
// createRequestHeaderModifier creates a RequestHeaderModifier filter from proxy-set-headers annotation
10395
func createRequestHeaderModifier(setHeaders string) *gatewayv1.HTTPRouteFilter {
10496
headers := parseSetHeaders(setHeaders)
105-
if len(headers) == 0 {
106-
return nil
107-
}
108-
109-
var headersToSet []gatewayv1.HTTPHeader
110-
for name, value := range headers {
111-
if value != "" && !strings.Contains(value, "$") {
112-
headersToSet = append(headersToSet, gatewayv1.HTTPHeader{
113-
Name: gatewayv1.HTTPHeaderName(name),
114-
Value: value,
115-
})
116-
}
117-
// Note: Headers with NGINX variables cannot be converted to Gateway API
118-
// as Gateway API doesn't support dynamic header values
119-
}
120-
121-
if len(headersToSet) == 0 {
122-
return nil
123-
}
124-
125-
return &gatewayv1.HTTPRouteFilter{
126-
Type: gatewayv1.HTTPRouteFilterRequestHeaderModifier,
127-
RequestHeaderModifier: &gatewayv1.HTTPHeaderFilter{
128-
Set: headersToSet,
129-
},
130-
}
97+
return nginxcommon.CreateRequestHeaderModifier(headers)
13198
}
13299

133100
// parseCommaSeparatedHeaders parses a comma-separated list of header names
@@ -143,7 +110,6 @@ func parseSetHeaders(setHeaders string) map[string]string {
143110

144111
for _, part := range parts {
145112
if strings.Contains(part, ":") {
146-
// Format: "Header-Name: value"
147113
kv := strings.SplitN(part, ":", 2)
148114
if len(kv) == 2 {
149115
headerName := strings.TrimSpace(kv[0])
@@ -153,12 +119,8 @@ func parseSetHeaders(setHeaders string) map[string]string {
153119
}
154120
}
155121
}
156-
// Note: Headers without explicit values (format "$Variable-Name") are skipped
157-
// as Gateway API cannot use NGINX variables like $http_* and headers need values
158122
}
159123

160124
return headers
161125
}
162126

163-
// Note: The patchHTTPRouteHeaderMatching function has been removed as it was incomplete.
164-
// Header matching should be implemented separately if needed for specific NGINX features.

pkg/i2gw/providers/nginx/annotations/path_rewrite.go

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ import (
2222
networkingv1 "k8s.io/api/networking/v1"
2323
"k8s.io/apimachinery/pkg/types"
2424
"k8s.io/apimachinery/pkg/util/validation/field"
25-
"k8s.io/utils/ptr"
2625
gatewayv1 "sigs.k8s.io/gateway-api/apis/v1"
2726

2827
"github.com/kubernetes-sigs/ingress2gateway/pkg/i2gw/intermediate"
2928
"github.com/kubernetes-sigs/ingress2gateway/pkg/i2gw/providers/common"
29+
nginxcommon "github.com/kubernetes-sigs/ingress2gateway/pkg/i2gw/providers/nginx/common"
3030
)
3131

3232
// RewriteTargetFeature converts nginx.org/rewrites annotation to URLRewrite filter
@@ -57,20 +57,13 @@ func RewriteTargetFeature(ingresses []networkingv1.Ingress, _ map[types.Namespac
5757
for _, path := range rule.IngressRule.HTTP.Paths {
5858
serviceName := path.Backend.Service.Name
5959
if rewritePath, hasRewrite := rewriteRules[serviceName]; hasRewrite {
60-
filter := gatewayv1.HTTPRouteFilter{
61-
Type: gatewayv1.HTTPRouteFilterURLRewrite,
62-
URLRewrite: &gatewayv1.HTTPURLRewriteFilter{
63-
Path: &gatewayv1.HTTPPathModifier{
64-
Type: gatewayv1.PrefixMatchHTTPPathModifier,
65-
ReplacePrefixMatch: ptr.To(rewritePath),
66-
},
67-
},
60+
filter := nginxcommon.CreateURLRewriteFilter(rewritePath)
61+
if filter != nil {
62+
if httpRouteContext.HTTPRoute.Spec.Rules[i].Filters == nil {
63+
httpRouteContext.HTTPRoute.Spec.Rules[i].Filters = []gatewayv1.HTTPRouteFilter{}
64+
}
65+
httpRouteContext.HTTPRoute.Spec.Rules[i].Filters = append(httpRouteContext.HTTPRoute.Spec.Rules[i].Filters, *filter)
6866
}
69-
70-
if httpRouteContext.HTTPRoute.Spec.Rules[i].Filters == nil {
71-
httpRouteContext.HTTPRoute.Spec.Rules[i].Filters = []gatewayv1.HTTPRouteFilter{}
72-
}
73-
httpRouteContext.HTTPRoute.Spec.Rules[i].Filters = append(httpRouteContext.HTTPRoute.Spec.Rules[i].Filters, filter)
7467
}
7568
}
7669
}
@@ -87,34 +80,25 @@ func RewriteTargetFeature(ingresses []networkingv1.Ingress, _ map[types.Namespac
8780
// NIC format: "serviceName=service rewrite=path;serviceName2=service2 rewrite=path2"
8881
func parseRewriteRules(rewriteValue string) map[string]string {
8982
rules := make(map[string]string)
90-
9183
if rewriteValue == "" {
9284
return rules
9385
}
94-
95-
// Split by semicolon for each rule
9686
parts := strings.Split(rewriteValue, ";")
97-
9887
for _, part := range parts {
9988
part = strings.TrimSpace(part)
10089
if part == "" {
10190
continue
10291
}
103-
104-
// Expect format: serviceName=service rewrite=rewrite
10592
serviceIdx := strings.Index(part, "=")
10693
rewriteIdx := strings.Index(part, " rewrite=")
10794
if serviceIdx == -1 || rewriteIdx == -1 || rewriteIdx <= serviceIdx {
10895
continue
10996
}
110-
11197
serviceName := strings.TrimSpace(part[serviceIdx+1 : rewriteIdx])
11298
rewritePath := strings.TrimSpace(part[rewriteIdx+9:])
113-
11499
if serviceName != "" && rewritePath != "" {
115100
rules[serviceName] = rewritePath
116101
}
117102
}
118-
119103
return rules
120104
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package common
2+
3+
import (
4+
"strings"
5+
6+
gatewayv1 "sigs.k8s.io/gateway-api/apis/v1"
7+
)
8+
9+
// CreateResponseHeaderModifier creates a ResponseHeaderModifier filter from comma-separated header names
10+
func CreateResponseHeaderModifier(headersToRemove []string) *gatewayv1.HTTPRouteFilter {
11+
if len(headersToRemove) == 0 {
12+
return nil
13+
}
14+
return &gatewayv1.HTTPRouteFilter{
15+
Type: gatewayv1.HTTPRouteFilterResponseHeaderModifier,
16+
ResponseHeaderModifier: &gatewayv1.HTTPHeaderFilter{
17+
Remove: headersToRemove,
18+
},
19+
}
20+
}
21+
22+
// CreateRequestHeaderModifier creates a RequestHeaderModifier filter from header map
23+
func CreateRequestHeaderModifier(headersToSet map[string]string) *gatewayv1.HTTPRouteFilter {
24+
if len(headersToSet) == 0 {
25+
return nil
26+
}
27+
var headers []gatewayv1.HTTPHeader
28+
for name, value := range headersToSet {
29+
if value != "" && !strings.Contains(value, "$") {
30+
headers = append(headers, gatewayv1.HTTPHeader{
31+
Name: gatewayv1.HTTPHeaderName(name),
32+
Value: value,
33+
})
34+
}
35+
}
36+
if len(headers) == 0 {
37+
return nil
38+
}
39+
return &gatewayv1.HTTPRouteFilter{
40+
Type: gatewayv1.HTTPRouteFilterRequestHeaderModifier,
41+
RequestHeaderModifier: &gatewayv1.HTTPHeaderFilter{
42+
Set: headers,
43+
},
44+
}
45+
}
46+
47+
// CreateURLRewriteFilter creates a URLRewrite filter with ReplacePrefixMatch
48+
func CreateURLRewriteFilter(rewritePath string) *gatewayv1.HTTPRouteFilter {
49+
if rewritePath == "" {
50+
return nil
51+
}
52+
return &gatewayv1.HTTPRouteFilter{
53+
Type: gatewayv1.HTTPRouteFilterURLRewrite,
54+
URLRewrite: &gatewayv1.HTTPURLRewriteFilter{
55+
Path: &gatewayv1.HTTPPathModifier{
56+
Type: gatewayv1.PrefixMatchHTTPPathModifier,
57+
ReplacePrefixMatch: &rewritePath,
58+
},
59+
},
60+
}
61+
}

0 commit comments

Comments
 (0)