JetServer
is a lightweight, high-performance HTTP server implemented in C++98. Designed with modularity and extensibility in mind, JetServer supports virtual hosting, customizable routing, CGI execution, and efficient connection handling using poll()
. It aims to provide a solid foundation for learning server internals or building custom web services.
- HTTP/1.1 Support with Keep-Alive – Maintain persistent client connections for efficiency.
- Event-Driven Architecture – Uses
poll()
for scalable, multiplexed I/O handling. - Chunked Response Sending – Prevents blocking when sending data to slow clients.
- Isolated Client Request Handling – Each client has separate parsing and response generation.
- CGI Script Support – Execute server-side scripts through configurable CGI programs.
- Configurable CGI Extensions – Define which file extensions trigger CGI execution (e.g.,
.php
). - Flexible Routing & Virtual Hosts – Support multiple servers, domains, and routes with custom behaviors.
- Custom Error Pages & Redirections – Easily define error pages and HTTP redirects.
- HTTP Method Filtering – Support for GET, POST, and DELETE with route-specific restrictions.
- Autoindex Support – Enable directory browsing when no index file is found.
- Request Body Size Limit – Enforce maximum allowed upload size (default 50MB).
- Developer Mode Toggle – Enable or disable directory listing globally for development convenience.
- Customizable Log File Path – Output logs to a specified file or stdout.
- Request Logging – Captures key request details, including client IP, for auditing purposes.
- Easy Configuration File – Simple syntax to configure servers, routes, CGI, and more.
- No HTTPS Support – Only HTTP is supported; no SSL/TLS encryption.
- Limited HTTP Methods – Supports only GET, POST, and DELETE methods.
- HTTP/1.1 Only – Does not support HTTP/2 or newer versions.
- No Cookie Handling – Does not manage or process HTTP cookies.
Follow these steps to install, build, and run JetServer
on a Linux system.
-
Make sure the following packages are installed:
-
Debian-based (Ubuntu, Linux Mint, etc.):
sudo apt update && sudo apt install build-essential
-
Arch-based (Arch, Manjaro, etc.):
sudo pacman -S base-devel
-
-
-
Build Instructions:
-
1- Clone the Repository:
git clone https://github.com/oussamakami/jetserver cd jetserver
-
2- Build the Project:
make jetserver
-
-
Run the Web Server:
Once built, you can start the Web Server with:
./jetserver [config_file_path]
If no configuration file is provided, it defaults to
./jetserver.conf
.
-
-
If you prefer not to run
JetServer
directly on your machine, you can use Docker:-
Build and Run the Server:
make docker_run
This will:
- Build and run
jetserver
inside a Docker container. - Mount your local
www/
folder into the container. - Use the host network to expose the ports directly.
- Write logs to
stdout
, which you can monitor with:
docker logs -f jetserver
- Build and run
-
Other Docker Commands:
-
Stop and remove the container:
make docker_kill
-
Remove the Docker image:
make docker_rmi
-
Build the Docker image:
make docker_build
-
-
JetServer is fully configurable using a structured configuration file. It supports system-wide settings, server settings, and routes. Blocks are defined as:
START_SYSTEM
…END_SYSTEM
START_SERVER
…END_SERVER
START_ROUTE
…END_ROUTE
(must be inside a SERVER block)
Set global behavior for the server:
Option | Description | Default |
---|---|---|
LOG |
Path to log file | stdout |
CGI |
Path to CGI program for server-side scripts | Optional |
CGI_EXTENSION |
File extension for CGI scripts (.py or py ) |
Optional |
BODYSIZE |
Maximum request body size in bytes | 50MB |
DEVMODE |
Default BROWSEDIR for all routes (True /False ). Disable in production |
True |
Configure each server instance:
Option | Description | Default |
---|---|---|
HOST |
IP address to bind | 0.0.0.0 |
PORT |
Port to listen on | 8080 |
DOMAIN |
Domain(s) associated with this server (| separated) |
Optional |
ERROR_XXX |
Custom path for HTTP error pages (e.g., ERROR_404 ) |
Auto-generated |
Define paths and behavior for each route (inside SERVER block):
Option | Description | Default |
---|---|---|
REQ_PATH |
Path for this route | Required |
ROOT |
Root directory for this route | Required |
INDEX |
Default file to serve | Required |
METHODS |
Allowed HTTP methods (GET|POST|DELETE ) |
None allowed |
BROWSEDIR |
Enable directory listing (True /False ) |
System DEVMODE |
REDIRECT |
URL to redirect requests | Optional |
REDIRECT_TYPE |
"HARD" for permanent, "SOFT" for temporary redirect |
HARD |
💡 Notes:
- You can define multiple server blocks. Subsequent servers inherit
HOST
andPORT
from the first server if not specified. - Always save the configuration file after changes.
- Keep
DEVMODE
disabled in production for security.
-
To Remove all build object files:
make clean
-
To Remove all build objects including the executable binary:
make fclean
-
To Remove the Docker container and image:
make docker_rmi
-
To Completely remove everything (build objects, executable, Docker container, and image):
make fclean docker_rmi
- Oussama Kamili @oussamakami
This Project Is Licensed Under © MIT License