llhttp bindings for MoonBit
let request = "GET /api/user?id=123 HTTP/1.1\r\n" +
"Host: api.example.com\r\n" +
"Accept: text/html, application/json\r\n" +
"Accept-Language: en-US\r\n" +
"Connection: keep-alive\r\n\r\n"
let parser = @llhttp.Parser::new()
parser.on_message_begin(fn(_parser) {
println("message begin")
OK
})
parser.on_headers_complete(fn(_parser) {
println("headers complete")
OK
})
parser.on_message_complete(fn(_parser) {
println("message complete")
OK
})
parser.on_protocol(fn(_parser, protocol) {
println("protocol: \{protocol}")
OK
})
parser.on_url(fn(_parser, url) {
println("url: \{url}")
OK
})
parser.on_status(fn(_parser, status) {
println("status: \{status}")
OK
})
parser.on_method(fn(_parser, http_method) {
println("method: \{http_method}")
OK
})
parser.on_version(fn(_parser, version) {
println("version: \{version}")
OK
})
parser.on_header_field(fn(_parser, field) {
println("header_field: \{field}")
OK
})
parser.on_header_value(fn(_parser, value) {
println("header_value: \{value}")
OK
})
let errno = parser.execute(get_request_1)
println("errno: \{errno}")
println("type: \{parser.get_type()}")
println("keep-alive: \{parser.should_keep_alive()}")
// console output:
//
// message begin
// method: GET
// url: /api/user?id=123
// protocol: HTTP
// version: 1.1
// header_field: Host
// header_value: api.example.com
// header_field: Accept
// header_value: text/html, application/json
// header_field: Accept-Language
// header_value: en-US
// header_field: Connection
// header_value: keep-alive
// headers complete
// message complete
// errno: OK
// type: REQUEST
// keep-alive: true