{"id":22876698,"url":"https://github.com/vbyazilim/basichttpdebugger","last_synced_at":"2026-02-14T13:04:08.213Z","repository":{"id":215421839,"uuid":"738903029","full_name":"vbyazilim/basichttpdebugger","owner":"vbyazilim","description":"Basic https server for debug incoming http requests","archived":false,"fork":false,"pushed_at":"2026-01-23T19:18:06.000Z","size":242,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-24T00:45:01.283Z","etag":null,"topics":["golang","http-debugging","http-server","webhook-receiver","webhooks-catcher"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vbyazilim.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"vigo","patreon":"vigoo"}},"created_at":"2024-01-04T10:08:57.000Z","updated_at":"2026-01-23T19:18:11.000Z","dependencies_parsed_at":null,"dependency_job_id":"09b4435c-1393-4dfe-9590-aa1ece83d104","html_url":"https://github.com/vbyazilim/basichttpdebugger","commit_stats":null,"previous_names":["vbyazilim/basichttpdebugger"],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/vbyazilim/basichttpdebugger","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vbyazilim%2Fbasichttpdebugger","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vbyazilim%2Fbasichttpdebugger/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vbyazilim%2Fbasichttpdebugger/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vbyazilim%2Fbasichttpdebugger/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vbyazilim","download_url":"https://codeload.github.com/vbyazilim/basichttpdebugger/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vbyazilim%2Fbasichttpdebugger/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29444081,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-14T12:43:28.304Z","status":"ssl_error","status_checked_at":"2026-02-14T12:43:14.160Z","response_time":53,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["golang","http-debugging","http-server","webhook-receiver","webhooks-catcher"],"created_at":"2024-12-13T15:27:17.886Z","updated_at":"2026-02-14T13:04:08.205Z","avatar_url":"https://github.com/vbyazilim.png","language":"Go","readme":"![Version](https://img.shields.io/badge/version-0.6.2-orange.svg)\n![Go](https://img.shields.io/github/go-mod/go-version/vbyazilim/basichttpdebugger)\n[![Golang CI Lint](https://github.com/vbyazilim/basichttpdebugger/actions/workflows/go-lint.yml/badge.svg)](https://github.com/vbyazilim/basichttpdebugger/actions/workflows/go-lint.yml)\n![Docker Pulls](https://img.shields.io/docker/pulls/vigo/basichttpdebugger)\n![Docker Size](https://img.shields.io/docker/image-size/vigo/basichttpdebugger)\n![Docker Build Status](https://github.com/vbyazilim/basichttpdebugger/actions/workflows/push-to-dockerhub.yml/badge.svg)\n[![Build and push to GitHub CR](https://github.com/vbyazilim/basichttpdebugger/actions/workflows/push-to-github-cr.yml/badge.svg)](https://github.com/vbyazilim/basichttpdebugger/actions/workflows/push-to-github-cr.yml)\n![Powered by Rake](https://img.shields.io/badge/powered_by-rake-blue?logo=ruby)\n[![Go Report Card](https://goreportcard.com/badge/github.com/vbyazilim/basichttpdebugger)](https://goreportcard.com/report/github.com/vbyazilim/basichttpdebugger)\n[![codecov](https://codecov.io/gh/vbyazilim/basichttpdebugger/graph/badge.svg?token=AGNIW2SA8J)](https://codecov.io/gh/vbyazilim/basichttpdebugger)\n\n# Basic HTTP Debugger\n\nThis basic http server helps you to debug incoming http requests. It helps you to\ndebug 3\u003csup\u003erd\u003c/sup\u003e party webhooks etc...\n\n---\n\n## Usage\n\nYou can install directly the latest version if you have go installation;\n\n```bash\ngo install github.com/vbyazilim/basichttpdebugger@latest\n```\n\nor; from brew;\n\n```bash\nbrew install vbyazilim/basichttpdebugger/basichttpdebugger\n```\n\nThen run:\n\n```bash\nbasichttpdebugger -h\n\nUsage of basichttpdebugger:\n  -color\n    \tenable color\n  -hmac-header-name string\n    \tname of your signature header, e.g. X-Hub-Signature-256\n  -hmac-secret string\n    \tyour HMAC secret value\n  -listen string\n    \tlisten addr (default \":9002\")\n  -output string\n    \toutput/write responses to (default \"stdout\")\n  -save-format string\n    \tsave filename format of raw http (default \"%Y-%m-%d-%H%i%s-{hostname}-{url}.raw\")\n  -save-raw-http-request\n    \tenable saving of raw http request\n  -secret-token string\n    \tyour secret token value\n  -secret-token-header-name string\n    \tname of your secret token header, e.g. X-Gitlab-Token\n  -version\n    \tdisplay version information\n  -web-listen string\n    \tweb dashboard listen addr (default: debug port + 1)\n```\n\nStart the server;\n\n```bash\nbasichttpdebugger                   # listens at :9002\n```\n\n\u003e **Note:** The URL path doesn't matter. The server captures **all** incoming\n\u003e requests regardless of the path. `http://localhost:9002/`,\n\u003e `http://localhost:9002/webhook`, `http://localhost:9002/api/v1/users` - they\n\u003e all work the same way. The paths used in examples below (`/login`, `/upload`,\n\u003e etc.) are just for illustration purposes.\n\nListen different port:\n\n```bash\nbasichttpdebugger -listen \":8000\"    # listens at :8000\n```\n\nIf you want to test HMAC validation;\n\n```bash\nbasichttpdebugger -listen \":8000\" -hmac-secret \"\u003csecret\u003e\" -hmac-header-name \"\u003cX-HEADER-NAME\u003e\"\nbasichttpdebugger -color -listen \":8000\" -hmac-secret \"\u003csecret\u003e\" -hmac-header-name \"\u003cX-HEADER-NAME\u003e\"\n```\n\nInstead of HMAC validation, you can check against secret token/secret token\nheader name. Consider you are testing GitLab webhooks and you’ll receive\n`X-Gitlab-Token` with a value `test`:\n\n```bash\nbasichttpdebugger -listen \":8000\" -secret-token-header-name \"X-Gitlab-Token\" -secret-token \"test\"\n```\n\nInstead of standard output, pipe everything to file!\n\n```bash\nbasichttpdebugger -listen \":8000\" -hmac-secret \"\u003csecret\u003e\" -hmac-header-name \"\u003cX-HEADER-NAME\u003e\" -output \"/tmp/foo\"\n```\n\nNow, tail `/tmp/foo`:\n\n```bash\ntail -f /tmp/foo\n```\n\nWell, add some colors :)\n\n```bash\nbasichttpdebugger -listen \":8000\" -color\n```\n\n---\n\n## Web Dashboard\n\n\u003cp\u003e\n  \u003cimg src=\"screens/webui-light.png\" alt=\"Webui Light\" width=\"49%\"\u003e\n  \u003cimg src=\"screens/webui-dark.png\" alt=\"Webui Dark\" width=\"49%\"\u003e\n\u003c/p\u003e\n\nA browser-based dashboard is available for real-time request monitoring,\nsimilar to [ngrok][ngrok]’s web interface. The web dashboard starts\nautomatically when you run the server.\n\nBy default, the web dashboard runs on **debug port + 1**:\n\n```bash\nbasichttpdebugger -listen \":9002\"    # Web dashboard at http://localhost:9003\nbasichttpdebugger -listen \":8000\"    # Web dashboard at http://localhost:8001\n```\n\nYou can specify a custom port for the web dashboard:\n\n```bash\nbasichttpdebugger -listen \":9002\" -web-listen \":4040\"    # Web dashboard at http://localhost:4040\n```\n\nOr use environment variable:\n\n```bash\nWEB_LISTEN=\":4040\" basichttpdebugger\n```\n\n**Features:**\n\n- Real-time updates via Server-Sent Events (SSE)\n- Two-panel layout: request list on left, detail view on right\n- Last 50 requests stored in memory\n- JSON pretty-printing for request bodies\n- Auto-reconnect on connection loss\n\n---\n\nColor output is **disabled** if the output is set to file! You can also\nsave/capture Raw HTTP Request for later use too:\n\n```bash\nbasichttpdebugger -save-raw-http-request     # will create something like:\n                                             # 2024-12-26-163253-localhost_9002-_.raw\n                                             # slashes become _\n```\n\nIf you make:\n\n```bash\ncurl localhost:9002/test/post/data -d '{\"foo\": \"bar\"}'\n\nOK\nRaw HTTP Request is saved to: 2024-12-26-163406-localhost_9002-_test_post_data.raw\n```\n\nSet custom filename format:\n\n```bash\nbasichttpdebugger -save-raw-http-request -save-format=\"~/Desktop/%Y-%m-{hostname}.raw\"\n\nOK\nRaw HTTP Request is saved to: /Users/vigo/Desktop/2024-12-localhost_9002.raw\n```\n\nYou can replicate the same http request with using `nc`:\n\n```bash\nnc localhost 9002 \u003c /Users/vigo/Desktop/2024-12-localhost_9002.raw\n```\n\nYou can also clone the source repo and run it locally;\n\n```bash\ncd /path/to/go/develompent/\ngit clone github.com/vbyazilim/basichttpdebugger\ncd basichttpdebugger/\n\ngo run . -h               # help\ngo run . -version         # display version information\ngo run .                  # starts server, listens at :9002\n\ngo run . -listen \":8000\"  # listens at :8000\n\n# or if you have ruby installed, use rake tasks!\nrake                      # listens at :9002\nLISTEN=\":8000\" rake       # listens at :8000\n\nLISTEN=\":8000\" HMAC_SECRET=\"\u003csecret\u003e\" HMAC_HEADER_NAME=\"\u003cX-HEADER-NAME\u003e\" rake\nLISTEN=\":8000\" HMAC_SECRET=\"\u003csecret\u003e\" HMAC_HEADER_NAME=\"\u003cX-HEADER-NAME\u003e\" COLOR=1 rake\nLISTEN=\":8000\" HMAC_SECRET=\"\u003csecret\u003e\" HMAC_HEADER_NAME=\"\u003cX-HEADER-NAME\u003e\" OUTPUT=\"/tmp/foo\" rake\n\nLISTEN=\":8000\" SECRET_TOKEN=\"\u003csecret\u003e\" SECRET_TOKEN_HEADER_NAME=\"\u003cX-HEADER-NAME\u003e\" rake\n\nSAVE_RAW_HTTP_REQUEST=t rake\nSAVE_RAW_HTTP_REQUEST=t SAVE_FORMAT=\"~/Desktop/%Y-%m-%d-%H%i%s-test.raw\" rake\n```\n\n---\n\n## Flags / Environment Variable Map\n\n| Flag | Environment Variable | Default Value |\n|:-----|:---------------------|---------------|\n| `-hmac-header-name` | `HMAC_HEADER_NAME` | Not set |\n| `-hmac-secret` | `HMAC_SECRET` | Not set |\n| `-secret-token` | `SECRET_TOKEN` | Not set |\n| `-secret-token-header-name` | `SECRET_TOKEN_HEADER_NAME` | Not set |\n| `-color` | `COLOR` | `false` |\n| `-listen` | `LISTEN` | `:9002` |\n| `-output` | `OUTPUT` | `stdout` |\n| `-save-raw-http-request` | `SAVE_RAW_HTTP_REQUEST` | `false` |\n| `-save-format` | `SAVE_FORMAT` | `%Y-%m-%d-%H%i%s-{hostname}.raw` |\n| `-web-listen` | `WEB_LISTEN` | debug port + 1 |\n\n---\n\n## Save Format Placeholders\n\nMost of the format is taken from [Django](https://docs.djangoproject.com/en/5.1/ref/templates/builtins/#date)!\n\n| Placeholder | Description | Example |\n|:------------|:------------|---------|\n| `{hostname}` | Host name :) | `localhost_9002` |\n| `{url}` | URL path | `/test/post/data` =\u003e `_test_post_data` |\n| `%d` | Day of the month, 2 digits with leading zeros. | `01` to `31` |\n| `%j` | Day of the month without leading zeros. | `1` to `31` |\n| `%D` | Day of the week, textual, 3 letters. | `Fri` |\n| `%l` | Day of the week, textual, long. | `Friday` |\n| `%w` | Day of the week, digits without leading zeros. | `0` (Sunday) |\n| `%z` | Day of the year. | `1` to `366` |\n| `%W` | ISO-8601 week number of year, with weeks starting on Monday. | `1` to `53` |\n| `%m` | Month, 2 digits with leading zeros. | `01` to `12` |\n| `%n` | Month without leading zeros. | `1` to `12` |\n| `%M` | Month, textual, 3 letters. | `Jan` |\n| `%b` | Month, textual, 3 letters, lowercase. | `jan` |\n| `%F` | Month, textual, long. | `January` |\n| `%t` | Number of days in the given month. | `28` to `31` |\n| `%y` | Year, 2 digits with leading zeros. | `00` to `99` |\n| `%Y` | Year, 4 digits with leading zeros. | `0001` to `9999` |\n| `%g` | Hour, 12-hour format without leading zeros. | `1` to `12` |\n| `%G` | Hour, 24-hour format without leading zeros. | `0` to `23` |\n| `%h` | Hour, 12-hour format. | `01` to `12` |\n| `%H` | Hour, 24-hour format. | `00` to `23` |\n| `%i` | Minutes. | `00` to `59` |\n| `%s` | Seconds, 2 digits with leading zeros. | `00` to `59` |\n| `%u` | Microseconds. | `000000` to `999999` |\n| `%A` | Meridiem system. | `AM` or `PM` |\n\n---\n\n## Output\n\nHere is how it looks, a GitHub webhook (trimmed, masked due to it’s huge/private data):\n\n    ----------------------------------------------------------------------------------------------------\n    +--------------------------------------------------------------------------------------------------------------------------------------------------+\n    | Basic HTTP Debugger                                                                                                                              |\n    +------------------------------------------------------------------------+-------------------------------------------------------------------------+\n    | Version                                                                | \u003cversion\u003e                                                               |\n    | Build                                                                  | \u003cbuild-sha\u003e                                                             |\n    | Request Time                                                           | 2024-12-26 07:37:29.704382 +0000 UTC                                    |\n    | HTTP Method                                                            | POST                                                                    |\n    +------------------------------------------------------------------------+-------------------------------------------------------------------------+\n    | Request Headers                                                                                                                                  |\n    +------------------------------------------------------------------------+-------------------------------------------------------------------------+\n    | Accept                                                                 | */*                                                                     |\n    | Accept-Encoding                                                        | gzip                                                                    |\n    | Content-Length                                                         | 11453                                                                   |\n    | Content-Type                                                           | application/json                                                        |\n    | User-Agent                                                             | GitHub-Hookshot/*******                                                 |\n    | X-Forwarded-For                                                        | 140.82.115.54                                                           |\n    | X-Forwarded-Host                                                       | ****.ngrok-free.app                                                     |\n    | X-Forwarded-Proto                                                      | https                                                                   |\n    | X-Github-Delivery                                                      | 0d27de20-****-11ef-****-78dbc150f59f                                    |\n    | X-Github-Event                                                         | issue_comment                                                           |\n    | X-Github-Hook-Id                                                       | ****02493                                                               |\n    | X-Github-Hook-Installation-Target-Id                                   | 90642****                                                               |\n    | X-Github-Hook-Installation-Target-Type                                 | repository                                                              |\n    | X-Hub-Signature                                                        | sha1=****************60a5a88092f5c4678b06fd1e                           |\n    | X-Hub-Signature-256                                                    | sha256=****************bebf86cbf7bc1c69a93ff8a3d1ff0cf20ee31ff57ed85ab2 |\n    +------------------------------------------------------------------------+-------------------------------------------------------------------------+\n    | Payload                                                                                                                                          |\n    +------------------------------------------------------------------------+-------------------------------------------------------------------------+\n    | HMAC Secret                                                            | *******************                                                     |\n    | HMAC Header Name                                                       | X-Hub-Signature-256                                                     |\n    | Incoming Signature                                                     | sha256=****************bebf86cbf7bc1c69a93ff8a3d1ff0cf20ee31ff57ed85ab2 |\n    | Expected Signature                                                     | sha256=****************bebf86cbf7bc1c69a93ff8a3d1ff0cf20ee31ff57ed85ab2 |\n    | Is Valid?                                                              | true                                                                    |\n    +------------------------------------------------------------------------+-------------------------------------------------------------------------+\n    | Incoming                                                               | application/json                                                        |\n    +------------------------------------------------------------------------+-------------------------------------------------------------------------+\n    | {                                                                                                                                                |\n    |     \"action\": \"created\",                                                                                                                         |\n    |     \"comment\": {                                                                                                                                 |\n    |          :                                                                                                                                       |\n    |          :                                                                                                                                       |\n    |         \"reactions\": {                                                                                                                           |\n    |             :                                                                                                                                    |\n    |             :                                                                                                                                    |\n    |         },                                                                                                                                       |\n    |         :                                                                                                                                        |\n    |         \"user\": {                                                                                                                                |\n    |             :                                                                                                                                    |\n    |             :                                                                                                                                    |\n    |             :                                                                                                                                    |\n    |         }                                                                                                                                        |\n    |     },                                                                                                                                           |\n    |     \"issue\": {                                                                                                                                   |\n    |         :                                                                                                                                        |\n    |         \"reactions\": {                                                                                                                           |\n    |         :                                                                                                                                        |\n    |         :                                                                                                                                        |\n    |         :                                                                                                                                        |\n    |         },                                                                                                                                       |\n    |         :                                                                                                                                        |\n    |         \"user\": {                                                                                                                                |\n    |         :                                                                                                                                        |\n    |         }                                                                                                                                        |\n    |     },                                                                                                                                           |\n    |     \"organization\": {                                                                                                                            |\n    |         :                                                                                                                                        |\n    |         :                                                                                                                                        |\n    |         :                                                                                                                                        |\n    |     },                                                                                                                                           |\n    |     \"repository\": {                                                                                                                              |\n    |         :                                                                                                                                        |\n    |         :                                                                                                                                        |\n    |         :                                                                                                                                        |\n    |         \"owner\": {                                                                                                                               |\n    |         :                                                                                                                                        |\n    |         },                                                                                                                                       |\n    |         :                                                                                                                                        |\n    |         :                                                                                                                                        |\n    |     },                                                                                                                                           |\n    |     \"sender\": {                                                                                                                                  |\n    |         :                                                                                                                                        |\n    |         :                                                                                                                                        |\n    |     }                                                                                                                                            |\n    | }                                                                                                                                                |\n    +--------------------------------------------------------------------------------------------------------------------------------------------------+\n    ----------------------------------------------------------------------------------------------------\n    Raw Http Request\n    ----------------------------------------------------------------------------------------------------\n    POST /webhook/github HTTP/1.1\n    Host: ****.ngrok-free.app\n    Accept: */*\n    Accept-Encoding: gzip\n    Content-Length: 11453\n    Content-Type: application/json\n    User-Agent: GitHub-Hookshot/*******\n    X-Forwarded-For: 140.82.115.54\n    X-Forwarded-Host: ****.ngrok-free.app\n    X-Forwarded-Proto: https\n    X-Github-Delivery: 0d27de20-****-11ef-****-78dbc150f59f\n    X-Github-Event: issue_comment\n    X-Github-Hook-Id: 51990****\n    X-Github-Hook-Installation-Target-Id: 90642****\n    X-Github-Hook-Installation-Target-Type: repository\n    X-Hub-Signature: sha1=************a68b60a5a88092f5c4678b06fd1e\n    X-Hub-Signature-256: sha256=************3d61bebf86cbf7bc1c69a93ff8a3d1ff0cf20ee31ff57ed85ab2\n    \n    {\"action\":\"created\",\"issue\":{\"url\": ...} ... }\n    ----------------------------------------------------------------------------------------------------\n\nIf you are checking secret token/secret token header (`test`, `X-Gitlab-Token`),\nyou'll see something like this in Payload section:\n\n    +-----------------------------------+-----------------------------+\n    | Payload                                                         |                                                                                                                                    |\n    +-----------------------------------+-----------------------------+\n    | Secret Token                      | test                        |\n    | Secret Token Header Name          | X-Gitlab-Token              |\n    | Secret Token Matches?             | true                        |\n    +-----------------------------------+-----------------------------+\n\n---\n\n## Form Data Support\n\nThe debugger supports `application/x-www-form-urlencoded` content type. Form\ndata is parsed and displayed in a table format:\n\n```bash\ncurl -X POST http://localhost:9002/login \\\n  -H \"Content-Type: application/x-www-form-urlencoded\" \\\n  -d \"username=john\u0026password=secret123\u0026remember=true\"\n```\n\nOutput:\n\n    +-----------------------------------------------------+\n    | Payload                                             |\n    +--------------+--------------------------------------+\n    | Incoming     | application/x-www-form-urlencoded    |\n    +--------------+--------------------------------------+\n    | Form Data                                           |\n    +--------------+--------------------------------------+\n    | password     | secret123                            |\n    | remember     | true                                 |\n    | username     | john                                 |\n    +--------------+--------------------------------------+\n\nForm fields are sorted alphabetically. Multiple values for the same key are\ndisplayed comma-separated:\n\n```bash\ncurl -X POST http://localhost:9002/colors \\\n  -H \"Content-Type: application/x-www-form-urlencoded\" \\\n  -d \"color=red\u0026color=green\u0026color=blue\"\n```\n\nOutput:\n\n    +--------------+--------------------------------------+\n    | Form Data                                           |\n    +--------------+--------------------------------------+\n    | color        | red, green, blue                     |\n    +--------------+--------------------------------------+\n\nURL-encoded special characters are automatically decoded:\n\n```bash\ncurl -X POST http://localhost:9002/search \\\n  -H \"Content-Type: application/x-www-form-urlencoded\" \\\n  -d \"email=user%40example.com\u0026query=hello+world\"\n```\n\nOutput:\n\n    +--------------+--------------------------------------+\n    | Form Data                                           |\n    +--------------+--------------------------------------+\n    | email        | user@example.com                     |\n    | query        | hello world                          |\n    +--------------+--------------------------------------+\n\n---\n\n## File Upload Support\n\nThe debugger supports `multipart/form-data` content type for file uploads.\nBoth form fields and files are parsed and displayed:\n\n```bash\ncurl -X POST http://localhost:9002/upload \\\n  -F \"username=vigo\" \\\n  -F \"description=Test upload\" \\\n  -F \"config=@config.json\"\n```\n\nOutput:\n\n    +-----------------------------------------------------+\n    | Payload                                             |\n    +--------------+--------------------------------------+\n    | Incoming     | multipart/form-data; boundary=...    |\n    +--------------+--------------------------------------+\n    | Form Data                                           |\n    +--------------+--------------------------------------+\n    | description  | Test upload                          |\n    | username     | vigo                                 |\n    +--------------+--------------------------------------+\n    | Files                                               |\n    +--------------+--------------------------------------+\n    | config.json | 18 B | application/json               |\n    | {\"theme\": \"dark\"}                                   |\n    +-----------------------------------------------------+\n\nFile metadata is displayed for all uploaded files:\n\n```bash\ncurl -X POST http://localhost:9002/upload \\\n  -F \"avatar=@photo.png\"\n```\n\nOutput:\n\n    +-----------------------------------------------------+\n    | Files                                               |\n    +-----------------------------------------------------+\n    | photo.png | 2.5 KB | application/octet-stream       |\n    +-----------------------------------------------------+\n\nFor small text files (under 1KB), the content is displayed. For larger files\nor binary files, only metadata (filename, size, content-type) is shown.\n\n**Image Preview in Web Dashboard:** When you upload image files (JPEG, PNG, GIF,\netc.), the web dashboard displays a preview of the image alongside the file\nmetadata.\n\nMultiple files can be uploaded at once:\n\n```bash\ncurl -X POST http://localhost:9002/upload \\\n  -F \"file1=@readme.txt\" \\\n  -F \"file2=@data.json\" \\\n  -F \"image=@logo.png\"\n```\n\nForm fields and files are displayed in separate sections, both in the terminal\nand in the web dashboard.\n\n---\n\n## Docker\n\nFor local docker usage, default expose port is: `9002` (debug) and `9003` (web dashboard).\n\n```bash\ndocker build -t \u003cyour-image\u003e .\n\n# run with both debug and web dashboard ports\ndocker run -p 9002:9002 -p 9003:9003 \u003cyour-image\u003e\n\n# run from custom port (web dashboard will be at 8401)\ndocker run -p 8400:8400 -p 8401:8401 \u003cyour-image\u003e -listen \":8400\"\n\n# run with custom web dashboard port\ndocker run -p 8400:8400 -p 4040:4040 \u003cyour-image\u003e -listen \":8400\" -web-listen \":4040\"\n\n# with hmac support\ndocker run -p 8400:8400 -p 8401:8401 \u003cyour-image\u003e -listen \":8400\" -hmac-secret \"\u003csecret\u003e\" -hmac-header-name \"\u003cX-HEADER-NAME\u003e\"\n\n# with secret token support\ndocker run -p 8400:8400 -p 8401:8401 \u003cyour-image\u003e -listen \":8400\" -secret-token \"\u003csecret\u003e\" -secret-token-header-name \"\u003cX-HEADER-NAME\u003e\"\n```\n\nYou can download/use from docker hub or ghcr:\n\n- https://hub.docker.com/r/vigo/basichttpdebugger/\n- https://github.com/vbyazilim/basichttpdebugger/pkgs/container/basichttpdebugger%2Fbasichttpdebugger\n\n```bash\ndocker run vigo/basichttpdebugger\n\ndocker run -p 9002:9002 vigo/basichttpdebugger                    # run from default port\ndocker run -p 8400:8400 vigo/basichttpdebugger -listen \":8400\"    # run from 8400\n\n# run from docker hub on port 9100 with hmac support\ndocker run -p 9100:9100 vigo/basichttpdebugger -listen \":9100\" -hmac-secret \"\u003csecret\u003e\" -hmac-header-name \"\u003cX-HEADER-NAME\u003e\"\n\n# run from docker hub on port 9100 with secret token/secret token header name support\ndocker run -p 9100:9100 vigo/basichttpdebugger -listen \":9100\" -secret-token \"\u003csecret\u003e\" -secret-token-header-name \"\u003cX-HEADER-NAME\u003e\"\n\n# run from ghcr on default port\ndocker run -p 9002:9002 ghcr.io/vbyazilim/basichttpdebugger/basichttpdebugger:latest\n\n# run from ghcr on 9100\ndocker run -p 9100:9100 ghcr.io/vbyazilim/basichttpdebugger/basichttpdebugger:latest -listen \":9100\"\n\n# run from ghcr on 9100 with hmac support\ndocker run -p 9100:9100 ghcr.io/vbyazilim/basichttpdebugger/basichttpdebugger:latest -listen \":9100\" -hmac-secret \"\u003csecret\u003e\" -hmac-header-name \"\u003cX-HEADER-NAME\u003e\"\n```\n\n---\n\n## Rake Tasks\n\n```bash\nrake -T\n\nrake coverage           # show test coverage\nrake docker:build       # build docker image locally\nrake docker:run         # run docker image locally\nrake release[revision]  # release new version major,minor,patch, default: patch\nrake run                # run server (default port 9002)\nrake test               # run test\n```\n\n---\n\n## Change Log\n\n**2026-01-23**\n\n- add `application/x-www-form-urlencoded` content type support\n- add `multipart/form-data` content type support for file uploads\n- form data is parsed and displayed in table format\n- file uploads show metadata (filename, size, content-type)\n- small text files (under 1KB) display content inline\n- multiple values for the same key are comma-separated\n- URL-encoded characters are automatically decoded\n- web dashboard supports form data and file upload display\n- web dashboard shows image preview for uploaded images (JPEG, PNG, GIF, etc.)\n- binary file content is sanitized in terminal output (`[binary data: X KB]`)\n- add homebrew-tap\n\n**2025-01-23**\n\n- add web dashboard for real-time request monitoring (similar to ngrok)\n- add `-web-listen` flag and `WEB_LISTEN` environment variable\n\n**2025-02-02**\n\n- improve `stringutils` tests\n- add secret token/secret token header name support\n\n**2024-12-24**\n\n- refactor from scratch\n- disable color when output is file (due to ansi codes, output looks glitchy)\n- auto detect terminal and column width\n- add raw http request for response\n\n**2024-12-23**\n\n- many improvements, pretty output with colors!\n- now you can pipe to file too!\n\n**2024-09-17**\n\n- change default host port to `9002`\n- add github actions for docker hub and ghcr\n\n**2024-06-22**\n\n- remove environment variables from source. only `rake` task requires\n  environment variables\n- add command-line flags: `-listen`, `-hmac-secret`, `-hmac-header-name`,\n  `-h`, `--help`\n- add HMAC validation indicator\n\n---\n\n## TODO\n\n- Add brew tap installation support\n\n---\n\n## Rake Tasks\n\n```bash\n$ rake -T\n\nrake coverage           # show test coverage\nrake docker:build       # build docker image locally\nrake docker:run         # run docker image locally\nrake release[revision]  # release new version major,minor,patch, default: patch\nrake run                # run server (default port 9002)\nrake test               # run test\n```\n\n---\n\n## License\n\nThis project is licensed under MIT\n\n---\n\nThis project is intended to be a safe, welcoming space for collaboration, and\ncontributors are expected to adhere to the [code of conduct][coc].\n\n[coc]: https://github.com/vbyazilim/basichttpdebugger/blob/main/CODE_OF_CONDUCT.md\n[ngrok]: https://ngrok.com/","funding_links":["https://github.com/sponsors/vigo","https://patreon.com/vigoo"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvbyazilim%2Fbasichttpdebugger","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvbyazilim%2Fbasichttpdebugger","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvbyazilim%2Fbasichttpdebugger/lists"}