Skip to content

Instantly share code, notes, and snippets.

@faultier
Last active August 29, 2015 14:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save faultier/2610192adc2449e595f7 to your computer and use it in GitHub Desktop.
Save faultier/2610192adc2449e595f7 to your computer and use it in GitHub Desktop.
HTTP parser benchmark
#include "http_parser.h"
#include <stdlib.h>
#include <string.h>
#include <assert.h>
static int finished = 0;
int message_begin_cb(http_parser *parser) {
return 0;
}
int url_cb(http_parser *parser, const char *at, size_t length) {
return 0;
}
int header_field_cb(http_parser *parser, const char *at, size_t length) {
return 0;
}
int header_value_cb(http_parser *parser, const char *at, size_t length) {
return 0;
}
int headers_complete_cb(http_parser *parser) {
return 0;
}
int body_cb(http_parser *parser, const char *at, size_t length) {
return 0;
}
int message_complete_cb(http_parser *parser) {
finished = 1;
return 0;
}
int main() {
const char *message = "GET / HTTP/1.0\r\nHost: faultier.jp\r\nUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:30.0) Gecko/20100101 Firefox/30.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Encoding: gzip,deflate\r\nAccept-Language: ja,en-US;q=0.8,en;q=0.6\r\nCache-Control: max-age=0\r\nCookie: key1=value1; key2=value2\r\nReferer: http://faultier.blog.jp/\r\n\r\n";
size_t len = strlen(message);
http_parser_settings settings;
settings.on_message_begin = message_begin_cb;
settings.on_url = url_cb;
settings.on_header_field = header_field_cb;
settings.on_header_value = header_value_cb;
settings.on_headers_complete = headers_complete_cb;
settings.on_body = body_cb;
settings.on_message_complete = message_complete_cb;
for (int i = 0; i < 100000; i++) {
finished = 0;
http_parser *parser = malloc(sizeof(http_parser));
http_parser_init(parser, HTTP_REQUEST);
size_t parsed = http_parser_execute(parser, &settings, message, len);
free(parser);
assert(parsed == len);
assert(finished);
}
return 0;
}
extern crate bee;
use bee::http::parser::{Parser, ParseRequest, MessageHandler};
struct RequestHandler {
finished: bool,
}
impl MessageHandler for RequestHandler {
fn on_message_complete(&mut self, _: &Parser) {
self.finished = true;
}
fn write(&mut self, _: &Parser, _: &[u8]) { /* ignore */ }
}
fn main() {
let data = "GET / HTTP/1.0\r\nHost: faultier.jp\r\nUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:30.0) Gecko/20100101 Firefox/30.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Encoding: gzip,deflate\r\nAccept-Language: ja,en-US;q=0.8,en;q=0.6\r\nCache-Control: max-age=0\r\nCookie: key1=value1; key2=value2\r\nReferer: http://faultier.blog.jp/\r\n\r\n".as_bytes();
let len = data.len();
for _ in range(0u, 100000) {
let mut handler = RequestHandler { finished: false };
let parsed = Parser::new(ParseRequest).parse(data, &mut handler);
assert!(parsed.unwrap() == len);
assert!(handler.finished);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment