vendor/http Vendor

A small FFI-backed HTTP server for serving static route responses from Bern.

import vendor/http/http
Note: This module loads a platform binary from lib/vendor/http - windows/bern_http.dll, macos/libbern_http.dylib, or linux/libbern_http.so. The right one is picked automatically from get_host_machine().

Server lifecycle

http_server_start(port) → ptr

Start a server bound to 0.0.0.0 on the given port; returns a server handle.

server = http_server_start(8080)
http_server_start_on(port, host) → ptr

Start a server bound to a specific host address.

server = http_server_start_on(8080, "127.0.0.1")
http_server_running(server) → boolean

Whether the server is still running.

http_server_running(server)
-- Output: true
http_server_stop(server) → boolean

Stop a running server.

http_server_stop(server)
-- Output: true

Routes & responses

http_server_set_default(server, status, content_type, body) → boolean

Set the fallback response for any unmatched route.

http_server_set_default(server, 404, "text/plain; charset=utf-8", "Not found")
-- Output: true
http_server_add_route(server, method, path, status, content_type, body) → boolean

The general route builder - full control over method, status, and content type.

http_server_add_route(server, "GET", "/teapot", 418, "text/plain", "I'm a teapot")
-- Output: true
http_server_get(server, path, body) → boolean

Add a GET route returning 200 with a plain-text body.

http_server_get(server, "/", "hello from bern http")
-- Output: true
http_server_add_route_html(server, path, html) → boolean

Add a GET route returning HTML.

http_server_add_route_html(server, "/page", "

Bern

") -- Output: true
http_server_add_route_json(server, path, json) → boolean

Add a GET route returning JSON.

http_server_add_route_json(server, "/health", "{\"ok\":true}")
-- Output: true

Polling

http_server_poll(server, timeout_ms) → int

Run a single poll tick, waiting up to timeout_ms for activity. Use it to drive your own event loop.

http_server_poll(server, 50)
http_server_serve_forever(server, poll_timeout_ms) → void

Keep polling for as long as the server is running - the simplest way to "just serve".

http_server_serve_forever(server, 50)

Status constants

Convenience constants for common HTTP status codes:

ConstantValue
HTTP_STATUS_OK200
HTTP_STATUS_CREATED201
HTTP_STATUS_NO_CONTENT204
HTTP_STATUS_BAD_REQUEST400
HTTP_STATUS_NOT_FOUND404
HTTP_STATUS_INTERNAL_ERROR500

Putting it together

A complete tiny server: register a few routes of different content types, set a fallback, then serve. This combines almost every function in the module:

A multi-route static server

import vendor/http/http

server = http_server_start(8080)

http_server_get(server, "/", "hello from bern http")
http_server_add_route_html(server, "/page", "

Bern

It works!

") http_server_add_route_json(server, "/health", "{\"ok\":true}") http_server_add_route(server, "/teapot", 418, "text/plain", "I'm a teapot") http_server_set_default(server, HTTP_STATUS_NOT_FOUND, "text/plain", "Not found") -- block and handle requests until the server stops http_server_serve_forever(server, 50)

If you need to do other work between requests, drive the loop yourself with http_server_poll:

A custom poll loop

import vendor/http/http

server = http_server_start(8080)
http_server_get(server, "/", "tick")

loop http_server_running(server) do
    http_server_poll(server, 100)
    -- ... run background tasks here ...
end