Skip to content

Extract query parameters

Page as Markdown

Extract query parameters, transform them, and return them as headers.

The following example walks you through how to use an Inja template to find specific query parameters in a request, extract the parameter values, and to add these values to headers.

Before you begin

  1. Follow the Get started guide to install Solo Enterprise for kgateway.

  2. Follow the Sample app guide to create a gateway proxy with an HTTP listener and deploy the httpbin sample app.

  3. 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

Extract query parameters

  1. Create an EnterpriseKgatewayTrafficPolicy with the following transformation rules:

    • You use a regular expression to find the foo and bar query parameters in the request path and to capture their values in the foo and bar extractors.
    • Then, the extractor values are added to the request headers foo-request and bar-request.
    kubectl apply -f- <<EOF
    apiVersion: enterprisekgateway.solo.io/v1alpha1
    kind: EnterpriseKgatewayTrafficPolicy
    metadata:
      name: transformation
      namespace: httpbin
    spec:
      targetRefs:
      - group: gateway.networking.k8s.io
        kind: HTTPRoute
        name: httpbin
      entTransformation:
        stages:
          early:
            requests:
            - transformation:
                template:
                  extractors:
                   # This extracts the 'foo' query param to an extractor named 'foo'
                    foo:
                      # The :path pseudo-header contains the URI
                      header: ':path'
                      # Use a nested capturing group to extract the query param
                      regex: '(.*foo=([^&]*).*)'
                      subgroup: 2
                    # This extracts the 'bar' query param to an extractor named 'bar'
                    bar:
                      # The :path pseudo-header contains the URI
                      header: ':path'
                      # Use a nested capturing group to extract the query param
                      regex: '(.*bar=([^&]*).*)'
                      subgroup: 2
                   # Add two new headers with the values of the 'foo' and 'bar' extractions
                  headers:
                    foo-request: '{{ foo }}'
                    bar-request: '{{ bar }}'
    EOF
  2. Send a request to the httpbin app and include the foo and bar query parameters. Verify that you get back a 200 HTTP response code and that the value of the foo and bar query parameters were added to the foo-request and bar-request headers.

    curl -vik http://$INGRESS_GW_ADDRESS:8080/anything?foo=foo-value&bar=bar-value \
     -H "host: www.example.com:8080" 
    curl -vik "localhost:8080/anything?foo=foo-value&bar=bar-value" \
    -H "host: www.example.com" 

    Example output:

    ...
    {
     "args": {
       "bar": [
         "bar-value"
       ],
       "foo": [
         "foo-value"
       ]
     },
     "headers": {
       "Accept": [
         "*/*"
       ],
       "Bar-Request": [
         "bar-value"
       ],
       "Foo-Request": [
         "foo-value"
       ],
       "Host": [
         "www.example.com:8080"
       ],
       "User-Agent": [
         "curl/7.77.0"
       ],
       "X-B3-Sampled": [
         "0"
       ],
       "X-B3-Spanid": [
         "5003b7987ed56d7f"
       ],
       "X-B3-Traceid": [
         "eac0a28ecb32b9e15003b7987ed56d7f"
       ],
       "X-Forwarded-Proto": [
         "http"
       ],
       "X-Request-Id": [
         "b43982a7-cdb5-4bab-9ce5-cba0cf4c2ae5"
       ]
     },
     "origin": "127.0.0.6:41223",
     "url": "http://www.example.com:8080/anything?foo=foo-value&bar=bar-value",
     "data": "",
     "files": null,
     "form": null,
     "json": null
    }
    

Cleanup

You can remove the resources that you created in this guide.

kubectl delete EnterpriseKgatewayTrafficPolicy transformation -n httpbin