Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions api/adc/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -635,9 +635,9 @@ type ResponseRewriteConfig struct {
}

type ResponseHeaders struct {
Set map[string]string `json:"set" yaml:"set"`
Add []string `json:"add" yaml:"add"`
Remove []string `json:"remove" yaml:"remove"`
Set map[string]string `json:"set,omitempty" yaml:"set,omitempty"`
Add []string `json:"add,omitempty" yaml:"add,omitempty"`
Remove []string `json:"remove,omitempty" yaml:"remove,omitempty"`
}

// RequestMirror is the rule config for proxy-mirror plugin.
Expand Down
113 changes: 110 additions & 3 deletions test/e2e/gatewayapi/httproute.go
Original file line number Diff line number Diff line change
Expand Up @@ -1444,6 +1444,82 @@ spec:
port: 80
`

var respHeaderModifyWithAdd = `
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: add
spec:
parentRefs:
- name: %s
hostnames:
- httpbin.example.resp-header-modify.add
rules:
- matches:
- path:
type: Exact
value: /headers
filters:
- type: ResponseHeaderModifier
responseHeaderModifier:
add:
- name: X-Resp-Add
value: "resp-add"
backendRefs:
- name: httpbin-service-e2e-test
port: 80
`

var respHeaderModifyWithSet = `
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: set
spec:
parentRefs:
- name: %s
hostnames:
- httpbin.example.resp-header-modify.set
rules:
- matches:
- path:
type: Exact
value: /headers
filters:
- type: ResponseHeaderModifier
responseHeaderModifier:
set:
- name: X-Resp-Set
value: "resp-set"
backendRefs:
- name: httpbin-service-e2e-test
port: 80
`

var respHeaderModifyWithRemove = `
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: remove
spec:
parentRefs:
- name: %s
hostnames:
- httpbin.example.resp-header-modify.remove
rules:
- matches:
- path:
type: Exact
value: /headers
filters:
- type: ResponseHeaderModifier
responseHeaderModifier:
remove:
- Server
backendRefs:
- name: httpbin-service-e2e-test
port: 80
`
var respHeaderModifyByHeaders = `
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
Expand Down Expand Up @@ -1655,6 +1731,9 @@ spec:
It("HTTPRoute ResponseHeaderModifier", func() {
By("create HTTPRoute")
s.ResourceApplied("HTTPRoute", "httpbin", fmt.Sprintf(respHeaderModifyByHeaders, s.Namespace(), s.Namespace()), 1)
s.ResourceApplied("HTTPRoute", "add", fmt.Sprintf(respHeaderModifyWithAdd, s.Namespace()), 1)
s.ResourceApplied("HTTPRoute", "set", fmt.Sprintf(respHeaderModifyWithSet, s.Namespace()), 1)
s.ResourceApplied("HTTPRoute", "remove", fmt.Sprintf(respHeaderModifyWithRemove, s.Namespace()), 1)

By("access daataplane to check the HTTPRoute")
s.RequestAssert(&scaffold.RequestAssert{
Expand All @@ -1666,12 +1745,40 @@ spec:
scaffold.WithExpectedHeaders(map[string]string{
"X-Resp-Add": "add",
"X-Resp-Set": "set",
"Server": "",
}),
scaffold.WithExpectedNotHeader("Server"),
scaffold.WithExpectedBodyNotContains(`"X-Resp-Add": "add"`, `"X-Resp-Set": "set"`, `"Server"`),
},
Timeout: time.Second * 30,
Interval: time.Second * 2,
})
s.RequestAssert(&scaffold.RequestAssert{
Method: "GET",
Path: "/headers",
Host: "httpbin.example.resp-header-modify.add",
Checks: []scaffold.ResponseCheckFunc{
scaffold.WithExpectedStatus(http.StatusOK),
scaffold.WithExpectedHeader("X-Resp-Add", "resp-add"),
scaffold.WithExpectedBodyNotContains(`"X-Resp-Add": "resp-add"`),
},
})
s.RequestAssert(&scaffold.RequestAssert{
Method: "GET",
Path: "/headers",
Host: "httpbin.example.resp-header-modify.set",
Checks: []scaffold.ResponseCheckFunc{
scaffold.WithExpectedStatus(http.StatusOK),
scaffold.WithExpectedHeader("X-Resp-Set", "resp-set"),
scaffold.WithExpectedBodyNotContains(`"Server"`),
},
})
s.RequestAssert(&scaffold.RequestAssert{
Method: "GET",
Path: "/headers",
Host: "httpbin.example.resp-header-modify.remove",
Checks: []scaffold.ResponseCheckFunc{
scaffold.WithExpectedStatus(http.StatusOK),
scaffold.WithExpectedNotHeader("Server"),
scaffold.WithExpectedBodyNotContains(`"Server"`),
},
})
})

Expand Down
22 changes: 22 additions & 0 deletions test/e2e/scaffold/assertion.go
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,28 @@ func WithExpectedHeaders(expectedHeaders map[string]string) ResponseCheckFunc {
}
}

func WithExpectedNotHeader(key string) ResponseCheckFunc {
return func(resp *HTTPResponse) error {
if resp.Header.Get(key) != "" {
return fmt.Errorf("expected header %q to be empty, but got %q",
key, resp.Header.Get(key))
}
return nil
}
}

func WithExpectedNotHeaders(unexpectedHeaders []string) ResponseCheckFunc {
return func(resp *HTTPResponse) error {
for _, key := range unexpectedHeaders {
if resp.Header.Get(key) != "" {
return fmt.Errorf("expected header %q to be empty, but got %q",
key, resp.Header.Get(key))
}
}
return nil
}
}

func (s *Scaffold) RequestAssert(r *RequestAssert) bool {
if r.Client == nil {
r.Client = s.NewAPISIXClient()
Expand Down
Loading