@eryx/http Module

JSON

HTTP/1.1 client and server library.

Built on top of @eryx/_socket and @eryx/_ssl, this module provides both one-shot convenience functions and lower-level connection and server classes for HTTP and HTTPS, with cookie jars, pooled sessions, streaming request and response bodies, multipart/form helpers, and HTTP/1.1 trailer support.

Client - one-shot request:

local http = require("@eryx/http")

local response = http.get("http://example.com/")
print(response.status, response.reason)
print(response.body)

Client - persistent connection:

local conn = http.HttpConnection.new("example.com", 80)
conn:request("GET", "/")
local resp = conn:getResponse()
conn:close()

Cookies:

local jar = http.CookieJar.new()
http.get("http://example.com/login", { cookies = jar })
-- jar stores Set-Cookie headers; subsequent requests send them back
http.get("http://example.com/dashboard", { cookies = jar })

Multipart form upload:

local body, contentType = http.multipart({
    { name = "field", value = "text" },
    { name = "file", value = data, filename = "pic.png" },
})
http.post("http://example.com/upload", body, {
    headers = { ["Content-Type"] = contentType },
})

Session with connection reuse:

local session = http.Session.new({
    connectTimeout = 2,
    readTimeout = 10,
    maxConnectionsPerHost = 4,
})
local resp = session:get("https://example.com/api")
session:close()

Server:

local server = http.HttpServer.new(function(req, res)
    res:send(200, "Hello, world!")
end, { port = 8080 })
server:listen(function(host, port)
    print("Listening on " .. host .. ":" .. tostring(port))
end)

HTTPS Server:

local ssl  = require("@eryx/_ssl")
local ctx  = ssl.create_server_context("cert.pem", "key.pem")
local server = http.HttpServer.new(handler, { port = 443, sslCtx = ctx })
server:listen()