Carbon HTTP Server
This is a simple HTTP server for linux operating system written in C. It supports basic HTTP requests, logging, etc. NOTE: This program is being used as a fun projects to see limits of C. I'll be not responsible for any vulnerabilities. If you find vulnerabilities please report them.
Features
- Handles GET requests for static files.
- Supports a control menu for managing server status, logging, and configuration (currently basic).
- Uses pthreads for concurrent client handling.
- Includes basic logging functionality with timestamps.
- Configuration is loaded from a JSON file (
server.json).
Future development
This section outlines potential features and improvements planned for future releases of the server.
Prioraty features
| Enhancement | Description | Priority | Completion |
|---|---|---|---|
| Basic HTTP and HTTPS server Functionality | Switching from HTTP to HTTPS | Medium | ✅ |
| Logging Mechanism | Add logging mechanism for better error handleling | Low | ✅ |
| SSL/TLS Support | Implement SSL/TLS Support for HTTP/s | High | ✅ |
Planned Features
| Enhancement | Description | Priority | Completion |
|---|---|---|---|
| WebSocket Support | Implement WebSocket protocol for real-time communication. | Medium | ❌ |
| Rate Limiting | Add rate limiting to prevent abuse and DDoS attacks. | High | ❌ |
| User Authentication | Implement user authentication for secure access to certain endpoints. | High | ❌ |
| API Documentation | Create comprehensive API documentation using Swagger or similar tools. | Medium | ❌ |
| Load Balancing | Support for load balancing across multiple server instances. | Low | ❌ |
Performance Improvements
| Enhancement | Description | Priority | Completion |
|---|---|---|---|
| Connecting Pooling | Implement connection pooling to improve performance under load. | High | ❌ |
| Asynchronous I/O | Use asynchronous I/O to handle more connections efficiently. | Medium | ❌ |
| Caching Mechanism | Introduce caching for static resources to reduce server load. | Medium | ❌ |
Security Enhancements
| Enhancement | Description | Priority | Completion |
|---|---|---|---|
| Buffer Overflow Prevention | Implement comprehensive input validation to prevent injection attacks. | High | ❌ |
| HTTPS Redirect | Automatically redirect HTTP traffic to HTTPS. | High | ❌ |
| Security Audits | Conduct regular security audits and vulnerability assessments. | Medium | ❌ |
Community Contributions
| Contribution Area | Description | Priority | Notes |
|---|---|---|---|
| Documentation | Improve and expand documentation for developers and users. | Medium | Open for contributions |
| Testing | Create unit tests and integration tests for better coverage. | High | Contributions welcome |
| Feature Requests | Encourage users to submit feature requests and suggestions. | Low | Use GitHub Issues |
Build Instructions
-
Prerequisites:
- GCC compiler
- Make (recommended)
- OpenSSL libraries (
libssl,libcrypto) - pthreads library
- cJSON library
-
Clone the repository (optional):
git clone https://github.com/Azreyo/Carbon cd Carbon/ -
Compile:
gcc server.c config_parser.c server_config.c -o server -lssl -lcrypto -lpthread -pthread -lcjson -lcjson -I/usr/include/cjsonCompile it in gcc
makeThis command will use the provided
Makefileto compile the source files, link the necessary libraries, and create the executable in thebindirectory.make cleanCleanup of the unnecessary files after compiling.
-
Create
wwwdirectory:mkdir wwwPlace your HTML files (e.g.,
index.html) inside thewwwdirectory. -
Create
server.json:Create a
server.jsonfile in the same directory as the executable with the following structure:{ "port": 8080, "use_https": false, "log_file": "server.log", "max_threads": 4, "running": true, "automatic_startup": false }Adjust the values as needed.
use_httpsis not yet implemented.
Run Instructions
- Get IP address of your device that the program will run on:
ip address
- Enable port 8080 for ufw
sudo ufw allow 8080 # 8080 is the default port
- Run it and enjoy
./bin/server # Run the executable from the bin directory
For using HTTP/s
mkdir certs # Create certs folder
cd certs
Create certs folder to create certificates to it.
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes
Generating pairs of keys key.pem and and cert.pem for 365 days.
Note: its only self-signed browser may get Potential Security Risk.
For further use on domains is recommended Let's encrypt.