httptape¶
Record, Redact, Replay -- HTTP traffic recording, redaction, and replay.
httptape captures HTTP request/response pairs, redacts sensitive data on write, and replays them as a mock server. It ships as an embeddable Go library, a standalone CLI, and a minimal Docker image.
The 3 Rs¶
- Record -- wrap any
http.RoundTripperto capture real HTTP traffic, or use the CLI/Docker to record from an upstream API - Redact -- strip secrets, PII, and credentials on write via a configurable redaction pipeline, before anything touches disk
- Replay -- serve recorded fixtures as a deterministic mock
http.Handler, or run a standalone mock server via CLI/Docker
Why httptape?¶
Standalone server + CLI, sanitize-on-write by default, SSE event-level replay, and embeddable as a Go library with zero deps. For the full story (extracted from VibeWarden's egress proxy) and side-by-side comparisons with WireMock, Hoverfly, go-vcr, and others, see Why httptape.
Key features¶
- Record -- wrap any
http.RoundTripperto capture real HTTP traffic - Redact on write -- strip headers, body fields, or replace values with deterministic fakes before storage
- Replay -- serve recorded fixtures as a mock
http.Handler - Proxy with fallback -- forward to upstream with automatic fallback to cached responses when the backend is down
- Composable matching -- match requests by method, path, query params, headers, body hash, or fuzzy body fields
- Pluggable storage -- in-memory for tests, filesystem for fixtures, or implement your own
Store - Import/export -- share fixture bundles as
tar.gzarchives between environments - Zero dependencies -- stdlib only, no transitive deps for embedders
- CLI and Docker -- use as a standalone proxy for recording, replaying, and caching
Install¶
Requires Go 1.26 or later for the library/CLI. Docker works with any platform.
Quick example¶
package main
import (
"fmt"
"net/http"
"net/http/httptest"
"github.com/httptape/httptape"
)
func main() {
store := httptape.NewMemoryStore()
// Record
rec := httptape.NewRecorder(store, httptape.WithRoute("github"))
client := &http.Client{Transport: rec}
client.Get("https://api.github.com/users/octocat")
rec.Close()
// Replay
srv := httptape.NewServer(store)
ts := httptest.NewServer(srv)
defer ts.Close()
resp, _ := http.Get(ts.URL + "/users/octocat")
fmt.Println(resp.StatusCode) // 200
}
Or using the CLI:
# Record from a real API (with redaction)
httptape record --upstream https://api.github.com --fixtures ./mocks --config redact.json
# Replay as a mock server
httptape serve --fixtures ./mocks --port 8081
# Proxy with automatic fallback
httptape proxy --upstream https://api.github.com --fixtures ./cache
Documentation¶
| Page | Description |
|---|---|
| Getting Started | Record, redact, and replay in 5 minutes |
| Recording | Recorder options, async/sync, sampling, body limits |
| Replay | Server options, fallback behavior, request handling |
| Redaction | RedactHeaders, RedactBodyPaths, FakeFields, Pipeline |
| Proxy Mode | L1/L2 caching, fallback behavior, frontend dev |
| Matching | All matchers, CompositeMatcher, score weights, declarative config |
| Storage | MemoryStore, FileStore, custom Store implementations |
| Import/Export | ExportBundle, ImportBundle, selective filters |
| Config | Declarative JSON configuration for redaction and matcher composition |
| CLI | serve, record, proxy, export, import commands |
| Docker | Container usage, docker-compose, volumes |
| Testcontainers | Go Testcontainers module for integration tests |
| API Reference | All exported types, functions, and options |