Extract the values of common headers to generate a redirect URL.

About pseudo headers

Pseudo headers are special headers that are used in HTTP/2 to provide metadata about the request or response in a structured way. Although they look like traditional HTTP/1.x headers, they come with specific characteristics:

  • Must always start with a colon (:).
  • Must appear before regular headers in the HTTP/2 frame.
  • Contain details about the request or response.

Common pseudo headers include:

  • :method: The HTTP method that is used, such as GET or POST.
  • :scheme: The protocol that is used, such as http or https.
  • :authority: The hostname and port number that the request is sent to.
  • :path: The path of the request.

Before you begin

  1. Follow the Get started guide to install Gloo Gateway.

  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.

Set up redirect URLs

  1. Create a GlooTrafficPolicy resource with the following transformation rules:

    • Build a redirect URL with the values of the :authority and :path pseudo headers. These headers are extracted from the request with the request_header function that is provided in Gloo Gateway.
    • The :authority pseudo header contains the hostname that the request is sent to.
    • The :path pseudo header is set to the request path.
    • The redirect URL is added to the x-forwarded-uri response header.
      kubectl apply -f- <<EOF
    apiVersion: gloo.solo.io/v1alpha1
    kind: GlooTrafficPolicy
    metadata:
      name: transformation
      namespace: httpbin
    spec:
      targetRefs:
      - group: gateway.networking.k8s.io
        kind: HTTPRoute
        name: httpbin
      transformation:
        request:  
          add:
          - name: x-forwarded-uri
            value: 'https://{{ request_header(":authority") }}{{ request_header(":path") }}'
    EOF
      
  2. Send a request to the httpbin app. Verify that you get back a 200 HTTP response code and that you see the redirect URL in the x-forwarded-uri response header.

    Example output:

      ...
    < HTTP/1.1 200 OK
    HTTP/1.1 200 OK
    ...
    
    {
      "args": {},
      "headers": {
        "Accept": [
          "*/*"
        ],
        "Host": [
          "www.example.com:8080"
        ],
        "User-Agent": [
          "curl/8.7.1"
        ],
        "X-Envoy-Expected-Rq-Timeout-Ms": [
          "15000"
        ],
        "X-Envoy-External-Address": [
          "10.0.9.76"
        ],
        "X-Forwarded-For": [
          "10.0.9.76"
        ],
        "X-Forwarded-Proto": [
          "http"
        ],
        "X-Forwarded-Uri": [
          "https://www.example.com:8080/get"
        ],
        "X-Request-Id": [
          "55140fab-c68e-44d3-a4fc-7f6242ba8194"
        ]
      },
      "origin": "10.0.9.76",
      "url": "http://www.example.com:8080/get"
    }
      

Cleanup

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