attoparsec / examples / rfc2616.c

 * This is a simple driver for Ryan Dahl's hand-bummed C http-parser
 * package.  It is intended to read one HTTP request after another
 * from a file, nothing more.
 * For the http-parser source, see
#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

#include "http_parser.h"

int begin(http_parser *p)
    return 0;

int url(http_parser *p, const char *at, size_t len)
    return 0;

int header_field(http_parser *p, const char *at, size_t len)
    return 0;

int header_value(http_parser *p, const char *at, size_t len)
    return 0;

int complete(http_parser *p)
    /* Bludgeon http_parser into understanding that we really want to
     * keep parsing after a request that in principle ought to close
     * the "connection". */
    if (!http_should_keep_alive(p)) {
	p->http_major = 1;
	p->http_minor = 1;
	p->flags &= ~6;
    return 0;

void parse(const char *path, int fd)
    http_parser p;
    ssize_t nread;

    http_parser_init(&p, HTTP_REQUEST);
    p.on_message_begin = begin;
    p.on_url = url;
    p.on_header_field = header_field;
    p.on_header_value = header_value;
    p.on_message_complete = complete;

    do {
	size_t np;

	nread = read(fd, buf, sizeof(buf));

	np = http_parser_execute(&p, buf, nread);
	if (np != nread) {
	    fprintf(stderr, "%s: parse failed\n", path);
    } while (nread > 0);

int main(int argc, char **argv)
    int i;

    for (i = 1; i < argc; i++) {
	int fd;

	fd = open(argv[i], O_RDONLY);
	if (fd == -1) {
	parse(argv[i], fd);

    return 0;
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.