From e1c6b2ab491522a7d56693ce076f9dfd67fdb483 Mon Sep 17 00:00:00 2001 From: Denozordec Date: Mon, 30 Mar 2026 00:31:46 +0700 Subject: [PATCH] Enhance reverse proxy transport configuration for improved performance. Updated reverse.go to set a direct transport for the reverse proxy, ensuring more efficient request handling. Modified gateway.go to utilize the direct transport with customized connection settings, optimizing idle connections and timeouts. --- internal/proxy/reverse.go | 1 + internal/proxy/transport.go | 15 +++++++++++++++ internal/server/gateway.go | 16 +++++++--------- 3 files changed, 23 insertions(+), 9 deletions(-) create mode 100644 internal/proxy/transport.go diff --git a/internal/proxy/reverse.go b/internal/proxy/reverse.go index 2f8c574..4c02553 100644 --- a/internal/proxy/reverse.go +++ b/internal/proxy/reverse.go @@ -12,6 +12,7 @@ import ( // (e.g. https://host/api/ + v1 + users → https://host/api/v1/users). func NewReverseProxy(target *url.URL, stripPrefix, pathPrefix string, setAuth string) *httputil.ReverseProxy { proxy := httputil.NewSingleHostReverseProxy(target) + proxy.Transport = DirectTransport() orig := proxy.Director targetQuery := target.RawQuery proxy.Director = func(req *http.Request) { diff --git a/internal/proxy/transport.go b/internal/proxy/transport.go new file mode 100644 index 0000000..9110ab0 --- /dev/null +++ b/internal/proxy/transport.go @@ -0,0 +1,15 @@ +package proxy + +import ( + "net/http" + "net/url" +) + +// DirectTransport returns a transport that never uses HTTP_PROXY/HTTPS_PROXY. +// Upstream Telemt hosts are usually private or loopback; env proxies break that and +// httptest in CI when runners set HTTP_PROXY. +func DirectTransport() *http.Transport { + t := http.DefaultTransport.(*http.Transport).Clone() + t.Proxy = func(*http.Request) (*url.URL, error) { return nil, nil } + return t +} diff --git a/internal/server/gateway.go b/internal/server/gateway.go index 8f5d182..dd46191 100644 --- a/internal/server/gateway.go +++ b/internal/server/gateway.go @@ -28,15 +28,13 @@ type Gateway struct { // NewGateway builds handlers and reverse proxies from parsed config. func NewGateway(p *config.Parsed, log *slog.Logger) (*Gateway, error) { - t := &http.Transport{ - Proxy: http.ProxyFromEnvironment, - MaxIdleConns: 64, - IdleConnTimeout: 90 * time.Second, - TLSHandshakeTimeout: 10 * time.Second, - ExpectContinueTimeout: 1 * time.Second, - DialContext: (&net.Dialer{Timeout: 5 * time.Second, KeepAlive: 30 * time.Second}).DialContext, - ResponseHeaderTimeout: 120 * time.Second, - } + t := proxy.DirectTransport() + t.MaxIdleConns = 64 + t.IdleConnTimeout = 90 * time.Second + t.TLSHandshakeTimeout = 10 * time.Second + t.ExpectContinueTimeout = 1 * time.Second + t.DialContext = (&net.Dialer{Timeout: 5 * time.Second, KeepAlive: 30 * time.Second}).DialContext + t.ResponseHeaderTimeout = 120 * time.Second g := &Gateway{ parsed: p, proxies: make(map[string]*httputil.ReverseProxy),