Update request paths and methods
Use the :path
and :method
pseudo headers to change the request path and HTTP method when a request header is present.
In this example, you use an if else
function to determine the value of the :path
and :method
pseudo headers. If the bar
request header is provided, you change the path and method. In all other cases, you preserve the value of both pseudo headers.
This guide uses a subset of the supported transformation template attributes. To review all the attributes that you can set, see Templating language.
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:
- Pseudo headers must always start with a colon (
:
). - They must appear before regular headers in the HTTP/2 frame.
- Pseudo headers contain details about the request or response.
Common pseudo headers include:
:method
: The HTTP method that is used, such asGET
orPOST
.:scheme
: The protocol that is used, such ashttp
orhttps
.:authority
: The hostname and port number that the request is sent to.:path
: The path of the request.
Before you begin
Follow the Get started guide to install Gloo Gateway, 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.
Update request paths and HTTP methods
Create a RouteOption or VirtualHostOption resource with the following transformation rules:
:path
: If the request headerfoo
equals the valuebar
, set the request path in the:path
pseudo header to/post
. In all other cases, set the request path to value of the:path
pseudo header and return that value in the:path
pseudo header.:method
: If the request headerfoo
equals the valuebar
, set the HTTP method in the:method
pseudo header toPOST
. In all other cases, set the method to the value of the:method
pseudo header and return that value in the:method
pseudo header.
Send a request to the
/get
endpoint of the httpbin app. Include thefoo: bar
request header to trigger the request transformation. Verify that you get back a 200 HTTP response code and that your request path is rewritten to the/post
endpoint. The/post
endpoint accepts requests only if the HTTP POST method is used. The 200 HTTP response code therefore also indicates that the HTTP method was successfully changed from GET to POST.Example output:
< HTTP/1.1 200 OK HTTP/1.1 200 OK ... { "args": {}, "headers": { "Accept": [ "*/*" ], "Content-Length": [ "0" ], "Foo": [ "bar" ], "Host": [ "www.example.com:8080" ], "User-Agent": [ "curl/7.77.0" ], "X-Forwarded-Proto": [ "http" ], "X-Request-Id": [ "6b7debde-6a8a-4d9e-90a4-33a9a35937d3" ] }, "origin": "127.0.0.6:48539", "url": "http://www.example.com:8080/post", "data": "", "files": null, "form": null, "json": null }
Send another request to the
/get
endpoint of the httpbin app. This time, you omit thefoo: bar
header. Verify that you get back a 200 HTTP response code and that the request path is not rewritten to the/post
endpoint. The/get
endpoint accepts requests only if the HTTP GET method is used. A 200 HTTP response code therefore also verifies that the HTTP method was not changed.Example output:
< HTTP/1.1 200 OK HTTP/1.1 200 OK ... { "args": {}, "headers": { "Accept": [ "*/*" ], "Host": [ "www.example.com:8080" ], "User-Agent": [ "curl/7.77.0" ], "X-Forwarded-Proto": [ "http" ], "X-Request-Id": [ "b91ecfcf-4f79-4b65-9727-09aafcaeb40e" ] }, "origin": "127.0.0.6:46209", "url": "http://www.example.com:8080/get" }
Cleanup
You can remove the resources that you created in this guide.
kubectl delete virtualhostoption transformation -n gloo-system
kubectl delete routeoption transformation -n httpbin