• Stars
    star
    142
  • Rank 258,495 (Top 6 %)
  • Language
    C
  • License
    MIT License
  • Created almost 3 years ago
  • Updated almost 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A lightweight HTTP server as a library.

xHTTP

xHTTP is an HTTP server library designed to be lightweight, fast, robust and easy to use.

NOTE: It's still in the early sperimentation phase (I'm still figuring things out!)

Features

xHTTP's more relevant features are:

  • It's fast
  • HTTP/1.1
  • Supports Connection: Keep-Alive
  • Uses sendfile
  • No global state
  • Single-threaded
  • Based on Linux's epoll
  • No dependencies (other than Linux and the standard library)

while some notably missing features are:

  • Only works on Linux
  • Doesn't support Transfer-Encoding: Chunked
  • No IPv6

Installation

The way you install it is by just copying xhttp.c and xhttp.h in your source tree and compiling it like it was one of your C files: include the xhttp.h where you want to use it and compile xhttp.c with your files.

Usage

To start a server instance, you need to call the xhttp function

const char *xhttp(const char *addr, unsigned short port, 
                  xh_callback callback, xh_handle *handle, 
                  const xh_config *config);

by providing it with a callback that generates the HTTP response that the library will forward to the user.

The callback's interface must be

void callback(xh_request *req, xh_response *res, void *userp);

The request information is provided through the req argument, while res is an output argument. The callback will respond to the request by setting the fields of res. These two arguments are never NULL.

Here's an example of a basic server which always responds with a "Hello, world!" message:

#include <stdio.h>
#include "xhttp.h"

static void callback(xh_request *req, xh_response *res, void *userp)
{
    (void) req;
    (void) userp;
    res->status = 200;
    res->body.str = "Hello, world!";
    xh_header_add(res, "Content-Type", "text/plain");
}

int main()
{
    const char *error = xhttp(NULL, 8080, callback, 
                              NULL, NULL, NULL);
    if(error != NULL)
    {
        fprintf(stderr, "ERROR: %s\n", error);
        return 1;
    }
    fprintf(stderr, "OK\n");
    return 0;
}

if this were your main.c file, you'd compile it with

$ gcc main.c xhttp.c -o main

You can find a slightly more complete example in example.c.

Contributing

Feel free to propose any changes or send in patches! Though I'd advise to open an issue before sending any non-trivial changes, just to make sure we're on the same page first!