I’m pleased to announce a major feature release of Ioto 3.0.0.
This release adds HTTP Basic and Digest authentication, client-side cache control, event-driven non-blocking I/O for 10x connection scalability, and pre-compressed content serving. It also includes significant performance optimizations, security hardening from fuzzing campaigns, and new runtime APIs for enhanced fiber and socket control.
Major Features
Web Server Authentication
HTTP Basic Authentication - Username/password with configurable TLS enforcement (defaults to required) and SHA-256 password hashing
HTTP Digest Authentication - Challenge-response authentication with MD5/SHA-256 algorithms, HMAC-SHA256 nonce generation, and replay protection
Password Tool - New password command for generating hashed passwords
Flexible User Management - webAddUser() allows null password for custom auth schemes
Event-Driven Non-Blocking I/O
10x Connection Scalability - Frees fibers during keep-alive idle periods, saving 64-256KB per idle connection
Zero performance impact on active request processing
Full backward compatibility with no API changes required
Client-Side Cache Control
Route-based Cache-Control, Expires, and Pragma headers
Extension-based filtering (e.g., cache only .css, .js, .png files)
Natural time string parsing (e.g., 1week, 5mins, 1day)
Pre-Compressed Content Serving
Automatic .gz and .br file serving based on Accept-Encoding
Content negotiation with Brotli priority over gzip
Reserves large virtual address space but commits memory on demand
Configurable via limits.fiberStack* properties
Web Server Exception Handling
Fiber Exception Blocks - Optional crash recovery for web request handlers
Enable via web.fiberBlocks configuration
Catches SIGSEGV, SIGFPE, SIGBUS, SIGILL and Windows exceptions
Other Features
Standalone web server mode - Run web program without full Ioto agent
Flexible Builder endpoint configuration with SERVICES_REGISTER
New runtime APIs for socket/fiber control, time operations, and URL authentication
Comprehensive Test Framework
This release significantly extends the test framework with specialized test suites:
Unit Test Suite - Extensive unit tests covering all modules with the TestMe framework
Leak Test Suite - Memory and resource leak detection tests that verify proper cleanup of allocations, file descriptors, and other resources in long-running scenarios
Fuzz Test Suite - Security fuzzing tests for vulnerability discovery using malformed inputs, boundary conditions, and protocol edge cases. Several security fixes in this release were discovered through this comprehensive fuzzing campaign
Benchmark Test Suite - Performance benchmarking tests measuring throughput, latency, and concurrency under various workloads to validate optimization improvements
Performance Optimizations
Optimized socket accept path with R_WAIT_MAIN_FIBER flag
Zero-copy body reading via webReadDirect()
Dynamic buffer growth with rGrowBufSize()
Static response optimization with webWriteResponseString()
Dynamic poll table growth for Windows/WSAPoll
Security Fixes
Fixed invalid reference in JSON parser (discovered via fuzzing)
Fixed null dereference in HTTP method parsing (discovered via fuzzing)
HMAC-SHA256 nonce generation for Digest authentication
Constant-time comparison for timing-attack resistance
URL client header injection defense
Bug Fixes
Fixed hang in webSendFile when sending large files
Fixed upload forms multipart form-data handling
Fixed keep-alive timeout behavior
Fixed file descriptor leak in putFile operation
Fixed fiber exhaustion handling
Fixed IPv4/IPv6 dual-stack listening
Fixed macOS socket connection and dual-stack localhost issues
Fixed Windows pollFds clearing in rFreeWait
FreeRTOS and ESP32
ESP32-C6 Support - Added support for RISC-V based ESP32-C6 devices