Request headers
Use the RequestHeaderModifier
filter to add, append, overwrite, or remove request headers for a specific route.
For more information, see the HTTPHeaderFilter specification.
Before you begin
-
Follow the Get started guide to install kgateway.
-
Follow the Sample app guide to create an API gateway proxy with an HTTP listener and deploy the httpbin sample app.
-
Get the external address of the gateway and save it in an environment variable.
export INGRESS_GW_ADDRESS=$(kubectl get svc -n kgateway-system http -o jsonpath="{.status.loadBalancer.ingress[0]['hostname','ip']}") echo $INGRESS_GW_ADDRESS
kubectl port-forward deployment/http -n kgateway-system 8080:8080
Add and append request headers
Add headers to incoming requests before they are forwarded to an upstream service. If the request already has the header set, the value of the header in the RequestHeaderModifier
filter is appended to the value of the header in the request.
-
Create an HTTPRoute resource for the httpbin app with a
RequestHeaderModifier
. In this example, you want to add themy-header: kgateway
request header.kubectl apply -f- <<EOF apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: httpbin-headers namespace: httpbin spec: parentRefs: - name: http namespace: kgateway-system hostnames: - headers.example rules: - filters: - type: RequestHeaderModifier requestHeaderModifier: add: - name: my-header value: kgateway backendRefs: - name: httpbin port: 8000 EOF
Setting Description spec.parentRefs
The name and namespace of the gateway that serves this HTTPRoute. In this example, you use the http
gateway that was created as part of the get started guide.spec.rules.filters.type
The type of filter that you want to apply to incoming requests. In this example, the RequestHeaderModifier
filter is used.spec.rules.filters.requestHeaderModifier.add
The name and value of the request header that you want to add. spec.rules.backendRefs
The backend destination you want to forward traffic to. In this example, all traffic is forwarded to the httpbin app that you set up as part of the get started guide. -
Send a request to the httpbin app on the
headers.example
domain and verify that you get back a 200 HTTP response code and that you see themy-header
request header.curl -vi http://$INGRESS_GW_ADDRESS:8080/headers -H "host: headers.example:8080"
curl -vi localhost:8080/headers -H "host: headers.example"
Example output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
* Mark bundle as not supporting multiuse < HTTP/1.1 200 OK HTTP/1.1 200 OK ... { "headers": { "Accept": [ "*/*" ], "Host": [ "headers.example:8080" ], "My-Header": [ "kgateway" ], "User-Agent": [ "curl/7.77.0" ], ...
-
Send another request to the httpbin app. This time, you already include the
my-header
header in your request. Verify that you get back a 200 HTTP response code and that yourmy-header
header value is appended with the value from theRequestHeaderModifier
filter.curl -vi http://$INGRESS_GW_ADDRESS:8080/headers -H "host: headers.example:8080" \ -H "my-header: foo"
curl -vi localhost:8080/headers -H "host: headers.example" \ -H "my-header: foo"
Example output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
* Mark bundle as not supporting multiuse < HTTP/1.1 200 OK HTTP/1.1 200 OK ... { "headers": { "Accept": [ "*/*" ], "Host": [ "headers.example:8080" ], "My-Header": [ "foo", "kgateway" ], ...
-
Optional: Remove the resources that you created.
kubectl delete httproute httpbin-headers -n httpbin
Set request headers
Setting headers is similar to adding headers. If the request does not include the header, it is added by the RequestHeaderModifier
filter. However, if the request already contains the header, its value is overwritten with the value from the RequestHeaderModifier
filter.
-
Create an HTTPRoute resource for the httpbin app with an
RequestHeaderModifier
. In this example, you want to set themy-header
request header to the valuekgateway
.kubectl apply -f- <<EOF apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: httpbin-headers namespace: httpbin spec: parentRefs: - name: http namespace: kgateway-system hostnames: - headers.example rules: - filters: - type: RequestHeaderModifier requestHeaderModifier: set: - name: my-header value: kgateway backendRefs: - name: httpbin port: 8000 EOF
Setting Description spec.parentRefs
The name and namespace of the gateway that serves this HTTPRoute. In this example, you use the http
gateway that was created as part of the get started guide.spec.rules.filters.type
The type of filter that you want to apply to incoming requests. In this example, the RequestHeaderModifier
filter is used.spec.rules.filters.requestHeaderModifier.set
The name and value of the request header that you want to set. spec.rules.backendRefs
The Kubernetes service you want to forward traffic to. In this example, all traffic is forwarded to the httpbin app that you set up as part of the get started guide. -
Send a request to the httpbin app on the
headers.example
domain. Verify that you get back a 200 HTTP response code and that themy-header: kgateway
header was added.curl -vi http://$INGRESS_GW_ADDRESS:8080/headers -H "host: headers.example:8080"
curl -vi localhost:8080/headers -H "host: headers.example"
Example output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
* Mark bundle as not supporting multiuse < HTTP/1.1 200 OK HTTP/1.1 200 OK ... { "headers": { "Accept": [ "*/*" ], "Host": [ "headers.example:8080" ], "My-Header": [ "kgateway" ], "User-Agent": [ "curl/7.77.0" ], ...
-
Send another request to the httpbin app. This time, you already include the
my-header
header in your request. Verify that you get back a 200 HTTP response code and that yourmy-header
header value is overwritten with the value from theRequestHeaderModifier
filter.curl -vi http://$INGRESS_GW_ADDRESS:8080/headers -H "host: headers.example:8080" \ -H "my-header: foo"
curl -vi localhost:8080/headers -H "host: headers.example" \ -H "my-header: foo"
Example output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
* Mark bundle as not supporting multiuse < HTTP/1.1 200 OK HTTP/1.1 200 OK ... { "headers": { "Accept": [ "*/*" ], "Host": [ "headers.example:8080" ], "My-Header": [ "kgateway" ], ...
-
Optional: Remove the resources that you created.
kubectl delete httproute httpbin-headers -n httpbin
Remove request headers
You can remove HTTP headers from a request before the request is forwarded to the target service in the cluster.
-
Send a request to the httpbin app and find the
User-Agent
header.curl -vi http://$INGRESS_GW_ADDRESS:8080/headers -H "host: www.example.com:8080"
curl -vi localhost:8080/headers -H "host: www.example.com"
Example output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
... { "headers": { "Accept": [ "*/*" ], "Host": [ "www.example.com:8080" ], "User-Agent": [ "curl/7.77.0" ], "X-Envoy-Expected-Rq-Timeout-Ms": [ "15000" ], "X-Forwarded-Proto": [ "http" ], "X-Request-Id": [ "5b14c790-3870-4f73-a12e-4cba9a7eccd7" ] } }
-
Create an HTTPRoute resource for the httpbin app that removes the
User-Agent
header when requests are sent to theheaders.example
domain.kubectl apply -f- <<EOF apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: httpbin-headers namespace: httpbin spec: parentRefs: - name: http namespace: kgateway-system hostnames: - headers.example rules: - filters: - type: RequestHeaderModifier requestHeaderModifier: remove: - User-Agent backendRefs: - name: httpbin port: 8000 EOF
Setting Description spec.parentRefs
The name and namespace of the gateway that serves this HTTPRoute. In this example, you use the http
gateway that was created as part of the get started guide.spec.rules.filters.type
The type of filter that you want to apply to incoming requests. In this example, the RequestHeaderModifier
filter is used.spec.rules.filters.requestHeaderModifier.remove
The name of the request header that you want to remove. spec.rules.backendRefs
The backend destination you want to forward traffic to. In this example, all traffic is forwarded to the httpbin app that you set up as part of the get started guide. -
Send a request to the httpbin app on the
headers.example
domain . Verify that theUser-Agent
request header is removed.curl -vi http://$INGRESS_GW_ADDRESS:8080/headers -H "host: headers.example:8080"
curl -vi localhost:8080/headers -H "host: headers.example"
Example output:
{ "headers": { "Accept": [ "*/*" ], "Host": [ "headers.example:8080" ], "X-Envoy-Expected-Rq-Timeout-Ms": [ "15000" ], "X-Forwarded-Proto": [ "http" ], "X-Request-Id": [ "f83bb750-67f7-47dc-8c79-4a582892034c" ] } }
-
Optional: Clean up the resources that you created.
kubectl delete httproute httpbin-headers -n httpbin