Promote query parameters to request headers

Verified Code examples on this page have been automatically tested and verified.

Promote a query parameter to a request header by using CEL expressions. The example uses request.uri with the contains() function and a conditional expression to read a query parameter value and inject it as a request header before the request reaches the upstream.

This configuration is useful when a client passes information as a query parameter but the backend service expects it as a header.

Before you begin

  1. Set up an agentgateway proxy.
  2. Install the httpbin sample app.

Promote a query parameter to a request header

In this example, a client passes a feature flag as the beta query parameter. The backend service expects this as the x-beta-features request header. The transformation reads request.uri and sets the header to enabled when beta=true is present, and disabled when it is absent.

  1. Create an AgentgatewayPolicy resource with your transformation rules.

    kubectl apply -f- <<EOF
    apiVersion: agentgateway.dev/v1alpha1
    kind: AgentgatewayPolicy
    metadata:
      name: transformation
      namespace: httpbin
    spec:
      targetRefs:
      - group: gateway.networking.k8s.io
        kind: HTTPRoute
        name: httpbin
      traffic:
        transformation:
          request:
            set:
            - name: x-beta-features
              value: 'request.uri.contains("beta=true") ? "enabled" : "disabled"'
    EOF
  2. Send a request with the beta=true query parameter. Verify that you get back a 200 HTTP response code and that the x-beta-features header is set to enabled in the headers echoed back by httpbin.

    curl -vi "http://$INGRESS_GW_ADDRESS:80/get?beta=true" \
     -H "host: www.example.com:80"
    curl -vi "localhost:8080/get?beta=true" \
    -H "host: www.example.com"

    Example output:

    < HTTP/1.1 200 OK
    HTTP/1.1 200 OK
    ...
    
    {
      "args": {
        "beta": [
          "true"
        ]
      },
      "headers": {
        "Accept": [
          "*/*"
        ],
        "Host": [
          "www.example.com"
        ],
        "User-Agent": [
          "curl/8.7.1"
        ],
        "X-Beta-Features": [
          "enabled"
        ]
      },
      "origin": "10.244.0.6:12345",
      "url": "http://www.example.com/get?beta=true"
    }
    
  3. Send a request without the beta=true query parameter. Verify that the x-beta-features header is set to disabled.

    curl -vi http://$INGRESS_GW_ADDRESS:80/get \
     -H "host: www.example.com:80"
    curl -vi localhost:8080/get \
    -H "host: www.example.com"

    Example output:

    < HTTP/1.1 200 OK
    HTTP/1.1 200 OK
    ...
    
    {
      "args": {},
      "headers": {
        "Accept": [
          "*/*"
        ],
        "Host": [
          "www.example.com"
        ],
        "User-Agent": [
          "curl/8.7.1"
        ],
        "X-Beta-Features": [
          "disabled"
        ]
      },
      "origin": "10.244.0.6:12345",
      "url": "http://www.example.com/get"
    }
    

Cleanup

You can remove the resources that you created in this guide.
kubectl delete AgentgatewayPolicy transformation -n httpbin
Agentgateway assistant

Ask me anything about agentgateway configuration, features, or usage.

Note: AI-generated content might contain errors; please verify and test all returned information.

Tip: one topic per conversation gives the best results. Use the + button in the chat header to start a new conversation.

Switching topics? Starting a new conversation improves accuracy.
↑↓ navigate select esc dismiss

What could be improved?

Your feedback helps us improve assistant answers and identify docs gaps we should fix.

Need more help? Join us on Discord: https://discord.gg/y9efgEmppm

Want to use your own agent? Add the Solo MCP server to query our docs directly. Get started here: https://search.solo.io/.