From 9a9b96ceeeee1e986b29ccc8bb5d2dd54785db8e Mon Sep 17 00:00:00 2001 From: szeka9 Date: Sat, 4 Jul 2026 20:05:17 +0200 Subject: [PATCH] Bump version to v0.8.0 --- Makefile | 2 +- README.md | 4 +- dist/pyrobusta/assets/www/concepts.html | 127 +++++++++++ dist/pyrobusta/assets/www/configuration.html | 131 +++++++++++ dist/pyrobusta/assets/www/examples.html | 208 ----------------- dist/pyrobusta/assets/www/file_server.html | 145 ++++++++++++ dist/pyrobusta/assets/www/index.html | 73 ++---- dist/pyrobusta/assets/www/introduction.html | 94 ++++++++ dist/pyrobusta/assets/www/request.html | 189 ++++++++++++++++ dist/pyrobusta/assets/www/response.html | 213 ++++++++++++++++++ dist/pyrobusta/assets/www/routing.html | 136 +++++++++++ dist/pyrobusta/assets/www/static_content.html | 112 +++++++++ dist/pyrobusta/assets/www/style.css | 101 +++++++++ dist/pyrobusta/bindings/http_connection.mpy | Bin 2028 -> 2010 bytes dist/pyrobusta/protocol/http.mpy | Bin 8245 -> 8173 bytes dist/pyrobusta/protocol/http_file_server.mpy | Bin 3388 -> 3190 bytes dist/pyrobusta/protocol/http_multipart.mpy | Bin 1938 -> 2345 bytes dist/pyrobusta/server/http_server.mpy | Bin 3119 -> 3111 bytes dist/pyrobusta/utils/config.mpy | Bin 1143 -> 1143 bytes dist/pyrobusta/utils/helpers.mpy | Bin 881 -> 696 bytes dist/pyrobusta/utils/patch.mpy | Bin 0 -> 460 bytes docs/application_development/concepts.md | 2 +- docs/application_development/configuration.md | 2 +- .../application_development/error_handling.md | 2 +- docs/application_development/file_server.md | 2 +- docs/application_development/index.md | 4 +- docs/application_development/introduction.md | 4 +- docs/application_development/performance.md | 2 +- docs/application_development/reference.md | 2 +- docs/application_development/request.md | 2 +- docs/application_development/response.md | 2 +- docs/application_development/routing.md | 2 +- docs/application_development/security.md | 2 +- .../server_lifecycle.md | 2 +- .../application_development/static_content.md | 2 +- docs/img/home_page.png | Bin 60129 -> 80752 bytes package.json | 42 +++- src/pyrobusta/utils/config.py | 2 +- 38 files changed, 1332 insertions(+), 279 deletions(-) create mode 100644 dist/pyrobusta/assets/www/concepts.html create mode 100644 dist/pyrobusta/assets/www/configuration.html delete mode 100644 dist/pyrobusta/assets/www/examples.html create mode 100644 dist/pyrobusta/assets/www/file_server.html create mode 100644 dist/pyrobusta/assets/www/introduction.html create mode 100644 dist/pyrobusta/assets/www/request.html create mode 100644 dist/pyrobusta/assets/www/response.html create mode 100644 dist/pyrobusta/assets/www/routing.html create mode 100644 dist/pyrobusta/assets/www/static_content.html create mode 100644 dist/pyrobusta/assets/www/style.css create mode 100644 dist/pyrobusta/utils/patch.mpy diff --git a/Makefile b/Makefile index c18b2ad..b91a0b8 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -PYROBUSTA_VERSION := v0.7.0 +PYROBUSTA_VERSION := v0.8.0 DEVICE ?= u0 SRC_DIR := src diff --git a/README.md b/README.md index f904e5b..dd19563 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ from pyrobusta.server.http_server import HttpServer async def main(): server = HttpServer() - server.start_socket_server() + await server.start_socket_server() while True: await asyncio.sleep(1) @@ -95,7 +95,7 @@ def mem_usage(http_ctx, _): async def main(): server = http_server.HttpServer() - server.start_socket_server() + await server.start_socket_server() while True: await asyncio.sleep(1) diff --git a/dist/pyrobusta/assets/www/concepts.html b/dist/pyrobusta/assets/www/concepts.html new file mode 100644 index 0000000..b079661 --- /dev/null +++ b/dist/pyrobusta/assets/www/concepts.html @@ -0,0 +1,127 @@ + + + + + + + + +

Concepts

+

← Back

+

This chapter introduces the architectural concepts and design principles that underpin PyRobusta. +Detailed information about configuration, routing, and request handling is covered in the corresponding chapters.

+
+

Table of Contents

+ +
+

Purpose

+

PyRobusta is a lightweight embedded HTTP web server designed for predictable resource usage on constrained systems. +It provides a concise API for building web applications while emphasizing deterministic memory usage, incremental +byte-stream processing, and bounded memory allocations. These design choices reduce memory pressure and improve +long-term reliability on devices with limited RAM.

+

System Overview

+

PyRobusta is organized into a small number of runtime components, each with well-defined responsibilities. +HttpServer accepts new connections and provisions stream buffers from a shared resource pool. +HttpConnection manages the lifetime of a client connection, including request and response streams and socket I/O. +HttpEngine dispatches requests and ensures protocol correctness with incremental request +parsing. +Together, these components isolate networking, protocol processing, and application logic into distinct layers.

+

HttpServer
(Connection Admission)

HttpConnection
(Connection Management)

HttpEngine
(Request Processing)

Route Handler

+

Components

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ComponentResponsibility
HttpServerConnection management, stream buffer provisioning
HttpConnectionSocket I/O, connection lifecycle (keep-alive, timeout)
HttpEngineIncremental stream parsing, HTTP protocol validation, request routing
Route HandlerApplication-specific processing, response generation
+

Execution Model

+

PyRobusta is based on the uasyncio I/O scheduler implemented in MicroPython. +HttpServer internally creates an asynchronous socket server that accepts client connections +and associates each connection with a StreamReader and StreamWriter pair for network I/O.

+

Each client connection executes as an independent asynchronous task, allowing multiple connections +to make progress concurrently. HttpServer maintains the set of active connections and accepts +new connections until the configured maximum number of concurrent connections is reached. HttpServer +closes idle connections after the configured timeout to reclaim resources. Because each connection is +processed independently, slow clients do not block unrelated connections. However, requests within +the same connection are always processed sequentially.

+

HandlerHttpEngineHttpConnectionHttpServerClientHandlerHttpEngineHttpConnectionHttpServerClientloop[Until request complete]alt[Keep-Alive][Connection closed]New connectionReserve stream buffersCreate async connection taskProcess received bytesNeed more dataRead socketInvoke route handlerReturn responseResponse readySend responseWait for next requestRelease stream buffers

+

Memory Model

+

PyRobusta ensures bounded memory usage by allocating a fixed number of per-connection stream buffer pairs from +a shared buffer pool. The maximum number of concurrent connections determines the size of this pool. +Because stream buffers have a fixed size, memory usage per connection is bounded. Memory required +for normal request processing is reserved when a connection is accepted, rather than during request handling.

+

For each new connection, the server reserves a request and response stream buffer from the shared buffer pool. +When all stream buffers are reserved, new connections are blocked until a buffer pair becomes available +(either through connection closure or timeout). HttpServer automatically closes connections that remain inactive for too long.

+

Stream buffers are preallocated during server initialization based on the configured memory limits. +Their size and number remain fixed throughout the lifetime of the server. Preallocating stream buffers reduces heap +fragmentation, improving memory stability and reducing the risk of runtime allocation failures.

+

HttpEngine minimizes heap allocations by utilizing memoryviews for passing payload arguments to route handlers. +Memoryviews share the same underlying bytearray with stream buffers used for socket I/O, allowing application code +to access request bodies without copying the underlying data.

+

Incremental request parsing requires stream buffers that allow consumed data to be discarded while additional +bytes continue to arrive. PyRobusta therefore uses stream buffers designed for incremental processing rather than +fixed byte buffers without consumption semantics.

+

Request processing is constrained by the size of the per-connection stream buffer. While request lines and header +sections must fit entirely within the available buffer space, request bodies may be processed incrementally +depending on the transfer encoding. Incremental processing allows request bodies to exceed the buffer size +because they are received as independent processing units. This model allows arbitrarily large uploads to be +processed without buffering the complete request body in memory.

+ +

Architectural Guarantees

+

Ownership

+ +

Processing

+ +

Resource Usage

+ +

Together, these architectural decisions enable PyRobusta to handle HTTP requests with predictable resource usage, +incremental request processing, and deterministic behavior suitable for resource-constrained embedded systems.

+
+

PyRobusta v0.8.0 Web Server

+ + + diff --git a/dist/pyrobusta/assets/www/configuration.html b/dist/pyrobusta/assets/www/configuration.html new file mode 100644 index 0000000..ede073f --- /dev/null +++ b/dist/pyrobusta/assets/www/configuration.html @@ -0,0 +1,131 @@ + + + + + + + + +

Configuration

+

← Back

+

This page documents PyRobusta configuration options, +configuration deployment using mpremote, +and runtime access to configuration values through the +configuration API.

+
+

Table of Contents

+ +
+

Configuration Format & Deployment

+

Configuration overrides can be provided through pyrobusta.env, using standard .env syntax. +pyrobusta.env must be stored in the server root. Inline comments are supported using #.

+
# /pyrobusta.env - Example configuration
+
+socket_max_con=2        # allow two simultaneous socket connections
+http_multipart=False    # turn off multipart parser to lower heap usage
+http_mem_cap=0.05       # limit heap usage of stream buffers to 5% of the total heap
+tls=False               # turn off TLS
+
+

Perform a soft reset and upload pyrobusta.env using mpremote.

+
$ mpremote a0 soft-reset
+$ mpremote a0 cp pyrobusta.env :/pyrobusta.env
+
+

Parameter Description

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
wifi_ssidName of the Wi-Fi network. When empty, Wi-Fi is not initialized by the built-in wifi.py module.None
wifi_passwordPassword of the Wi-Fi network. When empty, Wi-Fi is not initialized by the built-in wifi.py module.None
http_portPort number for HTTP.80
https_portPort number for HTTPS.443
http_multipartEnables or disables multipart request and response processing. Enabling multipart support increases memory usage.False
http_mem_capFraction of available heap memory reserved for stream buffers. Valid range: (0, 1].0.1
http_served_pathsSpace-separated list of filesystem paths that may be served over HTTP./www /lib/pyrobusta
http_files_apiEnables or disables the file management API endpoint (/files), allowing upload, download, and listing of files.False
socket_max_conMaximum number of simultaneous socket connections.2
tlsEnables or disables TLS. When enabled, cert.der and key.der must be installed at the server root.False
log_levelLogging level. Can be one of: warning, info, debug.info
+

Configuration API

+

Configuration values can be accessed through the +pyrobusta.utils.config module. +Values are loaded from pyrobusta.env during server initialization. +Configuration values can be retrieved using +get_config() together with one of the +predefined CONF_* constants.

+

After initialization, configuration values are retrieved from an internal cache. +The cached values are normalized to their expected runtime types to avoid repeated +parsing of environment strings.

+

Configuration values are treated as immutable during runtime. +Changes are applied only when the configuration cache is reloaded. +The configuration cache can be reloaded by calling +read_config(), which re-reads pyrobusta.env +and rebuilds the internal normalized cache.

+
from pyrobusta.utils.config import get_config, CONF_TLS
+
+@HttpEngine.route("/tls", "GET")
+def tls_status(http_ctx, _):
+    enabled = get_config(CONF_TLS)
+    return "text/plain", f"TLS enabled: {enabled}"
+
+
+

PyRobusta v0.8.0 Web Server

+ + + diff --git a/dist/pyrobusta/assets/www/examples.html b/dist/pyrobusta/assets/www/examples.html deleted file mode 100644 index fd5d501..0000000 --- a/dist/pyrobusta/assets/www/examples.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - PyRobusta Home - - - - -

Getting Started

- - ← Back - -

This page presents useful examples to configure your server.

- -
- -

Server configuration

- -

- -
- -

Demo Application

-

The below application demonstrates common use cases for handling headers, status codes, query parameters, and wilcard URLs.

-
    -
  1. /version returns the version of the application. -
    Optionally, the server version is also included in the response if the 'detailed' query parameter is set to true. -
  2. -
  3. /app/version or /server/version returns the designated version string, handled by a single route handler with a wildcard URL. -
  4. -
- - - -

Soft reset the device and upload app.py and boot.py with mpremote.

- - -

Hard reset the device to start the application and connect over REPL.

- - -

Use curl to test your application.

- - - - - \ No newline at end of file diff --git a/dist/pyrobusta/assets/www/file_server.html b/dist/pyrobusta/assets/www/file_server.html new file mode 100644 index 0000000..a54fe4f --- /dev/null +++ b/dist/pyrobusta/assets/www/file_server.html @@ -0,0 +1,145 @@ + + + + + + + + +

File Server API

+

← Back

+

This API provides file management capabilities, allowing clients to upload, +retrieve, and manage files through various HTTP methods. +http_files_api must be set to True in +pyrobusta.env to enable this API.

+
+

Table of Contents

+ +
+

Summary

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodPathDescription
GET/files/{path}Lists or retrieves metadata about files.
PUT/files/{file path}Uploads or overwrites a file at the specified path.
POST/filesUploads multiple files in multipart/form-data.
DELETE/files/{file path}Deletes a file at the specified path.
+

File Retrieval / Listing

+

Endpoint: GET /files/{path}

+

This method allows general file system interaction, enabling operations +such as listing directory contents, retrieving metadata, and downloading +files.

+ +

Example Request

+
$ curl 192.168.1.100/files/www
+[
+    {"path": "/www/examples.html", "created": "90", "size": "4507"},
+    {"path": "/www/index.html", "created": "91", "size": "1198"}
+]
+
+

File Upload / Overwrite

+

Endpoint: PUT /files/{file path}

+

This method uploads a file or overwrites an existing file at a specific +path. The upload path is restricted to +/www/user_data.

+ +

Example Request

+
$ curl -X PUT --data 'This is a test.' \
+http://192.168.1.100/files/www/user_data/test.txt
+OK
+
+$ curl 192.168.1.100/files/www/user_data/test.txt
+This is a test.
+
+

Bulk File Upload

+

Endpoint: POST /files

+

This method handles general file uploads, designed for uploading multiple +files with per-file chunking supported. Only +multipart/form-data is accepted.

+

Uploads are restricted to /www/user_data. The +Content-Disposition header only needs to specify the file +name; the upload directory is prepended automatically.

+

http_multipart must be set to True in the +configuration to use this method.

+ +

Example Request

+
$ echo "File 1 content" > /tmp/upload-1.txt
+$ echo "File 2 content" > /tmp/upload-2.txt
+
+$ curl -X POST \
+    --form file1='@/tmp/upload-1.txt' \
+    --form file2='@/tmp/upload-2.txt' \
+    http://192.168.1.100/files
+
+$ curl 192.168.1.100/files/www/user_data
+[
+    {"path": "/www/user_data/upload-1.txt", "created": "418", "size": "15"},
+    {"path": "/www/user_data/upload-2.txt", "created": "418", "size": "15"}
+]
+
+

File Delete

+

Endpoint: DELETE /files/{file path}

+

This method deletes a file at a specific path. The path is restricted to +/www/user_data.

+ +

Example Request

+
$ curl -X DELETE \
+192.168.1.100/files/www/user_data/test.txt
+
+
+

PyRobusta v0.8.0 Web Server

+ + + diff --git a/dist/pyrobusta/assets/www/index.html b/dist/pyrobusta/assets/www/index.html index b3be74b..78418ba 100644 --- a/dist/pyrobusta/assets/www/index.html +++ b/dist/pyrobusta/assets/www/index.html @@ -1,55 +1,32 @@ - - + + - - - PyRobusta Home - + + -

PyRobusta Home

+

PyRobusta Home

+
The server is running correctly and is ready to serve content.
-

The server is running correctly and is ready to serve content.

- -
- -

Available Resources

- - - +

This page collects user guides for configuring the server and developing applications with it. +If you're new to the project, start with the introduction, which provides a hands-on application example. +Then continue with the remaining guides in the order listed below.

+
+

Available Resources

+ +
+

PyRobusta v0.8.0 Web Server

- \ No newline at end of file + diff --git a/dist/pyrobusta/assets/www/introduction.html b/dist/pyrobusta/assets/www/introduction.html new file mode 100644 index 0000000..b6b1d97 --- /dev/null +++ b/dist/pyrobusta/assets/www/introduction.html @@ -0,0 +1,94 @@ + + + + + + + + +

Getting Started

+

← Back

+

This page provides practical examples for using your server.

+
+

Table of Contents

+ +
+

Demo Application

+

The following application demonstrates the basic structure of a PyRobusta application, including route registration, +response generation, and server initialization. The application implements a simple HTTP API that returns the application version. +The example includes boot.py, which starts the application, and app.py, which registers routes and starts the HTTP server.

+
import asyncio
+
+from pyrobusta.server import http_server
+from pyrobusta.protocol.http import HttpEngine
+
+APP_VERSION = "v0.1.0"
+
+@HttpEngine.route("/version", "GET")
+def version(http_ctx, _):
+    if http_ctx.headers.get("accept") == "application/json":
+        return "application/json", {
+            "version": APP_VERSION
+        }
+
+    return "text/plain", f"{APP_VERSION}\n"
+
+async def main():
+    server = http_server.HttpServer()
+    await server.start_socket_server()
+
+    while True:
+        await asyncio.sleep(1)
+
+
# /boot.py
+# This file is executed on every boot
+
+import machine
+from os import listdir
+
+from pyrobusta.connectivity import wifi
+
+connected = wifi.initialize()
+if connected and not machine.reset_cause() == machine.SOFT_RESET:
+    if "app.py" in listdir():
+        import app
+
+        asyncio.run(app.main())
+
+

In the example, boot.py conditionally starts the server when no REPL session is active. +This allows mpremote to connect after a soft reset and upload files during development.

+

Deployment with mpremote

+

Perform a soft reset and upload app.py and boot.py using mpremote.

+
$ mpremote a0 soft-reset
+$ mpremote a0 cp app.py :/app.py
+$ mpremote a0 cp boot.py :/boot.py
+
+

Perform a hard reset to start the application and connect to the REPL.

+
$ mpremote a0 reset repl
+Connected to MicroPython at /dev/ttyACM0
+...
+[INFO] pyrobusta.con.wifi: network b'Home-Wi-Fi' found!
+[INFO] pyrobusta.con.wifi: connected, available at 192.168.1.101
+[WARN] pyrobusta.server.http_server.init_pools: low-memory mode with reduced buffer size
+[INFO] pyrobusta.server.http_server.init_pools: 2 connection(s) allowed
+[INFO] pyrobusta.server.http_server: started
+
+# You can now reach the device at 192.168.1.101 (replace with your IP)
+# Press Ctrl-x to exit
+
+

Use curl to test the application.

+
$ curl "http://192.168.1.101/version"
+v0.1.0
+
+$ curl -H "Accept: application/json" "http://192.168.1.101/version"
+{"version": "v0.1.0"}
+
+
+

PyRobusta v0.8.0 Web Server

+ + + diff --git a/dist/pyrobusta/assets/www/request.html b/dist/pyrobusta/assets/www/request.html new file mode 100644 index 0000000..7aed513 --- /dev/null +++ b/dist/pyrobusta/assets/www/request.html @@ -0,0 +1,189 @@ + + + + + + + + +

Request Processing

+

← Back

+

This page describes how route handlers receive and process incoming HTTP requests.

+
+

Table of Contents

+ +
+

Query Parameters

+

Handler functions take an HTTP context and payload as arguments. +While handler functions cannot define additional arguments, extra input can be provided +through query parameters. Query parameters appear after the path component of a URL and +are introduced by a question mark (?), for example:

+

http://192.168.1.101/path/to/resource?param-key=param-value

+

Query parameters use the same encoding rules as the application/x-www-form-urlencoded format. +Multiple query parameters are separated by the ampersand (&). Percent-encoded characters +(for example, %2F representing /) are decoded automatically by the server.

+

Query parameters can be retrieved using the get_query_param() function, which accepts two +arguments: the name of the key and an optional default value. The function returns a string +that can be further processed by the application.

+
from pyrobusta.protocol.http import HttpEngine
+
+@HttpEngine.route("/app/resource", "GET")
+def query_param_handler(http_ctx, _):
+    # Handler for /app/resource?detailed=true/false
+
+    is_detailed = False
+
+    param = http_ctx.get_query_param(
+        "detailed", default="false"
+    ).lower()
+
+    if param not in ("true", "false"):
+        http_ctx.terminate(400)
+        return "text/plain", "Invalid query"
+
+    is_detailed = param == "true"
+
+    resource = "resource content\n"
+    if is_detailed:
+        resource = "detailed " + resource
+
+    return "text/plain", resource
+
+

Request Headers

+

Headers received in a request are available in the headers attribute of the HTTP context. +The headers attribute is a dictionary of key-value pairs. Header names and values are exposed as strings. +As a convenience, the Content-Length header is automatically converted to an integer because it is frequently used for +payload size calculations. Headers are normalized to lower case, so the key "Content-Length" is equivalent to the key +"content-length".

+

Request headers must contain only a subset of US-ASCII characters:

+ +
from pyrobusta.protocol.http import HttpEngine
+
+@HttpEngine.route("/app", "GET")
+def app(http_ctx, _):
+    if http_ctx.headers.get("accept", "*/*") in ("text/plain", "*/*"):
+        return "text/plain", "App response\n"
+    elif http_ctx.headers["accept"] == "application/json":
+        return "application/json", {"response": "App response"}
+    raise ValueError("Unsupported accept header")
+
+

Request Bodies

+

A request payload is passed as the second positional argument of the +route handler. Unless the request uses streaming or multipart encoding, the payload +is provided as a memoryview to avoid unnecessary memory allocations. Deserialization must be done +by the user application.

+
import json
+
+from pyrobusta.protocol.http import HttpEngine
+
+@HttpEngine.route("/app", "GET")
+def app(http_ctx, _):
+    return "text/plain", "GET request without payload"
+
+@HttpEngine.route("/app", "POST")
+def app(http_ctx, payload):
+    data = json.loads(bytes(payload))
+    return "text/plain", "POST request with payload"
+
+

Streamed Requests

+

PyRobusta supports streaming requests by processing individual +chunks of the request body as they are received. To enforce bounded memory usage, +request chunks are processed individually by calling registered route handlers +for each chunk received. As a result, the application must process the request body +incrementally rather than assuming the full payload is available at once.

+
import pyrobusta.server.http_server as http_server
+from pyrobusta.protocol.http import HttpEngine
+from pyrobusta.utils.helpers import normalize_path
+
+@HttpEngine.route("/app/chunks", "POST")
+def upload_chunks(http_ctx, payload: bytes):
+    """
+    Route handler for demonstrating chunked transfer encoding.
+    """
+    if not http_ctx.is_chunked():
+        http_ctx.terminate(400)
+        return "text/plain", "Bad request"
+
+    if payload:
+        # Wait for more chunks before setting response status
+        with open(normalize_path("/tmp/chunks.txt"), "ab") as f:
+            f.write(payload)
+        return
+
+    # Last (empty) chunk received
+    http_ctx.terminate(201)
+    return "text/plain", "OK"
+
+async def main():
+    server = http_server.HttpServer()
+    await server.start_socket_server()
+    while True:
+        await asyncio.sleep(1)
+
+

Multipart Requests

+

Multipart requests allow clients to send multiple data parts within a single HTTP request. +Multipart requests are delivered to the application one part at a time. +The same route handler instance is invoked for each multipart segment of the same request. +Unlike regular request bodies, multipart parts are parsed by the server before being passed +to the application. Preprocessed parts consist of headers (dictionary) and the raw part body +(bytes), passed as a tuple.

+

Multipart state tracking +The HTTP context exposes the boolean attributes +mp_is_first and +mp_is_last +to identify the first and final part of a multipart request. This allows the handler to maintain per-request +state across multiple parts of the same multipart request.

+
"""
+This example demonstrates end-to-end processing of a multipart
+upload using request-scoped temporary file buffering.
+"""
+
+import asyncio
+from os import listdir, remove, rename, mkdir
+
+import pyrobusta.server.http_server as http_server
+from pyrobusta.protocol.http import HttpEngine
+from pyrobusta.utils.helpers import normalize_path
+
+@HttpEngine.route("/app/parts", "POST")
+def handle_parts(http_ctx, payload: tuple):
+    if not http_ctx.is_multipart():
+        http_ctx.terminate(400)
+        return "text/plain", "Multipart request required"
+
+    _part_headers, part_body = payload
+
+    tmp_path = normalize_path(f"/tmp/parts.{http_ctx.id}.txt")
+    target_path = normalize_path(f"/www/user_data/parts.{http_ctx.id}.txt")
+
+    with open(tmp_path, "ab") as f:
+        f.write(part_body)
+
+    # Finalize uploads
+    if http_ctx.mp_is_last:
+        rename(tmp_path, target_path)
+        http_ctx.terminate(201)
+        return "text/plain", "OK"
+
+async def main():
+    mkdir(normalize_path("/tmp"))
+    server = http_server.HttpServer()
+    await server.start_socket_server()
+    while True:
+        await asyncio.sleep(1)
+
+
+

PyRobusta v0.8.0 Web Server

+ + + diff --git a/dist/pyrobusta/assets/www/response.html b/dist/pyrobusta/assets/www/response.html new file mode 100644 index 0000000..42f3be9 --- /dev/null +++ b/dist/pyrobusta/assets/www/response.html @@ -0,0 +1,213 @@ + + + + + + + + +

Response Processing

+

← Back

+

Response processing controls how route handlers construct HTTP responses. +This includes setting status codes, configuring response headers, serializing response bodies, +and generating streamed or multipart responses.

+
+

Table of Contents

+ +
+

Status Codes

+

Route handlers may optionally set the status code of the HTTP response. +If unspecified, the server defaults to HTTP 200. The status code can be overridden +through the terminate() method of the HTTP context.

+

The terminate() method sets the HTTP status code and transitions the request into a +terminal state. Execution of the handler continues, but the response is considered +finalized. Route handlers can still return a response body.

+
from pyrobusta.protocol.http import HttpEngine
+
+@HttpEngine.route("/app/{resource}", "GET")
+def handler(http_ctx, _):
+    resource = http_ctx.path_segment(1)
+
+    if resource == "items":
+        # Default HTTP 200
+        return "application/json", ["item-1", "item-2"]
+
+    if resource == "version":
+        # Default HTTP 200
+        return "text/plain", "v0.1.0"
+
+    http_ctx.terminate(404)
+    return "text/plain", "Resource not found"
+
+

Response Headers

+

Response headers and response bodies can be configured through methods exposed by the HTTP context +(set_response_header(), set_response_body()). +Alternatively, route handlers may return a (content_type, body) tuple.

+
from pyrobusta.protocol.http import HttpEngine
+
+@HttpEngine.route("/app", "POST")
+def handler(http_ctx, payload):
+    if not payload:
+        http_ctx.set_response_header(b"x-error", b"empty-payload")
+        http_ctx.terminate(400)
+        return "text/plain", "Missing payload"
+
+    # Set a custom response header
+    http_ctx.set_response_header(b"x-app-version", b"1.0")
+
+    return "text/plain", "Request processed"
+
+

Cache Control

+

PyRobusta implements a simple caching policy. +Unless overridden by the application, all HTTP responses include the +header Cache-Control: no-store. +Conditional requests and cache validation mechanisms are not supported. +This includes ETag, Last-Modified, +If-None-Match, and If-Modified-Since. +This design reduces implementation complexity and avoids additional +filesystem metadata lookups on resource-constrained devices.

+

Content Types & Serialization

+

PyRobusta can automatically serialize a limited set of built-in types and data structures. +Unsupported types must be serialized by the application before being returned as either a string or a bytes-like +object. The following response body types are currently supported:

+ +

For non-streamed responses, the entire response body must exist in memory before it is +transmitted. As a result, the maximum response size is limited by the available heap. In the meantime, a +response buffer has a fixed size depending on the configuration. Internally, response bodies are wrapped +in a BytesIO object so that both fixed-size and streamed responses can be written through the same +buffer-oriented interface. Each response body returned by a route handler has a known size, allowing the +content-length header to be filled by the server.

+

Streamed Responses

+

Responses can be streamed in chunks when the application cannot determine the size of the response body in advance. +Such responses must use chunked transfer encoding, indicated by the Transfer-Encoding header. With chunked encoding, +the Content-Length header must be omitted; instead the size of each chunk must be indicated as the chunks are sent. +The server automatically generates the required chunk metadata.

+

When chunked transfer encoding is enabled, the server automatically generates the required encoding format. +The application must assign a generator function to http_ctx.resp_handler. The server then invokes the generator +when data is ready to be transmitted. The generator may be resumed multiple times until the stream is complete. +The following requirements must be fulfilled by the generator:

+
    +
  1. the generator function must accept a single response buffer argument (tx) used to write response data
  2. +
  3. the generator yields False after producing a chunk while additional data remains
  4. +
  5. the generator yields True exactly once to indicate that the stream is complete
  6. +
  7. the generator verifies the writable capacity of the buffer and + writes at most that much data to the buffer before yielding
  8. +
+
# /app.py
+import asyncio
+
+from pyrobusta.server import http_server
+from pyrobusta.protocol.http import HttpEngine
+
+@HttpEngine.route("/stream", "GET")
+def stream_handler(http_ctx, _):
+
+    def generate_chunks(tx):
+        for i in range(10):
+            data = b"data: chunk %d\n\n" % i
+            written = 0
+            while written < len(data):
+                to_write = tx.capacity - tx.size()
+                # Defensive check; buffer should never be full here
+                if not to_write:
+                    raise BufferError()
+                tx.write(data[written : written + to_write])
+                written += to_write
+                yield False
+        yield True
+
+    http_ctx.set_response_header(b"transfer-encoding", b"chunked")
+    http_ctx.set_response_header(b"content-type", b"text/event-stream")
+    http_ctx.resp_handler = generate_chunks
+
+async def main():
+    server = http_server.HttpServer()
+    await server.start_socket_server()
+    while True:
+        await asyncio.sleep(1)
+
+
$ curl 192.168.1.101/stream
+data: chunk 0
+
+data: chunk 1
+
+data: chunk 2
+
+...
+
+data: chunk 9
+
+

Streamed Multipart Responses

+

Multipart responses allow a single HTTP response to contain multiple independently typed payloads, +each with its own headers and body. Similar to streamed responses, PyRobusta uses response producer +functions to generate multipart response parts on demand. Because the total response size is not known +in advance, the server automatically uses chunked transfer encoding for multipart responses. It is +explicitly enabled in the example below for completeness.

+

Routes producing streamed multipart responses must satisfy the following requirements:

+
    +
  1. the route must return a tuple containing the multipart content type and a callable response producer
  2. +
  3. the response producer must return a tuple containing the content type and payload of each part
  4. +
  5. after producing the final part, the response producer must return None
  6. +
+
# /app.py
+import asyncio
+
+from pyrobusta.server import http_server
+from pyrobusta.protocol.http import HttpEngine
+
+def multipart_response(num_responses, part_size):
+    i = 0
+    def response_producer():
+        nonlocal i
+        i += 1
+        if i > num_responses:
+            return None
+        return "text/plain", b"X" * part_size
+    return response_producer
+
+@HttpEngine.route("/multipart", "GET")
+def multipart_handler(http_ctx, _):
+    http_ctx.set_response_header(b"transfer-encoding", b"chunked")
+    part_count = int(http_ctx.headers.get("x-part-count", 1))
+    part_size = int(http_ctx.headers.get("x-part-size", 1024))
+    return "multipart/form-data", multipart_response(part_count, part_size)
+
+async def main():
+    server = http_server.HttpServer()
+    await server.start_socket_server()
+    while True:
+        await asyncio.sleep(1)
+
+

Try the X-Part-Count and X-Part-Size headers to arbitrarily configure the response size.

+
$ curl -H "X-Part-Count: 3" -H "X-Part-Size: 10" 192.168.1.101/multipart
+--pyrobusta-boundary
+content-type:text/plain
+
+XXXXXXXXXX
+--pyrobusta-boundary
+content-type:text/plain
+
+XXXXXXXXXX
+--pyrobusta-boundary
+content-type:text/plain
+
+XXXXXXXXXX
+--pyrobusta-boundary--
+
+
+

PyRobusta v0.8.0 Web Server

+ + + diff --git a/dist/pyrobusta/assets/www/routing.html b/dist/pyrobusta/assets/www/routing.html new file mode 100644 index 0000000..8d8e415 --- /dev/null +++ b/dist/pyrobusta/assets/www/routing.html @@ -0,0 +1,136 @@ + + + + + + + + +

Routing

+

← Back

+

Routing maps incoming HTTP requests to application-defined route handlers. +This page describes how routes are defined, how route handlers receive requests, and how wildcard routes +can be used to match dynamic URL paths.

+
+

Table of Contents

+ +
+

Route Definitions

+

Routes map HTTP requests to server-side handler functions that +process requests and manage resources. Similar to common web frameworks, PyRobusta +utilizes function decorators to map handler functions to URL paths. A route handler +can only be mapped to a single URL path and HTTP method. The same URL path may be +associated with multiple route handlers provided that each handler uses a different +HTTP method.

+
from pyrobusta.protocol.http import HttpEngine
+
+@HttpEngine.route("/app/resource", "GET")
+def get_handler(http_ctx, _):
+    return "text/plain", "resource content\n"
+
+@HttpEngine.route("/app/resource", "POST")
+def post_handler(http_ctx, payload):
+    return "text/plain", "payload processed\n"
+
+

Route Handlers

+

In PyRobusta, a route handler is a synchronous function registered to a +specific URL path and HTTP method. PyRobusta invokes a route handler whenever it receives a +request whose URL path and HTTP method match the registered route. Route handlers must accept +exactly two positional arguments:

+ +

HTTP Context

+

The HTTP context is an instance of the HttpEngine class that exposes the +public API used to inspect requests and construct responses. The HTTP context provides public +methods and attributes that enable user applications to process headers and structure responses. +By convention, non-public attributes and methods are prefixed with an underscore.

+

Apart from the public API, the HTTP context also encapsulates the state associated with the current +request and response exchange. Internally, the HTTP context ensures protocol correctness and assists +with request routing.

+

Request Body

+

Depending on the request type, the body argument may contain either the complete +request body or a partial payload chunk. Partial request bodies are passed to route handlers +when the request uses multipart encoding or chunked transfer encoding, with each chunk of the payload +fed incrementally to the route handler. Such request processing is documented in the +Request Processing guide.

+

Wildcard Routes

+

Wildcard routes use placeholders in one or more segments of a URL path. +These placeholders match varying path values, allowing multiple URL paths to be mapped to +a single handler function. A placeholder matches a single path segment by default. Alternatively, +a placeholder can match multiple segments by using the :path suffix. For example:

+

/path/to/{resource:path}

+

Placeholders that match multiple path segments are only allowed at the end of a route. For example, +/path/{to:path}/resource is disallowed because it would result in ambiguous route resolution.

+
from pyrobusta.protocol.http import HttpEngine
+
+sensor_values = {
+    "dht22": {
+        "temperature_c": 22,
+        "rel_hum": 45
+    }
+}
+
+@HttpEngine.route("/sensors/{name}/values/{value_name}", "GET")
+def wildcard_url_handler(http_ctx, _):
+    sensor_name = http_ctx.path_segment(1)
+    sensor_value = http_ctx.path_segment(3)
+
+    if sensor_name not in sensor_values:
+        http_ctx.terminate(404)
+        return "text/plain", "Not found"
+
+    values = sensor_values[sensor_name]
+
+    if sensor_value not in values:
+        http_ctx.terminate(404)
+        return "text/plain", "Not found"
+
+    return "text/plain", str(values[sensor_value])
+
+

Route Registration & Deregistration

+

By convention, user applications should use decorators +to register route handlers in most cases. This approach ensures that routes are registered +during application initialization, and routes remain available for the lifetime of the application. +The public API exposed by HttpEngine allows route registration and deregistration +during an application's lifecycle, enabling applications to dynamically expose or +remove functionality at runtime.

+
from pyrobusta.protocol.http import HttpEngine
+
+sensor_value = {
+    "temperature_c": 22,
+    "rel_hum": 45
+}
+
+def sensor_handler(http_ctx, _):
+    return "application/json",  sensor_value
+
+@HttpEngine.route("/sensor/enabled", "PUT")
+def enable_sensor(http_ctx, enabled):
+    enabled = enabled.decode().lower()
+
+    if enabled not in ("true", "false"):
+        http_ctx.terminate(400)
+        return "text/plain", "Invalid value"
+
+    is_enabled = enabled == "true"
+
+    if is_enabled:
+        HttpEngine.register(f"/sensor/value", sensor_handler, "GET")
+    else:
+        HttpEngine.deregister(f"/sensor/value", "GET")
+
+    return "text/plain", "OK"
+
+
+

PyRobusta v0.8.0 Web Server

+ + + diff --git a/dist/pyrobusta/assets/www/static_content.html b/dist/pyrobusta/assets/www/static_content.html new file mode 100644 index 0000000..801e137 --- /dev/null +++ b/dist/pyrobusta/assets/www/static_content.html @@ -0,0 +1,112 @@ + + + + + + + + +

Static Content

+

← Back

+

PyRobusta serves static content directly from the filesystem. This page +describes the directory structure, file resolution rules, and MIME type +handling used by the server.

+
+

Table of Contents

+ +
+

Static File Serving

+

Files stored under /www are served as static content. +Requests to the server root (/) return the default landing page (index.html). +For static content requests, the server automatically prepends /www to the requested path before +resolving the corresponding file on the filesystem.

+

When the file management API is enabled (http_files_api=True), +additional filesystem locations can be exposed through the http_served_paths +configuration option. See the Server Configuration +and File Server API guide for additional details.

+

Directory Structure

+
root/
+├── www                     document root for static content
+│   ├── index.html
+│   ├── introduction.html
+│   ├── ...
+│   └── user_data           root for user uploads
+│       └── ...
+├── lib                     root for installed MIP packages
+│   ├── pyrobusta
+│   │   ├── bindings
+│   │   ├── connectivity
+│   │   └── ...
+│   └── <other packages>
+├── cert.der                TLS certificate
+└── key.der                 TLS key
+
+

MIME Type Handling

+

PyRobusta automatically determines the Content-Type header for +static files based on their filename extension. The selected content type depends on the file extension. +Unknown extensions are mapped to application/octet-stream. +The following mapping between extensions and content types is maintained by the server:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ExtensionContent-Type header
.htmltext/html
.csstext/css
.jsapplication/javascript
.jsonapplication/json
.icoimage/x-icon
.jpegimage/jpeg
.jpgimage/jpeg
.pngimage/png
.txttext/plain
.gifimage/gif
.raw, unknown extensionsapplication/octet-stream
+
+

PyRobusta v0.8.0 Web Server

+ + + diff --git a/dist/pyrobusta/assets/www/style.css b/dist/pyrobusta/assets/www/style.css new file mode 100644 index 0000000..db12f2b --- /dev/null +++ b/dist/pyrobusta/assets/www/style.css @@ -0,0 +1,101 @@ +:root { + --bg: #ffffff; + --fg: #1a1a1a; + --muted: #666; + --link: #0b5fff; + --code-bg: #f5f5f5; + --border: #e5e5e5; +} + +@media (prefers-color-scheme: dark) { + :root { + --bg: #0f1115; + --fg: #e6e6e6; + --muted: #9aa0a6; + --link: #7aa2ff; + --code-bg: #1a1d23; + --border: #2a2f3a; + } +} + +body { + font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif; + max-width: 850px; + margin: 40px auto; + padding: 0 16px; + background: var(--bg); + color: var(--fg); + line-height: 1.6; +} + +h1, h2, h3 { + line-height: 1.25; + margin-top: 1.4em; +} + +a { + color: var(--link); + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +code { + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 0.9em; +} + +pre { + background: var(--code-bg); + padding: 12px; + overflow-x: auto; + border-radius: 6px; + border: 1px solid var(--border); +} + +:not(pre) > code { + background: var(--code-bg); + padding: 2px 5px; + border-radius: 4px; +} + +pre > code { + display: block; +} + +table { + border-collapse: collapse; + width: 100%; +} + +th, td { + border: 1px solid var(--border); + padding: 6px 10px; + text-align: left; +} + +blockquote { + border-left: 3px solid var(--border); + padding-left: 12px; + color: var(--muted); + margin-left: 0; +} + +.build-note { + padding: 10px; + margin: 12px 0; + border-left: 3px solid #888; + background: #f6f6f6; + font-size: 0.9em; + color: #444; +} + +@media (prefers-color-scheme: dark) { + .build-note { + background: #1a1d23; + border-left-color: #777; + color: #bbb; + } +} \ No newline at end of file diff --git a/dist/pyrobusta/bindings/http_connection.mpy b/dist/pyrobusta/bindings/http_connection.mpy index 6fd9c1b3e44ad0259772cf4eaf037a4c91951112..8d77afb21b91f16869d5bda6b2888e13ea3d37e3 100644 GIT binary patch delta 368 zcmaFEe~W)ZK9iVQdTL30QEG8PeqM2Ed`48Puy2suqIXHjLeojjK%NZ7VP zSHsYBgRr28q#46OA?F4mm&r`5hCo>pR)0B{O(u-VlRa)aSpXF}Y6mH4Dr*PpX@qIl zD`KZEMmeK7nl+0Bs{sA&ChsZ!aD~iBU}B3R1JMCV@+*kZM6U`O=UF$T_pt# zb!8<@O+Qa16(RSHCX6l<8bNj#PiADF=WA-laCoDL*=94wBU_xEoZ>-VG2a4mhKPh2 o1IPkoyLbaPiddL2M8-M=33)1WiKq#A01Xs2F=I4gObtv103#w`F8}}l delta 326 zcmcb`|Av1}mz5lJ(K zgF-G1Lavj4vls$pby@voT{oF9CQq(-=wt>|=%^i}q^YbOtfvvCU9ab@HhC6n8Kc`| zK{iQ7_sQC93R>~r>W4Q7^KTI56IQ?J;uZ-6PN87l1_^#4<_*FkCX8``8Iexnlk?d8 zEGBWhb8s@U({D)8)z>oC)K=D33((S3Rx{95QqWLWR?^h;^Hfq1Fc$LIXu>FLa?@o( zBhWAr)5-7I<{6urF&y3~V!qjo@yHfuC#QIj4=lErF-C3>kuYNb*@A2#Z{S7|%gG1W Fr2qkuS6Bc5 diff --git a/dist/pyrobusta/protocol/http.mpy b/dist/pyrobusta/protocol/http.mpy index b991b95f59237c942baf0b10d4ea0f78f0e14e36..58790262f32173b4d762c7c9f747f31e5ea27171 100644 GIT binary patch delta 5240 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 GuJb>qXYwxq diff --git a/dist/pyrobusta/protocol/http_multipart.mpy b/dist/pyrobusta/protocol/http_multipart.mpy index 41790a5bf08e2ec6ede91f038ad1ce0802e7bdcd..d5ad1568fd4693eca101334a063f8a172f5695f6 100644 GIT binary patch literal 2345 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 delta 81 zcmV-X0IvV17_S(x;sXg1MNULePf1Qxv*-f>0u&f>WoKz~bY*g7WFTd3WN>e3ZgjKy n1t0+dBC{I@3U|tnCDWvs&urs+1m>8NDGMtFGOU5%b~MBlI~8w9cMJm*a!>Rbg)SMtSnX@1ggJNfAW-&jrCc|M69M} zo~3Q0i_583>JGz9M+X+XI?o#kSLaDyq06Y!VNw6nb7e^hw*9(B)h*K0wKzDy!f%Im zSeO@I#zGQi77DXTYPUrkCvI+KLN=9Y`1k)}=f~-omRxrBr6S{p!7JZxoT@D?c83i>W a4NEhyatl_lJOlS{K_S8An~xqvF8c>J-iSE> delta 669 zcmYL@ZBNrs6vyxF)>$5eyHe_K6YB0Ldt#7Tmzels-qnGbCVP-*A#)Yx#4q4SXbU7Jz8VkTL5O?^=NGVJOMG?C`Q@DR|NUV9csx%$U~bX1?^zr{JB?ua1}~^t%F#$Y@C* zvPmdTBpGos=@Pxj9fhSkZjmog_Nz~ew%J*oD`Sjfa!|&rk?=f@gci(926<=%MA+Gyll%~@*J5=K)%BP*6LW~ZP={D>3AtrR@r83mjks80`t>-}R@ zJv`{qL&Wv^g&NYwz{KpFE|t^a_);6=`Oq-sn3rtD$qFtrC#U^qcHyAYOE7CGcy{C% zac4)Cqfn$Ikf+A>y};yceYqSC5@`{~5qb}3$EmCMa@1{91uCJENQYm-8i*8uYHZHO(@?8+Ju052|%n;lhfNA6(g1`W{Ewpv( z^0h{o0{xQy2?PARyr37$X*n)0%Xu5Q&(+6#*tDjmEXAdfrj3MiH9sJH#B!7z`oc!j Q|7mncSNIra6j&?Je>{)An*aa+ diff --git a/dist/pyrobusta/utils/patch.mpy b/dist/pyrobusta/utils/patch.mpy new file mode 100644 index 0000000000000000000000000000000000000000..ccb4f2d0311defaf6a5ac6c316e8e9675a67e088 GIT binary patch literal 460 zcmYMtPfG$p7zXfn*3?Z`omSh70;O2{XBj2Yp@W1HNkK~xbqL+YsRUh@oiXyZE(G;$ z+U?k_K82S)OKU56nPGnK^UQl5f!rcGWELrz1FLt}XIwA!dAq|(rq0RZjyZr7ZW}%u zghEDdwHjT@AA2n*Nj~y6ff(uNj6rrhGp(LUEk1ztzj}i{b4#D9^gubM79@iKgWE2#y3);dx9crB=l1GM9ZN>GG&X+N}*WTEnIk57*)??{O+b_+;ZsVn0Yun zs$K*l&$(qZ)>{uprYcYLL{6_l8BvW4ufI_;nwXXBY;#i0xL#TCyBcwh>hoe^-p)0f zlva?N2lVCU5&HI%Dv~qa$0R5WD=V>CWx+1E=~%VyADOrc2Z;C!p0}{1EM)DCHPv_R Rr&=q5n~iz?Lxn4i`~n~ffp-7^ literal 0 HcmV?d00001 diff --git a/docs/application_development/concepts.md b/docs/application_development/concepts.md index 2c75c29..50ce84b 100644 --- a/docs/application_development/concepts.md +++ b/docs/application_development/concepts.md @@ -147,4 +147,4 @@ incremental request processing, and deterministic behavior suitable for resource --- -PyRobusta v0.7.0 Web Server +PyRobusta v0.8.0 Web Server diff --git a/docs/application_development/configuration.md b/docs/application_development/configuration.md index 46c2d5c..6eb8582 100644 --- a/docs/application_development/configuration.md +++ b/docs/application_development/configuration.md @@ -85,4 +85,4 @@ def tls_status(http_ctx, _): --- -PyRobusta v0.7.0 Web Server +PyRobusta v0.8.0 Web Server diff --git a/docs/application_development/error_handling.md b/docs/application_development/error_handling.md index d668ab7..f08be8b 100644 --- a/docs/application_development/error_handling.md +++ b/docs/application_development/error_handling.md @@ -29,4 +29,4 @@ This page is work in progress. Refer to the [main page](index.md) for available --- -PyRobusta v0.7.0 Web Server +PyRobusta v0.8.0 Web Server diff --git a/docs/application_development/file_server.md b/docs/application_development/file_server.md index a2be14c..b605dc2 100644 --- a/docs/application_development/file_server.md +++ b/docs/application_development/file_server.md @@ -136,4 +136,4 @@ $ curl -X DELETE \ --- -PyRobusta v0.7.0 Web Server +PyRobusta v0.8.0 Web Server diff --git a/docs/application_development/index.md b/docs/application_development/index.md index 8731cb7..f97dcd5 100644 --- a/docs/application_development/index.md +++ b/docs/application_development/index.md @@ -2,7 +2,7 @@ This page collects user guides for configuring the server and developing applications with it. -If you're new to the project, start with the Introduction, which provides a hands-on application example. +If you're new to the project, start with the introduction, which provides a hands-on application example. Then continue with the remaining guides in the order listed below. --- @@ -21,4 +21,4 @@ Then continue with the remaining guides in the order listed below. --- -PyRobusta v0.7.0 Web Server +PyRobusta v0.8.0 Web Server diff --git a/docs/application_development/introduction.md b/docs/application_development/introduction.md index 02f53b4..e7e3fcd 100644 --- a/docs/application_development/introduction.md +++ b/docs/application_development/introduction.md @@ -39,7 +39,7 @@ def version(http_ctx, _): async def main(): server = http_server.HttpServer() - server.start_socket_server() + await server.start_socket_server() while True: await asyncio.sleep(1) @@ -103,4 +103,4 @@ $ curl -H "Accept: application/json" "http://192.168.1.101/version" --- -PyRobusta v0.7.0 Web Server +PyRobusta v0.8.0 Web Server diff --git a/docs/application_development/performance.md b/docs/application_development/performance.md index 645d9c1..9439173 100644 --- a/docs/application_development/performance.md +++ b/docs/application_development/performance.md @@ -23,4 +23,4 @@ This page is work in progress. Refer to the [main page](index.md) for available --- -PyRobusta v0.7.0 Web Server +PyRobusta v0.8.0 Web Server diff --git a/docs/application_development/reference.md b/docs/application_development/reference.md index 4187b83..b934d48 100644 --- a/docs/application_development/reference.md +++ b/docs/application_development/reference.md @@ -26,4 +26,4 @@ This page is work in progress. Refer to the [main page](index.md) for available --- -PyRobusta v0.7.0 Web Server +PyRobusta v0.8.0 Web Server diff --git a/docs/application_development/request.md b/docs/application_development/request.md index daa8769..11a986d 100644 --- a/docs/application_development/request.md +++ b/docs/application_development/request.md @@ -205,4 +205,4 @@ async def main(): --- -PyRobusta v0.7.0 Web Server +PyRobusta v0.8.0 Web Server diff --git a/docs/application_development/response.md b/docs/application_development/response.md index d555e86..e585e3b 100644 --- a/docs/application_development/response.md +++ b/docs/application_development/response.md @@ -231,4 +231,4 @@ XXXXXXXXXX --- -PyRobusta v0.7.0 Web Server +PyRobusta v0.8.0 Web Server diff --git a/docs/application_development/routing.md b/docs/application_development/routing.md index c163af8..3c9ec18 100644 --- a/docs/application_development/routing.md +++ b/docs/application_development/routing.md @@ -148,4 +148,4 @@ def enable_sensor(http_ctx, enabled): --- -PyRobusta v0.7.0 Web Server +PyRobusta v0.8.0 Web Server diff --git a/docs/application_development/security.md b/docs/application_development/security.md index 2beeb55..5f7038d 100644 --- a/docs/application_development/security.md +++ b/docs/application_development/security.md @@ -26,4 +26,4 @@ This page is work in progress. Refer to the [main page](index.md) for available --- -PyRobusta v0.7.0 Web Server +PyRobusta v0.8.0 Web Server diff --git a/docs/application_development/server_lifecycle.md b/docs/application_development/server_lifecycle.md index 4acd516..7ec47c3 100644 --- a/docs/application_development/server_lifecycle.md +++ b/docs/application_development/server_lifecycle.md @@ -26,4 +26,4 @@ This page is work in progress. Refer to the [main page](index.md) for available --- -PyRobusta v0.7.0 Web Server +PyRobusta v0.8.0 Web Server diff --git a/docs/application_development/static_content.md b/docs/application_development/static_content.md index 27238ea..713657e 100644 --- a/docs/application_development/static_content.md +++ b/docs/application_development/static_content.md @@ -72,4 +72,4 @@ The following mapping between extensions and content types is maintained by the --- -PyRobusta v0.7.0 Web Server +PyRobusta v0.8.0 Web Server diff --git a/docs/img/home_page.png b/docs/img/home_page.png index 929d8e24f22b87dda884215589532abf46f4cf65..93d70e5ecb65edc37ace440bd3f04d19a3596839 100644 GIT binary patch literal 80752 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 z z>A&)&huulOO(hx*=x`muo*q^~#L<{h6It(E>XFaG&K&-qPI~w}|1!qa7LP-^~?{FPBBljoav++XZj?MC|A$i47u=% zCm+L?@T4470nDLFD#zZB{ecf>o6pA%%$TYfvgt;zC}~%XhyY)oHG#Vitd@WEKT=T$ zce#DM+q!?<$-6Gw!Gv8v zdS%;#vPgSLQpZ1&nDY$lLb84q0-Y>ziCNmlmy#4+PZZNzro!F0(;9x z#~CvBu8|5+5XTJ{5(~jTXd|(~1*x566x}7D1=6=YRhd@*e1Les$r^f1u~d71YxI;S{ESpZ|a5 cp?PPFDfEwj7--s!{&@>^6&>aBXD{FV7i@ocr~m)} literal 60129 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

QAFU>z-c9V04keBA-VKM;weM2YzRk{lrp_m< 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 LCOQ@O9H0LO1ENmg diff --git a/package.json b/package.json index dc36327..09a56af 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "version": "v0.7.0", + "version": "v0.8.0", "urls": [ [ "pyrobusta/connectivity/wifi.mpy", @@ -17,13 +17,45 @@ "pyrobusta/transport/connection.mpy", "github:szeka9/PyRobusta/dist/pyrobusta/transport/connection.mpy" ], + [ + "pyrobusta/assets/www/style.css", + "github:szeka9/PyRobusta/dist/pyrobusta/assets/www/style.css" + ], + [ + "pyrobusta/assets/www/request.html", + "github:szeka9/PyRobusta/dist/pyrobusta/assets/www/request.html" + ], [ "pyrobusta/assets/www/index.html", "github:szeka9/PyRobusta/dist/pyrobusta/assets/www/index.html" ], [ - "pyrobusta/assets/www/examples.html", - "github:szeka9/PyRobusta/dist/pyrobusta/assets/www/examples.html" + "pyrobusta/assets/www/configuration.html", + "github:szeka9/PyRobusta/dist/pyrobusta/assets/www/configuration.html" + ], + [ + "pyrobusta/assets/www/file_server.html", + "github:szeka9/PyRobusta/dist/pyrobusta/assets/www/file_server.html" + ], + [ + "pyrobusta/assets/www/introduction.html", + "github:szeka9/PyRobusta/dist/pyrobusta/assets/www/introduction.html" + ], + [ + "pyrobusta/assets/www/routing.html", + "github:szeka9/PyRobusta/dist/pyrobusta/assets/www/routing.html" + ], + [ + "pyrobusta/assets/www/concepts.html", + "github:szeka9/PyRobusta/dist/pyrobusta/assets/www/concepts.html" + ], + [ + "pyrobusta/assets/www/static_content.html", + "github:szeka9/PyRobusta/dist/pyrobusta/assets/www/static_content.html" + ], + [ + "pyrobusta/assets/www/response.html", + "github:szeka9/PyRobusta/dist/pyrobusta/assets/www/response.html" ], [ "pyrobusta/utils/helpers.mpy", @@ -41,6 +73,10 @@ "pyrobusta/utils/logging.mpy", "github:szeka9/PyRobusta/dist/pyrobusta/utils/logging.mpy" ], + [ + "pyrobusta/utils/patch.mpy", + "github:szeka9/PyRobusta/dist/pyrobusta/utils/patch.mpy" + ], [ "pyrobusta/utils/assets.mpy", "github:szeka9/PyRobusta/dist/pyrobusta/utils/assets.mpy" diff --git a/src/pyrobusta/utils/config.py b/src/pyrobusta/utils/config.py index 6c17576..1acb070 100644 --- a/src/pyrobusta/utils/config.py +++ b/src/pyrobusta/utils/config.py @@ -14,7 +14,7 @@ def const(n): # pylint: disable=C0116 from .helpers import normalize_path -PYROBUSTA_VERSION = "v0.7.0" +PYROBUSTA_VERSION = "v0.8.0" CONFIG_LOCATION = "pyrobusta.env" # -------------------------------------------