HTTP
The HTTP module provides basic HTTP types, such as Request, Response and Uri, as well as a http.request function for easy requests.
local http = require "http"
Methods
http.request
http.request(uri: string | Uri) -> Response
http.request(req: {
method?: string = "GET",
uri: string,
headers?: { [key: string]: string | string[] },
body?: Body,
}) -> Response
Sends an HTTP request. You can either use a single URI to send GET requests, or use other methods, add headers or a body with the latter builder table.
For convenience, any underscore (_) in headers' keys is replaced with dash (-). To avoid that, use @ prefix:
http.request {
headers = {
x_my_custom_header = "foo bar" -- sends `x-my-custom-header`
}
}
http.request {
headers = {
["@x_my_custom_header"] = "foo bar" -- sends "x_my_custom_header"
}
}
Examples
The simpliest usage is to send a GET request to the server using a single URI:
local http = require "http"
local resp, err = http.request "https://httpbin.org/get"
assert(resp, err)
Send an HTTP POST request with body and User-Agent header:
local http = require "http"
local resp, err = http.request {
method = "POST",
uri = "https://httpbin.org/post",
body = "Hello, world!",
headers = {
["user-agent"] = "abel/0.1.0"
}
}
assert(resp, err)
Types
Request
type Request = <userdata>
HTTP request representation.
You don't need to manually create a Request yourself — either receive one in abel.listen's handlers, or send one using a builder table in http.request.
Request.method
Request.method: string
The request's method.
Request.uri
Request.uri: Uri
The request's URI, parsed into Uri userdata.
Request.headers
Request.headers: HeaderMap
The request's header map.
Request.body
Request.body: Body
The request's body.
Request.params
Request.params: { [key: string]: string }
Extracted path parameters. Only used in abel.listen's handlers.
Response
type Response = <userdata>
HTTP response representation.
http.Response
http.Response(builder: {
status?: integer = 200,
headers?: { [key: string]: string | string[] },
body?: Body
}) -> Response
Response.status
Response.status: integer
Response.header
Response.header: HeaderMap
Response.body
Response.body: Body
Body
type Body = nil | string | Value | Stream<string>
HTTP body representation. It could be nil, a string, a JSON value, or a stream of strings.
Note that the Body returned from methods or callbacks is always ByteStream. However, you can use one of the aforementioned types in custom requests and responses.
Uri
type Uri = <userdata>
Parsed URI, either absolute or relative.
http.Uri
http.Uri(uri: string) -> Uri
http.Uri(builder: {
scheme?: string,
authority?: string,
path_and_query?: string,
path?: string,
query?: QueryMap
}) -> Uri
Parses a URI from string, or build one using a builder table.
Fragments in URIs are ignored, since these are not sent to the server in normal cases.
Uri:query
Uri:query() -> QueryMap
Parses the query string of the URI, returning a map of query as QueryMap.
Returns error if parsing query string failed.
Examples
local http = require "http"
local uri = http.Uri "https://example.com/?foo=bar&baz=hello%20world"
local query, err = uri:query()
assert(query, err)
-- Note that URI escapes are resolved (in this case the space `%20`)
assert(query.foo == "bar")
assert(query.baz == "hello world")
Uri.scheme
Uri.scheme: string
Uri.host
Uri.host: string
Uri.port
Uri.port: integer
Uri.authority
Uri.authority: string
Uri.path
Uri.path: string
Uri.query_string
Uri.query_string: string
HeaderMap
type HeaderMap = <userdata>
Map of HTTP headers.
Can be indexed or iterated using pairs.
print("The content type is: " .. req.headers.content_type)
print "Full header list:"
for k, v in pairs(req.headers) do
print(k .. ": " .. v)
end
When indexed, underscores (_) can be used as dashes (-), as the above code shows. If you do want to access a field with underscores in its name, you can use @ prefix:
local my_header = req.headers["@header_with_underscore"]
HeaderMap:get
HeaderMap:get(key: string) -> ...string
Get one or more header field of the name key.
This method strictly matches its name, meaning that it does not replace underscores in key or use @ prefix.
QueryMap
type QueryMap = { [key: string]: string | string[] | QueryMap | QueryMap[] }
Representing an URI's query structure, with multi-level support.