Lightweight, Memory-efficient, SIMD-accelerated HTTP request parser for the C3 language.
Add zparse to your project by cloning it into your libs directory:
git clone https://github.com/velikoss/zparse.c3l
Then add to your project.json
dependencies:
"dependencies": ["zparse"],
import zparse;
fn void handle_request(ZString request, usz length) {
ZHttpRequest parsed_req;
if (zparse::parse(&parsed_req, request, length)) {
// Request successfully parsed
// Access:
// parsed_req.method (GET/POST/etc)
// parsed_req.uri ("/path.html")
// parsed_req.headers (array of name-value pairs)
// parsed_req.body (for POST/PUT requests)
}
}
or
fn void handle_request(ZString request, usz length) {
ZHttpRequest parsed_req;
ZHttpParser parser = { .request = &parsed_req };
if (parser.parse(request, length)) {
// Request successfully parsed
// Access:
// parsed_req.method (GET/POST/etc)
// parsed_req.uri ("/path.html")
// parsed_req.headers (array of name-value pairs)
// parsed_req.body (for POST/PUT requests)
}
}
Benchmark results on Ryzen 7 2700 (32GB DDR4, Windows 11 Pro, C3C Built-in Benchmark, -O3 flag, bench.c3):
--------------- BENCHMARKS ----------------
Benchmarking zparse::bench_simple .... [COMPLETE] 321.18 ns, 1027.74 CPU clocks
Benchmarking zparse::bench_complex ... [COMPLETE] 1277.69 ns, 4088.52 CPU clocks
Benchmarking zparse::bench_thousand .. [COMPLETE] 387429.31 ns, 1239770.25 CPU clocks
Benchmark Type | Time/Req | CPU Cycles | Requests/sec | Description |
---|---|---|---|---|
Simple Request | 321 ns | 1,028 | 3.11M req/s | Minimal GET request |
Complex Request | 1.28 μs | 4,089 | 783K req/s | Real-world with cookies |
Bulk Processing | 0.39 μs | 1,240 | 2.58M req/s | Mixed request average |
struct ZHttpRequest {
HttpMethod method; // HTTP method (GET, POST, etc)
String uri; // Request URI
HttpVersion version; // HTTP version
ZHttpHeader[64] headers; // Header array
int header_count; // Number of headers
String body; // Request body (if present)
};
struct ZHttpParser {
ZHttpRequest* request;
HttpParseState state;
int header_index;
};
ZHttpParser.parse(ZString request, usz length)
: Parse HTTP requestparse(ZHttpRequest* output, ZString request, usz length)
: Parse HTTP request
const ZString req =
"GET /index.html HTTP/1.1\r\n"
"Host: example.com\r\n"
"\r\n";
ZHttpRequest request;
ZHttpParser parser = { .request = &request };
if (!parser.parse(&parser, req, req.len())) {
// Error
}
// Access parsed data in request
zparse includes built-in benchmarks:
To test them use: c3c -O3 benchmark
The module includes 6 real-world test cases covering:
- Simple GET request
- POST request with JSON body
- HTTP/2.0 request
- Request with encoding headers
- HEAD request with custom headers
- Complex request with cookies
Run tests with:
c3c test
- C3 compiler
- No external dependencies
MIT License
Contributions welcome! Please:
- Fork the repository
- Create a feature branch
- Submit a pull request
Report bugs via GitHub issues.