Skip to content

Commit 16046f3

Browse files
arkodgzirain
authored andcommitted
increase earlyRequestHeaders from 16 to 64 (envoyproxy#6673)
* created a new definition of HTTPFilterHeader that supports 64 items for `set`, `add`, and `remove` * sanitizing request headers from untrusted downstream traffic is a common use case and 16 items may not be adequate enough at times. This action needs to be performed route processing for cases and the HTTPRoute filters cannot be used Signed-off-by: Arko Dasgupta <[email protected]>
1 parent ffdae47 commit 16046f3

File tree

9 files changed

+147
-17
lines changed

9 files changed

+147
-17
lines changed

api/v1alpha1/clienttrafficpolicy_types.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ package v1alpha1
77

88
import (
99
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10-
gwapiv1 "sigs.k8s.io/gateway-api/apis/v1"
1110
gwapiv1a2 "sigs.k8s.io/gateway-api/apis/v1alpha2"
1211
)
1312

@@ -159,7 +158,7 @@ type HeaderSettings struct {
159158
// routing, tracing and built-in header manipulation.
160159
//
161160
// +optional
162-
EarlyRequestHeaders *gwapiv1.HTTPHeaderFilter `json:"earlyRequestHeaders,omitempty"`
161+
EarlyRequestHeaders *HTTPHeaderFilter `json:"earlyRequestHeaders,omitempty"`
163162
}
164163

165164
// WithUnderscoresAction configures the action to take when an HTTP header with underscores

api/v1alpha1/shared_types.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -871,3 +871,84 @@ type CustomRedirect struct {
871871
// +kubebuilder:validation:Enum=301;302
872872
StatusCode *int `json:"statusCode,omitempty"`
873873
}
874+
875+
// HTTPHeaderFilter has been copied from the upstream Gateway API project
876+
// https://github.com/kubernetes-sigs/gateway-api/blob/main/apis/v1/httproute_types.go
877+
// and edited to increase the maxItems from 16 to 64
878+
// Remove this definition and reuse the upstream one once it supports items more than 64
879+
880+
// HTTPHeaderFilter defines a filter that modifies the headers of an HTTP
881+
// request or response. Only one action for a given header name is
882+
// permitted. Filters specifying multiple actions of the same or different
883+
// type for any one header name are invalid. Configuration to set or add
884+
// multiple values for a header must use RFC 7230 header value formatting,
885+
// separating each value with a comma.
886+
type HTTPHeaderFilter struct {
887+
// Set overwrites the request with the given header (name, value)
888+
// before the action.
889+
//
890+
// Input:
891+
// GET /foo HTTP/1.1
892+
// my-header: foo
893+
//
894+
// Config:
895+
// set:
896+
// - name: "my-header"
897+
// value: "bar"
898+
//
899+
// Output:
900+
// GET /foo HTTP/1.1
901+
// my-header: bar
902+
//
903+
// +optional
904+
// +listType=map
905+
// +listMapKey=name
906+
// +kubebuilder:validation:MaxItems=64
907+
Set []gwapiv1.HTTPHeader `json:"set,omitempty"`
908+
909+
// Add adds the given header(s) (name, value) to the request
910+
// before the action. It appends to any existing values associated
911+
// with the header name.
912+
//
913+
// Input:
914+
// GET /foo HTTP/1.1
915+
// my-header: foo
916+
//
917+
// Config:
918+
// add:
919+
// - name: "my-header"
920+
// value: "bar,baz"
921+
//
922+
// Output:
923+
// GET /foo HTTP/1.1
924+
// my-header: foo,bar,baz
925+
//
926+
// +optional
927+
// +listType=map
928+
// +listMapKey=name
929+
// +kubebuilder:validation:MaxItems=64
930+
Add []gwapiv1.HTTPHeader `json:"add,omitempty"`
931+
932+
// Remove the given header(s) from the HTTP request before the action. The
933+
// value of Remove is a list of HTTP header names. Note that the header
934+
// names are case-insensitive (see
935+
// https://datatracker.ietf.org/doc/html/rfc2616#section-4.2).
936+
//
937+
// Input:
938+
// GET /foo HTTP/1.1
939+
// my-header1: foo
940+
// my-header2: bar
941+
// my-header3: baz
942+
//
943+
// Config:
944+
// remove: ["my-header1", "my-header3"]
945+
//
946+
// Output:
947+
// GET /foo HTTP/1.1
948+
// my-header2: bar
949+
//
950+
// +optional
951+
// +listType=set
952+
// +kubebuilder:validation:MaxItems=64
953+
Remove []string `json:"remove,omitempty"`
954+
}

api/v1alpha1/zz_generated.deepcopy.go

Lines changed: 31 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

charts/gateway-crds-helm/templates/generated/gateway.envoyproxy.io_clienttrafficpolicies.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ spec:
244244
- name
245245
- value
246246
type: object
247-
maxItems: 16
247+
maxItems: 64
248248
type: array
249249
x-kubernetes-list-map-keys:
250250
- name
@@ -270,7 +270,7 @@ spec:
270270
my-header2: bar
271271
items:
272272
type: string
273-
maxItems: 16
273+
maxItems: 64
274274
type: array
275275
x-kubernetes-list-type: set
276276
set:
@@ -318,7 +318,7 @@ spec:
318318
- name
319319
- value
320320
type: object
321-
maxItems: 16
321+
maxItems: 64
322322
type: array
323323
x-kubernetes-list-map-keys:
324324
- name

charts/gateway-helm/crds/generated/gateway.envoyproxy.io_clienttrafficpolicies.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ spec:
243243
- name
244244
- value
245245
type: object
246-
maxItems: 16
246+
maxItems: 64
247247
type: array
248248
x-kubernetes-list-map-keys:
249249
- name
@@ -269,7 +269,7 @@ spec:
269269
my-header2: bar
270270
items:
271271
type: string
272-
maxItems: 16
272+
maxItems: 64
273273
type: array
274274
x-kubernetes-list-type: set
275275
set:
@@ -317,7 +317,7 @@ spec:
317317
- name
318318
- value
319319
type: object
320-
maxItems: 16
320+
maxItems: 64
321321
type: array
322322
x-kubernetes-list-map-keys:
323323
- name

internal/gatewayapi/clienttrafficpolicy.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import (
1818
"k8s.io/apimachinery/pkg/types"
1919
"k8s.io/apimachinery/pkg/util/sets"
2020
"k8s.io/utils/ptr"
21-
gwapiv1 "sigs.k8s.io/gateway-api/apis/v1"
2221
gwapiv1a2 "sigs.k8s.io/gateway-api/apis/v1alpha2"
2322

2423
egv1a1 "github.com/envoyproxy/gateway/api/v1alpha1"
@@ -983,7 +982,7 @@ func buildConnection(connection *egv1a1.ClientConnection) (*ir.ClientConnection,
983982
return irConnection, nil
984983
}
985984

986-
func translateEarlyRequestHeaders(headerModifier *gwapiv1.HTTPHeaderFilter) ([]ir.AddHeader, []string, error) {
985+
func translateEarlyRequestHeaders(headerModifier *egv1a1.HTTPHeaderFilter) ([]ir.AddHeader, []string, error) {
987986
// Make sure the header modifier config actually exists
988987
if headerModifier == nil {
989988
return nil, nil, nil

site/content/en/latest/api/extension_types.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2280,6 +2280,27 @@ _Appears in:_
22802280
| `headersToBackend` | _string array_ | false | | HeadersToBackend are the authorization response headers that will be added<br />to the original client request before sending it to the backend server.<br />Note that coexisting headers will be overridden.<br />If not specified, no authorization response headers will be added to the<br />original client request. |
22812281

22822282

2283+
#### HTTPHeaderFilter
2284+
2285+
2286+
2287+
HTTPHeaderFilter defines a filter that modifies the headers of an HTTP
2288+
request or response. Only one action for a given header name is
2289+
permitted. Filters specifying multiple actions of the same or different
2290+
type for any one header name are invalid. Configuration to set or add
2291+
multiple values for a header must use RFC 7230 header value formatting,
2292+
separating each value with a comma.
2293+
2294+
_Appears in:_
2295+
- [HeaderSettings](#headersettings)
2296+
2297+
| Field | Type | Required | Default | Description |
2298+
| --- | --- | --- | --- | --- |
2299+
| `set` | _HTTPHeader array_ | false | | Set overwrites the request with the given header (name, value)<br />before the action.<br />Input:<br /> GET /foo HTTP/1.1<br /> my-header: foo<br />Config:<br /> set:<br /> - name: "my-header"<br /> value: "bar"<br />Output:<br /> GET /foo HTTP/1.1<br /> my-header: bar |
2300+
| `add` | _HTTPHeader array_ | false | | Add adds the given header(s) (name, value) to the request<br />before the action. It appends to any existing values associated<br />with the header name.<br />Input:<br /> GET /foo HTTP/1.1<br /> my-header: foo<br />Config:<br /> add:<br /> - name: "my-header"<br /> value: "bar,baz"<br />Output:<br /> GET /foo HTTP/1.1<br /> my-header: foo,bar,baz |
2301+
| `remove` | _string array_ | false | | Remove the given header(s) from the HTTP request before the action. The<br />value of Remove is a list of HTTP header names. Note that the header<br />names are case-insensitive (see<br />https://datatracker.ietf.org/doc/html/rfc2616#section-4.2).<br />Input:<br /> GET /foo HTTP/1.1<br /> my-header1: foo<br /> my-header2: bar<br /> my-header3: baz<br />Config:<br /> remove: ["my-header1", "my-header3"]<br />Output:<br /> GET /foo HTTP/1.1<br /> my-header2: bar |
2302+
2303+
22832304
#### HTTPHostnameModifier
22842305

22852306

test/helm/gateway-crds-helm/all.out.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20242,7 +20242,7 @@ spec:
2024220242
- name
2024320243
- value
2024420244
type: object
20245-
maxItems: 16
20245+
maxItems: 64
2024620246
type: array
2024720247
x-kubernetes-list-map-keys:
2024820248
- name
@@ -20268,7 +20268,7 @@ spec:
2026820268
my-header2: bar
2026920269
items:
2027020270
type: string
20271-
maxItems: 16
20271+
maxItems: 64
2027220272
type: array
2027320273
x-kubernetes-list-type: set
2027420274
set:
@@ -20316,7 +20316,7 @@ spec:
2031620316
- name
2031720317
- value
2031820318
type: object
20319-
maxItems: 16
20319+
maxItems: 64
2032020320
type: array
2032120321
x-kubernetes-list-map-keys:
2032220322
- name

test/helm/gateway-crds-helm/envoy-gateway-crds.out.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2930,7 +2930,7 @@ spec:
29302930
- name
29312931
- value
29322932
type: object
2933-
maxItems: 16
2933+
maxItems: 64
29342934
type: array
29352935
x-kubernetes-list-map-keys:
29362936
- name
@@ -2956,7 +2956,7 @@ spec:
29562956
my-header2: bar
29572957
items:
29582958
type: string
2959-
maxItems: 16
2959+
maxItems: 64
29602960
type: array
29612961
x-kubernetes-list-type: set
29622962
set:
@@ -3004,7 +3004,7 @@ spec:
30043004
- name
30053005
- value
30063006
type: object
3007-
maxItems: 16
3007+
maxItems: 64
30083008
type: array
30093009
x-kubernetes-list-map-keys:
30103010
- name

0 commit comments

Comments
 (0)