Tags: kostyay/httpmon
Tags
fix(tui): replace chafa-go with pure-Go image renderer (#42) * fix(proxy): create data directory on first run Fixes #39. proxy.Init() failed when ~/.httpmon/ didn't exist because config.Load returns defaults without creating the directory. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(tui): replace chafa-go with pure-Go go-termimg for image rendering chafa-go panics in init() when system glib is not installed, crashing httpmon on startup for Homebrew users (fixes #38). Replace with go-termimg which is pure Go with no native dependencies. Also fix detail viewport height to account for all chrome lines (header + separator + tab + blank + status bar), making the status bar visible. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor(tui): extract detailChromeLines constant for viewport height Replace magic number 5 with named constant across all 3 usage sites in the detail viewport height calculation. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
feat(bodydecoder): add Encoder interface for gRPC-Web/protobuf round-… …trip (#32) * feat(bodydecoder): add Encoder interface for gRPC-Web/protobuf round-trip Add transparent encode/decode pipeline so JS scripts can modify gRPC-Web and protobuf bodies as JSON. The interceptor decodes binary bodies before scripts run and re-encodes after if modified. Key changes: - New Encoder interface (separate from Decoder) with CanEncode/Encode - Registry.Encode() type-asserts decoders that also implement Encoder - RawProtobufDecoder.Encode via ProtoRegistry.EncodeNamed (JSON→proto) - GRPCWebDecoder.Encode with frame wrapping and trailer preservation - runScriptsWithCodec helper in interceptor for transparent codec pipeline - DecoderMetadata.OriginalBody for preserving gRPC-Web trailer frames - --proto-include CLI flag for additional proto import search dirs - ProtoRegistry.LoadProtoFiles now accepts variadic includeDirs - E2E tests: script modifies request/response, passthrough, read-only Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * test(mcpserver): add unit tests for helpers, auth, server, and tool handlers Coverage 0% → 84.9%. Tests exercise pure functions, auth middleware, server lifecycle, and all MCP tool handlers via lightweight mocks. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * test(proxy): add 7 gRPC-Web codec e2e tests for edge cases Cover respondWith on gRPC-Web, dual request+response mutation, field add/remove, store wire-byte capture, empty body, and unknown proto field graceful fallback. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor(proxy): simplify setupGRPCProxy return signature Drop unused *httptest.Server and port from return values; tighten inline comments. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
feat: add internal/config package and upgrade to Go 1.26 (#22) * feat: add internal/config package and upgrade to Go 1.26 Add persistent config support via ~/.httpmon/config.json with Load/Save, CLI flag overrides, and MCP token migration from legacy mcp-token file. Upgrade Go from 1.25.3 to 1.26.0 and golangci-lint to v2.9.0 to resolve race detector toolchain mismatch. Update README with MCP server docs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * chore: suppress gosec SSRF/command-injection findings in TUI These are by-design: repeat/compose send user-initiated requests through the local proxy, and the editor command comes from $VISUAL/$EDITOR. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: wire config package into main.go Load persistent config on startup, overlay CLI flags via ApplyFlags. Use cfg.ProxyPort, cfg.BufferSize, cfg.MCPEnabled, cfg.MCPAddr, cfg.ThrottlePreset instead of raw flag values. MCP token now managed via config.LoadOrCreateToken. Pass DataDir into TUI AppConfig for future settings screen. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: add TUI settings screen (P key) Centered popup with 7 fields: ProxyPort, MCPEnabled, MCPAddr, BufferSize, ThrottlePreset, ListMode, TreeGroupBy. Bool/enum fields toggle on Enter, int/string fields open textinput. Esc saves to disk. Fields requiring restart show (restart) hint. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: add Settings to action menu (list + detail views) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: update changelog with config + settings screen entry Promote feat/mcp-server to PR #20 link. Add feat/config-package-go126 section covering persistent config, TUI settings screen, Go 1.26 upgrade. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: simplify settings screen and remove redundant comments Extract settingsFieldDisplay to deduplicate format logic, simplify bool toggle to one-liner, fix struct field alignment, remove comments that restate obvious code. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * test: add settings modal unit tests Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: update changelog with settings test coverage Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
feat: add MCP server for LLM-driven HTTP debugging (#20) * chore: add MCP Go SDK dependency Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: add MCP server design plan Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: add MCP server with 14 tools for LLM-driven HTTP debugging Implements MCP server as peer to TUI, using same port interfaces. Tools: - list_requests, get_request, search_requests, get_request_count, export_har - set_throttle, get_throttle, replay_request, mock_response - list_scripts, create_script, get_script, toggle_script, delete_script CLI: --mcp / --mcp-port flags. Disabled by default. Transport: Streamable HTTP on configurable port (default 9551). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * test: add MCP server e2e tests (13 test cases) Tests cover all tool categories: - Read-only: list, get, search, count, HAR export - Simulation: throttle, replay, compose - Scripts: create, list, toggle, delete, get - Lifecycle: start/stop Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: show MCP server port in TUI status bar Adds MCPServer interface to ports.go. Status bar displays "MCP :<port>" when server is active. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: add mock_response tests and fix pattern matching Add TestMCP_MockResponse and TestMCP_MockViaScript e2e tests. Mock patterns must use proper glob format (scheme://host/path). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: simplify MCP server code - Extract clampLimit, parseFilter, metasToSummaries helpers (tools_read) - Extract writeScriptFile helper, remove dead enabled logic (tools_script) - Delegate createMockScript to writeScriptFile (tools_sim) - Remove dead freePortMCP duplicate (mcp_harness) - Rename buildHAR param to avoid shadowing store package - Pre-allocate harHeaders slice Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: add bearer auth, opaque script IDs, addr-based config - Add bearer token authentication middleware (auto-generated 32-byte hex token stored in data dir, optional) - Replace file_path exposure with opaque script_id (random 16-hex-char IDs backfilled into YAML headers on first load) - Switch --mcp-port to --mcp-addr for full listen address control - Replace dump_path (user-controlled dir) with dump flag (uses os.TempDir) - Add auth e2e tests (rejected/wrong-token/valid/no-auth) - Add get_script not-found test Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: resolve gosec findings and lint issues in MCP server - Add ReadHeaderTimeout to http.Server (G112) - Handle f.Close() errors, add #nosec for os.CreateTemp paths (G104/G703) - Add #nosec annotations for by-design TLS skip and SSRF (G402/G704) - Fix goimports formatting Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: update changelog for MCP server branch Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
feat: add process identification for proxied requests (#19) * docs: add process identification design plan Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: resolve open questions in process identification design Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: add process identification for proxied requests Resolve which OS process made each proxied HTTP request using gopsutil. Display process name in list view, support process-based tree grouping (t cycles flat→host→process→flat), and show PID + cmdline in detail view. New packages: internal/procinfo (async resolver with PID cache, semaphore-bounded concurrency, graceful degradation). Store changes: FlowMeta.Process field, FlowData.ProcessPID/Cmdline, RingBuffer.UpdateData for partial data merges. TUI changes: process column in flat/tree/focus views, process-tree grouping mode, detail card process section, updated help overlay. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: update changelog with process identification entry Promote add-logo-assets to v0.1.7, add feat/process-identification section for PR #19. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: add ProcessPID to FlowMeta, improve test coverage and column layout Store ProcessPID in FlowMeta alongside the process name so the TUI can display name(pid) labels. Reorder list columns to place PROCESS after TYPE. Expand test coverage for procinfo (64.9% to 94.7%), interceptor response headers, detail rendering, list column formatting, and tree grouping by process. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
fix: use homebrew_casks with correct format for goreleaser v2.10+ (#17) brews is deprecated in goreleaser v2.10+ in favor of homebrew_casks. Remove directory field (defaults to Casks), add xattr quarantine removal hook for unsigned macOS binaries. Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
PreviousNext