Skip to content

cozis/cHTTP

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

cHTTP

cHTTP is an HTTP client and server library distributed as a single file with support for HTTPS, virtual hosts, fully non-blocking operations.

Quick Start

Your first request

The simplest way to perform a GET request looks like this:

#include "chttp.h"

int main(void)
{
    CHTTP_Response *response;

    int ret = chttp_get(CHTTP_STR("http://coz.is/"), NULL, 0, &response);
    if (ret == CHTTP_OK) {
        printf("Received %d bytes\n", response->body.len);
        chttp_free_response(response);
    } else {
        printf("Request failure: %s\n", chttp_strerror(ret));
    }
    return 0;
}

(Note the http: schema. If you want HTTPS, you'll have to enable it explicitly! Refer to the HTTPS section.)

Copy this code to first_request.c near chttp.c and compile it by running:

# Linux
gcc chttp.c first_request.c -o first_request

# Windows (mingw)
gcc chttp.c first_request.c -o first_request.exe -lws2_32

Then, run the program

# Linux
./first_request

# Windows
.\first_request.exe

Done!

Your first server

The setup for a basic server looks like this:

#include "chttp.h"

int main(void)
{
    int ret;

    CHTTP_Server server;
    ret = chttp_server_init(&server);
    if (ret < 0) {
        fprintf(stderr, "Couldn't initialize server (%s)\n", chttp_strerror(ret));
        return -1;
    }

    chttp_server_set_reuse_addr(&server, true);
    chttp_server_set_trace_bytes(&server, true);

    ret = chttp_server_listen_tcp(&server, CHTTP_STR("127.0.0.1"), 8080);
    if (ret < 0) {
        fprintf(stderr, "Couldn't start listening (%s)\n", chttp_strerror(ret));
        return -1;
    }

    for (;;) {

        CHTTP_Request *request;
        CHTTP_ResponseBuilder builder;
        chttp_server_wait_request(&server, &request, &builder);

        chttp_response_builder_status(builder, 200);
        chttp_response_builder_body(builder, CHTTP_STR("Hello, world!"));
        chttp_response_builder_send(builder);
    }

    chttp_server_free(&server);
    return 0;
}

Copy this code to a first_server.c file and compile it by running

# Linux
gcc chttp.c first_server.c -o first_server

# Windows (mingw)
gcc chttp.c first_server.c -o first_server.exe -lws2_32

Then, run the program

# Linux
./first_server

# Windows
.\first_server.exe

While the program is running, open a browser and visit http://127.0.0.1:8080/. You should see the text "Hello, world!" sent by the server and a log of the HTTP requests and responses processed by the server in the console.

HTTPS

HTTPS is supported via OpenSSL, which is easily available on Linux and less so on Windows.

First, install the OpenSSL development libraries:

# Ubuntu/Debian Linux
sudo apt install libssl-dev gcc

Then, enable HTTPS by compiling your program with the following flags:

# Linux
gcc chttp.c main.c -lssl -lcrypto -DHTTPS_ENABLED

# Windows
gcc chttp.c main.c -lws2_32 -lssl -lcrypto -DHTTPS_ENABLED

Development Status

The major limitation of cHTTP is HTTPS on Windows. For that to work correctly it will be necessary to port the OpenSSL code to SChannel.

Other limitations:

  • HTTP client doesn't follow redirections (responses with code 3xx)
  • Support for HTTP client cookies is limited
  • HTTP server adherence to the spec can be improved

Contributing

Contributions are welcome! The following are some notes on how to work with the codebase. Don't worry if you get something wrong. I will remind you.

The source code in the src/ directory is intended to be be amalgamated into a single file before compilation. The amalgamation is not only intended as a distribution method, but also as easy-access documentation, and therefore need to be readable. For this reasons:

  • You never need need to include other cHTTP source files
  • All inclusions of third-party headers are to be placed inside src/includes.h
  • All files must start with a single empty line, unless they start with an overview comment of the file, in which case they must have no empty lines at the beginning of the file.
  • All files must end with a single empty line.

About

Fully-featured HTTP(S) client and server in a single C file

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages