Edit request/response

In this page we will demonstrate basic operations that you can achieve in functions.

Accessing request data (incoming webhook/API request)

Lua functions use r object that provide access to request data (headers, query, method and body) and can then update any HTTP request details.

Available data to access:

Method name

Type

Description

r.RequestBody

String

Request body.

r.RequestMethod

String

Request method (PUT, POST, DELETE, etc.).

r.RequestPath

String

Request path.

r.RequestRawQuery

String

Request query, for example if the request was made with /api?category=electronics, then the query will be category=electronics.

r.RequestHeader

Table

A table [foo]bar of headers.

r.RequestQuery

Table

A table [foo]bar of query.

Read request body

An example of accessing request body and decoding it:

-- import json package
local json = require("json")

-- request body is in r.RequestBody, use it as any other string:
local body, err = json.decode(r.RequestBody)
if err then error(err) end

Reading request headers

To access specific header, use:

local my_header = r.RequestHeader["Your-Header-Name"]

Reading request URL query

To read request URL query (for example /v1/api?hub.mode=subscribe&hub.challenge=1903260781&hub.verify_token=my-token") you have two options:

  1. r.RequestQuery["hub.challenge"] which will return 1903260781 for this example.

  2. r.RequestRawQuery which will return full raw query hub.mode=subscribe&hub.challenge=1903260781&hub.verify_token=my-token"

Modify request data

Available methods to update request:

Method name

Parameter Type

Description

r:SetRequestBody(β€œstring”)

String

Update request body

r:SetRequestMethod(β€œstring”)

String

Update request method

r:SetRequestRawQuery(β€œfoo=bar”)

String

Update request raw query

r:SetRequestPath(β€œ/extra/path”)

String

Set additional extra path

r:DeleteRequestHeader("key")

String

Delete header

r:SetRequestHeader(β€œkey”, β€œvalue”)

String, String

Set new header key/value pair

An example how to update request object:

-- set body
r:SetRequestBody("new body")
-- set method
r:SetRequestMethod("string")
-- set raw query
r:SetRequestRawQuery("foo=bar")
-- set extra path
r:SetRequestPath("/extra/path")
-- set header
r:SetRequestHeader("Content-Type", "application/json")
-- delete header
r:DeleteRequestHeader("Very-Secret")

Modify response

Note: customized responses only applicable if function is attached to the Input and not bucket’s Output.

Available methods to set customized response:

Method name

Parameter Type

Description

r:SetResponseBody(β€œstring”)

String

Set response body

r:SetResponseStatusCode(201)

Integer

Set response status code

r:SetResponseHeader(β€œkey”, β€œvalue”)

String, String

Set response header key/value pair

Getting configuration values

Configuration values in Lua functions allow sharing the code without sharing sensitive information or just configuration values that might change between accounts, teams, etc.

To add a new configuration value:

  1. Create a function

  2. Go to function details

  3. Click on a tab β€œCONFIG VARIABLES”

  4. Specify config variable key and value.

Once you have specified these details, you can start using them in your functions:

-- configuration is accessible from a global "cfg" variable
local project_id = cfg:GetValue("PROJECT_ID")
-- do something with the value

Filtering requests

To filter requests based on body, headers or some external conditions, you can use r:StopForwarding() method. This will set webhook status to rejected and this webhook will not be forwarded:

-- in this example we will check the payload to make the decision
local json = require("json")

-- incoming request body example:
-- {
--   "action": "important",
--   "user": "joe"
-- }

local requestBody, err = json.decode(r.RequestBody)
if err then error(err) end

-- simple comparison of the payload
if requestBody["action"] == "not_important" then 
    -- request is not important, don't forward it
    r:StopForwarding()
    return
end 
-- Otherwise, continue forwarding or add any additional logic here

Last updated