Skip to content

Commit 50a0a34

Browse files
committed
feat: single proxy per server
1 parent 3fe3643 commit 50a0a34

File tree

3 files changed

+38
-30
lines changed

3 files changed

+38
-30
lines changed

config/helpers.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ func getEnvAsLogLevel(key string) zerolog.Level {
3434
value, exists := os.LookupEnv(key)
3535

3636
if !exists {
37-
log.Info().Msg("SERVER_LOG_LEVEL was not set, falling back to warn level")
37+
log.Info().Msg("LOG_LEVEL was not set, falling back to warn level")
3838

3939
return zerolog.WarnLevel
4040
}
@@ -43,7 +43,7 @@ func getEnvAsLogLevel(key string) zerolog.Level {
4343
return level
4444
}
4545

46-
log.Warn().Msgf("SERVER_LOG_LEVEL: %s is unknown, falling back to warn level", value)
46+
log.Warn().Msgf("LOG_LEVEL: %s is unknown, falling back to warn level", value)
4747

4848
return zerolog.WarnLevel
4949
}

config/helpers_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,29 +33,29 @@ func setupEnv(t *testing.T, envVar, value string) func() {
3333
func TestConfigHelpers(t *testing.T) {
3434
t.Run("getEnv", func(t *testing.T) {
3535
t.Run("should return the default value if env not set", func(t *testing.T) {
36-
defer unsetEnv(t, "SERVER_LOG_LEVEL")()
37-
got := getEnv("SERVER_LOG_LEVEL", "warn")
36+
defer unsetEnv(t, "LOG_LEVEL")()
37+
got := getEnv("LOG_LEVEL", "warn")
3838

3939
assert.Equal(t, "warn", got)
4040
})
4141
t.Run("should panic if env and default value not set", func(t *testing.T) {
42-
defer unsetEnv(t, "SERVER_LOG_LEVEL")()
42+
defer unsetEnv(t, "LOG_LEVEL")()
4343

4444
assert.Panics(t, func() {
45-
getEnv("SERVER_LOG_LEVEL", "")
45+
getEnv("LOG_LEVEL", "")
4646
})
4747
})
4848
})
4949
t.Run("getEnvAsLogLevel", func(t *testing.T) {
5050
t.Run("should default to warn if no logLevel set", func(t *testing.T) {
51-
defer unsetEnv(t, "SERVER_LOG_LEVEL")()
52-
got := getEnvAsLogLevel("SERVER_LOG_LEVEL")
51+
defer unsetEnv(t, "LOG_LEVEL")()
52+
got := getEnvAsLogLevel("LOG_LEVEL")
5353

5454
assert.Equal(t, zerolog.WarnLevel, got)
5555
})
5656
t.Run("should set logLevel from environment", func(t *testing.T) {
57-
defer setupEnv(t, "SERVER_LOG_LEVEL", "info")()
58-
got := getEnvAsLogLevel("SERVER_LOG_LEVEL")
57+
defer setupEnv(t, "LOG_LEVEL", "info")()
58+
got := getEnvAsLogLevel("LOG_LEVEL")
5959

6060
assert.Equal(t, zerolog.InfoLevel, got)
6161
})

pkg/http/cache.go

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ type (
4242
metricsCollector MetricsCollector
4343
cfg config.CacheConfig
4444
httpClient *http.Client
45+
proxy *httputil.ReverseProxy
4546
}
4647
)
4748

@@ -119,26 +120,35 @@ func errHandler(res http.ResponseWriter, req *http.Request, err error) {
119120

120121
func newCacheHandler(c Cacher, m MetricsCollector, w Worker, cfg config.CacheConfig) handler {
121122
netTransport := &http.Transport{
122-
MaxIdleConnsPerHost: 1000,
123-
DisableKeepAlives: false,
124-
IdleConnTimeout: time.Hour * 1,
125-
Dial: (&net.Dialer{
123+
Proxy: http.ProxyFromEnvironment,
124+
DialContext: (&net.Dialer{
126125
Timeout: 10 * time.Second,
127-
KeepAlive: 30 * time.Second,
128-
}).Dial,
126+
KeepAlive: 60 * time.Second,
127+
}).DialContext,
128+
ForceAttemptHTTP2: true,
129+
MaxIdleConns: 1000,
130+
MaxIdleConnsPerHost: 100,
131+
IdleConnTimeout: 90 * time.Second,
129132
TLSHandshakeTimeout: 10 * time.Second,
130-
ResponseHeaderTimeout: 10 * time.Second,
133+
ExpectContinueTimeout: 1 * time.Second,
134+
ResponseHeaderTimeout: 30 * time.Second,
131135
}
132136

137+
httpClient := &http.Client{
138+
Timeout: time.Second * 30,
139+
Transport: netTransport,
140+
}
141+
142+
proxy := httputil.NewSingleHostReverseProxy(cfg.DownstreamHost)
143+
proxy.Transport = netTransport
144+
133145
return handler{
134146
cacher: c,
135147
worker: w,
136148
metricsCollector: m,
137149
cfg: cfg,
138-
httpClient: &http.Client{
139-
Timeout: time.Second * 10,
140-
Transport: netTransport,
141-
},
150+
httpClient: httpClient,
151+
proxy: proxy,
142152
}
143153
}
144154

@@ -165,23 +175,22 @@ func (h handler) asyncCacheRevalidate(hashKey string, req *http.Request) func()
165175
}
166176

167177
func (h handler) ServeHTTP(res http.ResponseWriter, req *http.Request) {
168-
proxy := httputil.NewSingleHostReverseProxy(h.cfg.DownstreamHost)
169-
proxy.ErrorHandler = errHandler
178+
h.proxy.ErrorHandler = errHandler
170179
logger := log.With().Str("path", req.URL.Path).Str("method", req.Method).Logger()
171180
logCtx := logger.WithContext(req.Context())
172181

173182
// websockets
174183
if strings.ToLower(req.Header.Get("connection")) == "upgrade" {
175184
logger.Info().Msg("will not cache websocket request")
176-
proxy.ServeHTTP(res, req)
177-
185+
h.proxy.ModifyResponse = nil
186+
h.proxy.ServeHTTP(res, req)
178187
return
179188
}
180189

181190
if strings.ToLower(req.Method) != "get" {
182191
logger.Debug().Msg("will not cache non-GET request")
183-
proxy.ServeHTTP(res, req)
184-
192+
h.proxy.ModifyResponse = nil
193+
h.proxy.ServeHTTP(res, req)
185194
return
186195
}
187196

@@ -193,10 +202,9 @@ func (h handler) ServeHTTP(res http.ResponseWriter, req *http.Request) {
193202
}
194203

195204
if result == nil {
196-
proxy.ModifyResponse = h.cacheResponse(logCtx, hashKey)
205+
h.proxy.ModifyResponse = h.cacheResponse(logCtx, hashKey)
197206
logger.Debug().Msg("will cache response from downstream")
198-
proxy.ServeHTTP(res, req)
199-
207+
h.proxy.ServeHTTP(res, req)
200208
return
201209
}
202210

0 commit comments

Comments
 (0)