cHTTP is an HTTP client and server library distributed as a single file with support for HTTPS, virtual hosts, fully non-blocking operations.
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_32Then, run the program
# Linux
./first_request
# Windows
.\first_request.exeDone!
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_32Then, run the program
# Linux
./first_server
# Windows
.\first_server.exeWhile 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 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 gccThen, 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_ENABLEDThe 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
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.