Skip to content

nanonet

nanonet is a small event-driven networking package. It currently targets the hosted socket runtime used by the project examples.

use nanonet/nano_sockets
use nanonet/nano_http

Sockets

nano_sockets provides non-blocking TCP/UDP sockets, an event watcher, and a server/connection framework.

Type Purpose
ONanoSocket low-level socket wrapper
OSocketWatcher event loop around platform socket events
OSConnection base server-side connection object
ONanoServer listener and connection manager
ENanoNet socket/server exception

Server connections are object types derived from OSConnection. Override HandleInput and optionally HandleOutput.

object OMyConnection(OSConnection):
    function HandleInput(aobj : Object) [[override]]
endobj

function OMyConnection.HandleInput(aobj : Object) [[override]]:
    var buf : [256]byte
    var n : int = sock.Recv(&buf[0], SizeOf(buf))
    if n <= 0:
        Close()
    endif
endfunc

Create a server with the connection type and listen port:

var svr <- ONanoServer(OMyConnection, 8080)
svr.InitListener()
while true:
    svr.WaitForEvents(1000)
endwhile

HTTP

nano_http builds an HTTP request/response layer on top of nano_sockets.

Type Purpose
OStrMap simple string map used for headers, query values, cookies
OSConnectionHttp HTTP connection base class
ONanoHttpServer HTTP server with content-type map

Override ProcessRequest() to handle dynamic responses:

object OConn(OSConnectionHttp):
    function ProcessRequest() -> bool [[override]]
endobj

function OConn.ProcessRequest() -> bool [[override]]:
    response_headers["Content-Type"] = "text/plain"
    response = "hello"
    return true
endfunc

Important request fields on OSConnectionHttp include:

Field Meaning
method request method, uppercase
uri path without query string
url original request URL
getstr raw query string
http_ver HTTP version text
keep_alive connection reuse flag
ucheaders request headers with uppercase keys
qsvars parsed query string values
cookies parsed cookie values

Response fields:

Field Meaning
response_code status code, default 200
response_headers output headers
response in-memory response body
full_content_length length for streamed file responses

Static Files

HandleStaticFiles(root) serves files below a directory and rejects unsafe .. paths.

function OConn.ProcessRequest() -> bool [[override]]:
    if HandleStaticFiles("public"):
        return true
    endif
    response_code = 404
    response = "not found"
    return true
endfunc

The HTTP server maps common extensions such as .html, .css, .js, .png, .jpg, .svg, and .ico to content types. Unknown extensions use application/octet-stream.

See the examples in examples/nanonet/, especially http_static_files.dq.