commit 56d3b0f9e0089c66ee5f4ab5576c9538b143ab63 Author: danielvici123 <94993276+danielvici@users.noreply.github.com> Date: Mon Jun 8 21:23:53 2026 +0200 Initial commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..1f98058 --- /dev/null +++ b/README.md @@ -0,0 +1,111 @@ +# DHL - Simple HTTP/HTTPS Mock Server + +DHL is a lightweight, configurable HTTP/HTTPS mock server built with Rust and Axum. It allows you to define multiple routes that return static JSON responses from files. + +## Features + +- **Live Configuration Reloading**: Changes to `config.json` (routes, status codes, etc.) and response files are applied immediately without restarting the server. +- **Multi-Route Support**: Define as many paths as you need. +- **JSON Response Files**: Responses are loaded from external JSON files. +- **Request Logging**: Detailed logging of incoming requests, including methods, paths, and headers. +- **Header Masking**: Sensitive headers like `Authorization` can be masked in logs. +- **HTTPS/TLS Support**: Optional TLS support for secure connections. +- **Automatic Default Generation**: Creates default configuration and response files if they are missing. +- **Custom 404 Handler**: Returns a standard `{"error": "Not Found"}` JSON for unknown paths. + +## Configuration (`config.json`) + +The server is configured via a `config.json` file in the root directory. + +### Example Configuration + +```json +{ + "host": "127.0.0.1", + "port": 3000, + "routes": [ + { + "path": "/", + "response_file": "response.json", + "status_code": 200 + }, + { + "path": "/api/status", + "response_file": "status.json", + "status_code": 201 + } + ], + "masking": { + "enabled": true, + "headers": ["authorization", "x-api-key", "cookie"] + }, + "tls": { + "enabled": false, + "cert_path": "cert.pem", + "key_path": "key.pem" + } +} +``` + +### Fields + +| Field | Type | Description | +| :--- | :--- | :--- | +| `host` | String | The IP address to bind to (e.g., `127.0.0.1` or `0.0.0.0`). | +| `port` | Number | The port to listen on. | +| `routes` | Array | A list of route configuration objects (see below). | +| `masking` | Object | Configuration for masking sensitive headers in logs. | +| `tls` | Object | Configuration for HTTPS/TLS support. | + +#### Route Object + +| Field | Type | Description | +| :--- | :--- | :--- | +| `path` | String | The URL path (e.g., `/` or `/api/data`). | +| `response_file` | String | Path to the JSON file containing the response body. | +| `status_code` | Number | The HTTP status code to return (e.g., `200`, `201`, `400`). | + +#### Masking Object + +| Field | Type | Description | +| :--- | :--- | :--- | +| `enabled` | Boolean | Whether to enable header masking. | +| `headers` | Array | List of header names (case-insensitive) to mask in the logs. | + +#### TLS Object + +| Field | Type | Description | +| :--- | :--- | :--- | +| `enabled` | Boolean | Whether to enable HTTPS. | +| `cert_path` | String | Path to the PEM-encoded TLS certificate file. | +| `key_path` | String | Path to the PEM-encoded TLS private key file. | + +## Usage + +### Running Locally + +Ensure you have [Rust](https://www.rust-lang.org/) installed. + +```bash +cargo run +``` + +### Building for Release + +```bash +cargo build --release +``` + +### CI/CD + +This project includes a Gitea Actions workflow that automatically builds the binary when a version tag (e.g., `v1.0.0`) is pushed to the repository. + +## Project Structure + +The code is modularized for better maintainability: + +- `src/main.rs`: Entry point and server initialization. +- `src/config.rs`: Configuration loading and structures. +- `src/handlers.rs`: Route handling logic and fallback. +- `src/middleware.rs`: Request logging middleware. +- `src/state.rs`: Shared application state.