Skip to content

Commit f172410

Browse files
authored
fix: responseHeaderModifier fails to synchronize (#2544)
1 parent ec8624b commit f172410

File tree

3 files changed

+135
-6
lines changed

3 files changed

+135
-6
lines changed

api/adc/types.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -635,9 +635,9 @@ type ResponseRewriteConfig struct {
635635
}
636636

637637
type ResponseHeaders struct {
638-
Set map[string]string `json:"set" yaml:"set"`
639-
Add []string `json:"add" yaml:"add"`
640-
Remove []string `json:"remove" yaml:"remove"`
638+
Set map[string]string `json:"set,omitempty" yaml:"set,omitempty"`
639+
Add []string `json:"add,omitempty" yaml:"add,omitempty"`
640+
Remove []string `json:"remove,omitempty" yaml:"remove,omitempty"`
641641
}
642642

643643
// RequestMirror is the rule config for proxy-mirror plugin.

test/e2e/gatewayapi/httproute.go

Lines changed: 110 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1444,6 +1444,82 @@ spec:
14441444
port: 80
14451445
`
14461446

1447+
var respHeaderModifyWithAdd = `
1448+
apiVersion: gateway.networking.k8s.io/v1
1449+
kind: HTTPRoute
1450+
metadata:
1451+
name: add
1452+
spec:
1453+
parentRefs:
1454+
- name: %s
1455+
hostnames:
1456+
- httpbin.example.resp-header-modify.add
1457+
rules:
1458+
- matches:
1459+
- path:
1460+
type: Exact
1461+
value: /headers
1462+
filters:
1463+
- type: ResponseHeaderModifier
1464+
responseHeaderModifier:
1465+
add:
1466+
- name: X-Resp-Add
1467+
value: "resp-add"
1468+
backendRefs:
1469+
- name: httpbin-service-e2e-test
1470+
port: 80
1471+
`
1472+
1473+
var respHeaderModifyWithSet = `
1474+
apiVersion: gateway.networking.k8s.io/v1
1475+
kind: HTTPRoute
1476+
metadata:
1477+
name: set
1478+
spec:
1479+
parentRefs:
1480+
- name: %s
1481+
hostnames:
1482+
- httpbin.example.resp-header-modify.set
1483+
rules:
1484+
- matches:
1485+
- path:
1486+
type: Exact
1487+
value: /headers
1488+
filters:
1489+
- type: ResponseHeaderModifier
1490+
responseHeaderModifier:
1491+
set:
1492+
- name: X-Resp-Set
1493+
value: "resp-set"
1494+
backendRefs:
1495+
- name: httpbin-service-e2e-test
1496+
port: 80
1497+
`
1498+
1499+
var respHeaderModifyWithRemove = `
1500+
apiVersion: gateway.networking.k8s.io/v1
1501+
kind: HTTPRoute
1502+
metadata:
1503+
name: remove
1504+
spec:
1505+
parentRefs:
1506+
- name: %s
1507+
hostnames:
1508+
- httpbin.example.resp-header-modify.remove
1509+
rules:
1510+
- matches:
1511+
- path:
1512+
type: Exact
1513+
value: /headers
1514+
filters:
1515+
- type: ResponseHeaderModifier
1516+
responseHeaderModifier:
1517+
remove:
1518+
- Server
1519+
backendRefs:
1520+
- name: httpbin-service-e2e-test
1521+
port: 80
1522+
`
14471523
var respHeaderModifyByHeaders = `
14481524
apiVersion: gateway.networking.k8s.io/v1
14491525
kind: HTTPRoute
@@ -1655,6 +1731,9 @@ spec:
16551731
It("HTTPRoute ResponseHeaderModifier", func() {
16561732
By("create HTTPRoute")
16571733
s.ResourceApplied("HTTPRoute", "httpbin", fmt.Sprintf(respHeaderModifyByHeaders, s.Namespace(), s.Namespace()), 1)
1734+
s.ResourceApplied("HTTPRoute", "add", fmt.Sprintf(respHeaderModifyWithAdd, s.Namespace()), 1)
1735+
s.ResourceApplied("HTTPRoute", "set", fmt.Sprintf(respHeaderModifyWithSet, s.Namespace()), 1)
1736+
s.ResourceApplied("HTTPRoute", "remove", fmt.Sprintf(respHeaderModifyWithRemove, s.Namespace()), 1)
16581737

16591738
By("access daataplane to check the HTTPRoute")
16601739
s.RequestAssert(&scaffold.RequestAssert{
@@ -1666,12 +1745,40 @@ spec:
16661745
scaffold.WithExpectedHeaders(map[string]string{
16671746
"X-Resp-Add": "add",
16681747
"X-Resp-Set": "set",
1669-
"Server": "",
16701748
}),
1749+
scaffold.WithExpectedNotHeader("Server"),
16711750
scaffold.WithExpectedBodyNotContains(`"X-Resp-Add": "add"`, `"X-Resp-Set": "set"`, `"Server"`),
16721751
},
1673-
Timeout: time.Second * 30,
1674-
Interval: time.Second * 2,
1752+
})
1753+
s.RequestAssert(&scaffold.RequestAssert{
1754+
Method: "GET",
1755+
Path: "/headers",
1756+
Host: "httpbin.example.resp-header-modify.add",
1757+
Checks: []scaffold.ResponseCheckFunc{
1758+
scaffold.WithExpectedStatus(http.StatusOK),
1759+
scaffold.WithExpectedHeader("X-Resp-Add", "resp-add"),
1760+
scaffold.WithExpectedBodyNotContains(`"X-Resp-Add": "resp-add"`),
1761+
},
1762+
})
1763+
s.RequestAssert(&scaffold.RequestAssert{
1764+
Method: "GET",
1765+
Path: "/headers",
1766+
Host: "httpbin.example.resp-header-modify.set",
1767+
Checks: []scaffold.ResponseCheckFunc{
1768+
scaffold.WithExpectedStatus(http.StatusOK),
1769+
scaffold.WithExpectedHeader("X-Resp-Set", "resp-set"),
1770+
scaffold.WithExpectedBodyNotContains(`"Server"`),
1771+
},
1772+
})
1773+
s.RequestAssert(&scaffold.RequestAssert{
1774+
Method: "GET",
1775+
Path: "/headers",
1776+
Host: "httpbin.example.resp-header-modify.remove",
1777+
Checks: []scaffold.ResponseCheckFunc{
1778+
scaffold.WithExpectedStatus(http.StatusOK),
1779+
scaffold.WithExpectedNotHeader("Server"),
1780+
scaffold.WithExpectedBodyNotContains(`"Server"`),
1781+
},
16751782
})
16761783
})
16771784

test/e2e/scaffold/assertion.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,28 @@ func WithExpectedHeaders(expectedHeaders map[string]string) ResponseCheckFunc {
149149
}
150150
}
151151

152+
func WithExpectedNotHeader(key string) ResponseCheckFunc {
153+
return func(resp *HTTPResponse) error {
154+
if resp.Header.Get(key) != "" {
155+
return fmt.Errorf("expected header %q to be empty, but got %q",
156+
key, resp.Header.Get(key))
157+
}
158+
return nil
159+
}
160+
}
161+
162+
func WithExpectedNotHeaders(unexpectedHeaders []string) ResponseCheckFunc {
163+
return func(resp *HTTPResponse) error {
164+
for _, key := range unexpectedHeaders {
165+
if resp.Header.Get(key) != "" {
166+
return fmt.Errorf("expected header %q to be empty, but got %q",
167+
key, resp.Header.Get(key))
168+
}
169+
}
170+
return nil
171+
}
172+
}
173+
152174
func (s *Scaffold) RequestAssert(r *RequestAssert) bool {
153175
if r.Client == nil {
154176
r.Client = s.NewAPISIXClient()

0 commit comments

Comments
 (0)