Add headers to body
The following example walks you through how to use extractors to extract request header values by using regular expressions. The captured header values are then added to the response body by using the mergeExtractorsToBody
setting. You can use the extractors to also indicate where you want to place the request header values in the body.
Before you begin
-
Follow the Get started guide to install K8sGateway, set up a gateway resource, 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 gloo-system gloo-proxy-http -o jsonpath="{.status.loadBalancer.ingress[0]['hostname','ip']}") echo $INGRESS_GW_ADDRESS
kubectl port-forward deployment/gloo-proxy-http -n gloo-system 8080:8080
Add header values to the response body
-
Create a VirtualHostOption resource with your transformation rules. In the following example, you extract the
root
andnested
request headers and add them to the response body by using themergeExtractorsToBody
setting. The dot notation that you use for the extractor names determines the placement of the header in the body. For example, if no dot notation is used, such as inroot
, the header is added to the body’s root level. If dot notation is used, such as inpayload.nested
, the extractor is added under thepayload.nested
field.kubectl apply -n gloo-system -f- <<EOF apiVersion: gateway.solo.io/v1 kind: VirtualHostOption metadata: name: transformation namespace: gloo-system spec: options: transformations: requestTransformation: transformationTemplate: # Merge the specified extractors to the request body mergeExtractorsToBody: {} extractors: # The name of this attribute determines where the value will be nested in the body. # Because no dots are specified, such as root.nested, the root header value is added to the body's root level. root: # Name of the header to extract header: 'root' # Regex to apply to it. This value is required and is configured to capture the entire header. regex: '.*' # The name of this attribute determines where the value will be nested in the body. # Because dot notation is used, the nested header is placed under the placeholder.nested field in the body. payload.nested: # Name of the header to extract header: 'nested' # Regex to apply to it. This value is required and is configured to capture the entire header. regex: '.*' targetRefs: - group: gateway.networking.k8s.io kind: Gateway name: http namespace: gloo-system EOF
-
Send a request to the httpbin app and include the
root
andnested
request headers. Verify that you get back a 200 HTTP response code and that the value of theroot
header is added to the body’s root level, and that thenested
header value is added under thepayload.nested
field in your response.curl -X POST -H "host: www.example.com:8080" \ -H "Content-Type: application/json" \ -H "root: root-val" \ -H "nested: nested-val" http://$INGRESS_GW_ADDRESS:8080/post -d @data.json | jq
curl -X POST localhost:8080/post \ -H "host: www.example.com" \ -H "Content-Type: application/json" \ -H "root: root-val" \ -H "nested: nested-val" -d @data.json | jq
Example output:
1 2 3 4 5 6 7
... "json": { "payload": { "nested": "nested-val" }, "root": "root-val" }
Cleanup
You can remove the resources that you created in this guide.kubectl delete virtualhostoption transformation -n gloo-system