- Rewrite server to use net/http.Server with ServeHTTP handler instead
of raw TCP listener with hand-written HTTP responses. Control plane
errors now get proper Content-Type, Content-Length, and chunked
encoding via http.Error(). Tunnel traffic hijacks the connection and
re-serializes the request for forwarding.
- Simplify reconstructedConn to accept variative io.Readers
- Delete raw_http_response_writer.go (no longer needed)
- Fix TCP forwarder: bare host:port (e.g. "127.0.0.1:5432") now works
correctly instead of failing on url.Parse. Only HTTP/HTTPS schemes
go through URL parsing; everything else is treated as raw TCP.
- Add 8 new e2e tests: HTTP response quality, 1MB response body, 512KB
request body, TCP echo, TCP large payload, concurrent single-tunnel,
concurrent multi-tunnel (16 tests total, all passing)
- Add end-to-end test suite covering HTTP tunnel round-trip, POST
forwarding, unknown tunnel 404, duplicate name rejection, unauthorized
access, info endpoint, multi-tunnel routing, and graceful shutdown
- Fix server graceful shutdown by closing TCP listener on context cancel
- Fix data race in pkg/maps Entries() iterator by holding RLock
- Rewrite README with architecture, configuration, and usage docs
- Add AGENTS.md with project conventions and architecture guide
- Update flake.nix (add gopls) and flake.lock