* add ForwardHealthChecks field to URLMapper and all providers
Add a new per-route boolean option `forward-health-checks` to URLMapper,
parsed by all providers (docker, file, consul-catalog, static).
When enabled, reproxy will forward /ping and /health requests to the
backend instead of handling them with built-in responses.
Made-with: Cursor
* forward /ping and /health to backend for routes with forward-health-checks
Modify pingHandler and healthMiddleware to check if the matched route has
ForwardHealthChecks enabled. If so, the request is forwarded to the backend
instead of being intercepted by reproxy's built-in responses.
Made-with: Cursor
* fixed linter issues
* fix inconsistent forward-health-checks value parsing across providers
Docker now inspects the label value (true/yes/y/1) instead of just
checking key presence. Static provider checks for explicit positive
values instead of treating any non-empty string as truthy.
Made-with: Cursor
metrics middleware wraps http.ResponseWriter to capture status codes,
but the wrapper did not implement http.Flusher. This caused
httputil.ReverseProxy to fall back to buffered mode, breaking SSE
streaming when MGMT_ENABLED=true.
Also fix wrong error variable in MaxSize parse error wrapping
(err → perr) in main.go.
* Add shell completions for bash, zsh, and fish
Add completion wrapper scripts that use go-flags' built-in
GO_FLAGS_COMPLETION mechanism. Update .goreleaser.yml to include
completions in release archives, Homebrew formula, and deb/rpm
packages. Suppress version banner in completion mode.
* use verbose completions for zsh and fish descriptions
add test reproducing issue #243 where regex route with assets:true
does not match. update README with multi-domain static sites example
and note about path prefix requirement. fix lint issues in handlers,
main and conductor_test.
Related to #243
add .zed/settings.json with file exclusions and .zed/tasks.json with
run configurations for static, docker, and file providers plus build,
test, lint, and coverage tasks. also add coverage.html to .gitignore.
Adds --docker.api-version flag (env: DOCKER_API_VERSION) to allow users
to specify the Docker API version. Defaults to 1.24 for backward
compatibility. Users on Docker 29+ should set this to 1.44.
Related to #240
add --mgmt.low-cardinality flag to use route patterns instead of raw
paths for http_response_time_seconds histogram labels. this reduces
metrics cardinality when proxying services with dynamic URLs.
Closes#160
- add tests for passwords containing colons
- add test for empty password edge case
- clarify test name for username with colon rejection
- fix comment precision in validateBasicAuthCredentials
- make ParseOnlyFrom filter empty entries like ParseAuth
- increase test timeout from 120s to 180s
- increase context timeouts to 10s
- increase waitForServer timeout to 5s with 100ms dial timeout
- increase inline Eventually timeouts to 5s
- add missing defer ds.Close() to prevent goroutine leaks
- remove flaky network call in TestHttp_matchHandler
add support for per-route basic authentication via AuthUsers field in URLMapper.
routes can now specify their own credentials independent of global basic auth.
- add PerRouteAuth handler with shared credential validation
- support AuthUsers field in file, docker, and consul-catalog providers
- document per-route auth configuration in README
* ci: modernize release automation with GoReleaser and multi-arch Docker builds
- Add release.yml workflow for automatic binary publishing via GoReleaser
- Add docker.yml workflow with parallel multi-arch builds (amd64/arm64)
- Remove Docker build steps from ci.yml (now CI-only)
- Add Homebrew tap configuration to goreleaser.yml
- Remove obsolete Dockerfile.artifacts and Makefile dist target
- Update README with Homebrew installation instructions
* fix: use t.Context() in proxy tests to prevent goroutine leaks
* chore: address review feedback - add fetch-depth and update checkout version
* fix goroutine leak in mergeEvents and use t.Context() in tests
the mergeEvents function could block forever when sending to the output
channel after context cancellation. this caused test timeouts and
potential production goroutine leaks. also replaced context.Background()
with t.Context() in tests for proper cleanup on test completion.
* fix flaky TestHttp_healthHandler test
use assert.Eventually to wait for server readiness instead of fixed
sleep. this makes the test more reliable on slow CI runners.
* increase CI test timeout to 120s
* fix flaky proxy tests with require.Eventually for server readiness
replace 10ms sleep after h.Run() with require.Eventually polling
to wait for server to accept connections. this fixes intermittent
"connection refused" errors on slow CI runners.
- replace interface{} with any
- use range over int instead of traditional for loops
- use slices.Contains instead of manual Contains wrapper
- use strings.SplitSeq, CutPrefix, CutSuffix
- remove unnecessary tt := tt loop captures
- use sync.WaitGroup.Go() where applicable
- update .golangci.yml with intrange and copyloopvar linters
- add libdns providers for GoDaddy, Namecheap, and Scaleway
- add CLI flags for each provider configuration
- add tests for new provider configurations
- add libdns providers for DigitalOcean, Hetzner, and Linode
- add CLI flags for each provider configuration
- add tests for new provider configurations
- update README with new provider documentation
- update CLAUDE.md with provider addition guide
note: Vultr not included due to API incompatibility with libdns v1.1.x
upgrade from goreleaser v1.26.1 (go 1.22) to v2.13.0 (go 1.25)
to fix make dist build failure. also update deprecated --skip-publish
flag to --skip=publish syntax.
* add configurable upstream connection limits
Add new --upstream.max-idle-conns and --upstream.max-conns options
to configure the HTTP transport connection pool settings.
- max-idle-conns: max idle connections total (default: 100)
- max-conns: max connections per upstream host, 0=unlimited (default: 0)
This allows users to limit concurrent connections to backend servers,
preventing connection exhaustion when upstreams have limited capacity.
Related to #159
* fix flaky TestHttp_withBasicAuth test
Use require.Eventually to wait for server readiness instead of
fixed sleep, preventing connection refused errors on CI.
The DecisionFunc in makeAutocertManager now checks both static FQDNs
and dynamic servers from discovery providers. This allows new services
(docker containers, file config changes, consul updates) to get SSL
certificates without requiring reproxy restart.
Also fixes a race condition in discovery logging by using %T instead
of %s when formatting providers to prevent reflection on context fields.
Related to #207
- add tests for metrics Middleware and ResponseWriter in mgmt package
- add tests for makeSSLConfig, makeLBSelector, fqdns in main package
- add tests for gzipHandler in proxy package
- add new linter rules to .golangci.yml (errorlint, wrapcheck, testifylint, nestif)
- fix errorlint: use errors.Is/As instead of direct comparison
- fix wrapcheck: wrap errors with context using %w
- fix testifylint: use assert.Len, assert.Empty, assert.True/False, require.ErrorIs
- fix go-require: use assert in goroutines and HTTP handlers
- update CI: add disk space cleanup, bump Go to 1.25, update actions versions
- bump all dependencies (go get -u ./...)
- fix libdns/route53 and libdns/libdns breaking API changes
- update acmez v2 to v3
- add CLAUDE.md for project context
- Configure CertMagic to use RedirHTTPPort as AltHTTPPort for HTTP challenges
- Improve HTTP-to-HTTPS redirect handler to omit standard HTTPS port in URL
- Update tests to use random high-numbered ports for HTTP challenges
- Fix various linting issues in the code