Serves html with html templates over HTTP/1.1.
Find a file
Stephen Seo fef2d154ce
All checks were successful
Run Unit Tests / build-and-run-unit-tests (push) Successful in 2m2s
Handle multiple connections simultaneously
This commit changes the implementationt to store connected clients
file-descriptors and to iterate through them all periodically to handle
requests and to time-out stale connections. This means that even if one
connection is in progress, the program can still handle new connections
from other clients.

Note this does this not by threads but by taking advantage of
non-blocking io to handle each connection.

Fixes #8 .
2024-11-04 15:25:27 +09:00
.forgejo/workflows CI: Run unit tests on Release build as well 2024-09-11 13:20:21 +09:00
example_config Move test static file to "example_static_dir/" 2024-10-30 15:41:07 +09:00
example_static_dir Move test static file to "example_static_dir/" 2024-10-30 15:41:07 +09:00
src Handle multiple connections simultaneously 2024-11-04 15:25:27 +09:00
third_party Update third-party submodule SimpleArchiver 2024-10-30 14:42:27 +09:00
.gitignore Update .gitignore 2024-09-22 14:26:50 +09:00
.gitmodules Add third_party SimpleArchiver (data structures) 2024-08-30 11:58:11 +09:00
CMakeLists.txt Work on fetching static file and mime-type 2024-10-29 12:46:14 +09:00
LICENSE Add the ISC LICENSE 2024-08-29 16:09:19 +09:00
Makefile Work on fetching static file and mime-type 2024-10-29 12:46:14 +09:00
README.md Update README.md 2024-10-30 15:41:56 +09:00

C Simple HTTP

A simple HTTP/1.1 server written in C.

Usage

Usage:
  -p <port> | --port <port>
  --config=<config_file>
  --disable-peer-addr-print
  --req-header-to-print=<header> (can be used multiple times)
    For example: --req-header-to-print=User-Agent
    Note that this option is case-insensitive
  --enable-reload-config-on-change
  --enable-cache-dir=<DIR>
  --cache-entry-lifetime-seconds=<SECONDS>
  --enable-static-dir=<DIR>

Before Compiling

Make sure that the git submodule(s) are loaded:

git submodule update --init --recursive --depth=1 --no-single-branch

Without this, the project will fail to build.

Example

# Build the project.
make c_simple_http

# Alternatively, build with cmake.
cmake -S . -B buildDebug && make -C buildDebug

# Run it with the example config.
# Note that the example config was designed such that it must be referred
# to from its parent directory.
./c_simple_http --config=example_config/example.config --enable-static-dir=example_static_dir
# If built with cmake:
./buildDebug/c_simple_http --config=example_config/example.config --enable-static-dir=example_static_dir

# If port is not specified, the server picks a random port.
# This program should print which TCP port it is listening on.
# Sometimes the program will fail to rebind to the same port due to how TCP
# works. Either wait some time or choose a different port.

# Access the website.
# This assumes the server is hosted on port 3000.
curl localhost:3000

Other Notes

The config file can be reloaded if the program receives the SIGUSR1 signal.
The --enable-reload-config-on-change option automatically reloads the config file if the config file has changed.

The --enable-cache-dir=<DIR> option enables caching and sets the "cache-dir" at the same time. --cache-entry-lifetime-seconds=<SECONDS> determines when a cache entry expires. The default expiry time of a cache entry is 1 week.