diff --git a/README.md b/README.md new file mode 100644 index 0000000..495ebe8 --- /dev/null +++ b/README.md @@ -0,0 +1,130 @@ +

+ TinyMITM +

+ +

+ A tiny event-driven C++20 library for intercepting, debugging and modifying HTTP/HTTPS traffic. +

+ +--- + +## Table of Contents +* [Installation & Integration](#installation--integration) +* [Build Options](#build-options) +* [Usage](#usage) +* [Configuration](#configuration) +* [Running tests](#running-tests) + +## Installation & Integration + +### 1. Requirements +* **Compiler**: A C++20 compliant compiler. +* **Build System**: CMake 4.1.0 or higher. + +### 2. Integration via CMake +#### Option A: Using FetchContent (Recommended) +You can pull the library directly into your project from the git repository. Add this to your CMakeLists.txt: + +```cmake +include(FetchContent) + +FetchContent_Declare( + tinymitm + GIT_REPOSITORY https://git.neru.rip/neru/tinymitm.git + GIT_TAG main # or a specific commit hash +) + +FetchContent_MakeAvailable(tinymitm) + +target_link_libraries(your_project PRIVATE tinymitm) +``` + +#### Option B: Local Path +If you have the library downloaded locally: +```cmake +add_subdirectory(path/to/tinymitm) + +target_link_libraries(your_project PRIVATE tinymitm) +``` + +## Build Options +Toggle features by setting these variables to ``ON`` or ``OFF`` in your CMake configuration. +| Option | Description | Default | +| :--- | :--- | :--- | +| TINYMITM_LOGS | Adds log sink support (seallib) | OFF | +| TINYMITM_TEST | Adds test project | OFF | + +--- + + +## Usage + +```cpp +#include + +int main() { + TinyMITMConfig config; + config.port = 44444; + config.threadCount = 10; + + auto proxy = std::make_unique(config); + + // Intercept and modify outgoing requests + proxy->onClientRequest.add([](const std::string& url, std::string& body, std::string& headers, bool& block) { + if (url.find("example.com") != std::string::npos) { + printf("Intercepted request to example.com\\n"); + // You can modify 'body' or 'headers' here, or just block the request altogether + } + }); + + // Intercept and modify incoming responses + proxy->onServerResponse.add([](const std::string& url, std::string& body, std::string& headers, bool blocked) { + if (!blocked) { + // Rewrite response content + size_t pos = body.find("Hello"); + if (pos != std::string::npos) { + body.replace(pos, 5, "Goodbye"); + } + } + }); + + proxy->init(); + + // Proxy is now running in the background... + while(true) std::this_thread::sleep_for(std::chrono::seconds(1)); +} +``` + +## Configuration +The `TinyMITMConfig` struct allows you to customize the proxy's behavior: + +| Field | Type | Default | Description | +| :--- | :--- | :--- | :--- | +| `port` | `unsigned short` | `44444` | The port the proxy server listens on. | +| `threadCount` | `unsigned char` | `255` | Number of worker threads in the connection pool. | +| `caCertPath` | `std::string` | `"ca.pem"` | Path to the CA certificate used for signing. | +| `caKeyPath` | `std::string` | `"ca.key"` | Path to the CA private key. | +| `autoGenerateCA` | `bool` | `true` | Automatically create a new CA if files are missing. | +| `caName` | `std::string` | `"TinyMITM-CA"` | CN used when auto-generating a CA. | +| `caDays` | `int` | `365` | Validity period (in days) for auto-generated CA. | +| `installToSystemStore`| `bool` | `true` | (Windows only) Automatically install the CA to the user's Trusted Root store. | + +## Running tests + +### Windows (PowerShell + Visual Studio) +A script is provided to automate generation and open the solution in Visual Studio: + +./create-test.ps1 + +### Cross-Platform (CLI) +To build and run manually from the terminal: + +```bash +mkdir build && cd build +cmake .. -DTINYMITM_TEST=ON +cmake --build . +./tinymitm-test +``` + +### License +[MIT](https://choosealicense.com/licenses/mit/) \ No newline at end of file