Skip to content

Commit a83f25c

Browse files
committed
refactor: enhance error handling in reverse proxy with configurable error handler; update dependencies and remove redundant cache save delay in tests
Signed-off-by: tbxark <tbxark@outlook.com>
1 parent 22017fd commit a83f25c

4 files changed

Lines changed: 33 additions & 31 deletions

File tree

go.mod

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ require (
1111
github.com/go-telegram/bot v1.17.0
1212
github.com/golang-jwt/jwt/v5 v5.3.0
1313
github.com/google/uuid v1.6.0
14-
github.com/meilisearch/meilisearch-go v0.35.0
14+
github.com/meilisearch/meilisearch-go v0.35.1
1515
github.com/minio/minio-go/v7 v7.0.97
1616
github.com/qiniu/go-sdk/v7 v7.25.5
1717
github.com/redis/go-redis/v9 v9.17.2
@@ -27,8 +27,8 @@ require (
2727
golang.org/x/sync v0.19.0
2828
golang.org/x/time v0.14.0
2929
gopkg.in/natefinch/lumberjack.v2 v2.2.1
30-
modernc.org/sqlite v1.41.0
31-
resty.dev/v3 v3.0.0-beta.5
30+
modernc.org/sqlite v1.42.2
31+
resty.dev/v3 v3.0.0-beta.6
3232
)
3333

3434
require (
@@ -46,7 +46,7 @@ require (
4646
github.com/go-logr/stdr v1.2.2 // indirect
4747
github.com/go-openapi/jsonpointer v0.22.4 // indirect
4848
github.com/go-openapi/jsonreference v0.21.4 // indirect
49-
github.com/go-openapi/spec v0.22.2 // indirect
49+
github.com/go-openapi/spec v0.22.3 // indirect
5050
github.com/go-openapi/swag/conv v0.25.4 // indirect
5151
github.com/go-openapi/swag/jsonname v0.25.4 // indirect
5252
github.com/go-openapi/swag/jsonutils v0.25.4 // indirect
@@ -70,7 +70,7 @@ require (
7070
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
7171
github.com/rs/xid v1.6.0 // indirect
7272
github.com/swaggo/files v1.0.1 // indirect
73-
github.com/tinylib/msgp v1.6.1 // indirect
73+
github.com/tinylib/msgp v1.6.3 // indirect
7474
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
7575
go.opentelemetry.io/otel v1.39.0 // indirect
7676
go.opentelemetry.io/otel/metric v1.39.0 // indirect
@@ -85,7 +85,7 @@ require (
8585
google.golang.org/protobuf v1.36.11 // indirect
8686
gopkg.in/yaml.v3 v3.0.1 // indirect
8787
modernc.org/fileutil v1.3.40 // indirect
88-
modernc.org/libc v1.67.1 // indirect
88+
modernc.org/libc v1.67.4 // indirect
8989
modernc.org/mathutil v1.7.1 // indirect
9090
modernc.org/memory v1.11.0 // indirect
9191
)

go.sum

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ github.com/go-openapi/jsonpointer v0.22.4 h1:dZtK82WlNpVLDW2jlA1YCiVJFVqkED1MegO
4141
github.com/go-openapi/jsonpointer v0.22.4/go.mod h1:elX9+UgznpFhgBuaMQ7iu4lvvX1nvNsesQ3oxmYTw80=
4242
github.com/go-openapi/jsonreference v0.21.4 h1:24qaE2y9bx/q3uRK/qN+TDwbok1NhbSmGjjySRCHtC8=
4343
github.com/go-openapi/jsonreference v0.21.4/go.mod h1:rIENPTjDbLpzQmQWCj5kKj3ZlmEh+EFVbz3RTUh30/4=
44-
github.com/go-openapi/spec v0.22.2 h1:KEU4Fb+Lp1qg0V4MxrSCPv403ZjBl8Lx1a83gIPU8Qc=
45-
github.com/go-openapi/spec v0.22.2/go.mod h1:iIImLODL2loCh3Vnox8TY2YWYJZjMAKYyLH2Mu8lOZs=
44+
github.com/go-openapi/spec v0.22.3 h1:qRSmj6Smz2rEBxMnLRBMeBWxbbOvuOoElvSvObIgwQc=
45+
github.com/go-openapi/spec v0.22.3/go.mod h1:iIImLODL2loCh3Vnox8TY2YWYJZjMAKYyLH2Mu8lOZs=
4646
github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM=
4747
github.com/go-openapi/swag/conv v0.25.4 h1:/Dd7p0LZXczgUcC/Ikm1+YqVzkEeCc9LnOWjfkpkfe4=
4848
github.com/go-openapi/swag/conv v0.25.4/go.mod h1:3LXfie/lwoAv0NHoEuY1hjoFAYkvlqI/Bn5EQDD3PPU=
@@ -119,8 +119,8 @@ github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgx
119119
github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
120120
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
121121
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
122-
github.com/meilisearch/meilisearch-go v0.35.0 h1:Gh4vO+PinVQZ58iiFdUX9Hld8uXKzKh+C7mSSsCDlI8=
123-
github.com/meilisearch/meilisearch-go v0.35.0/go.mod h1:cUVJZ2zMqTvvwIMEEAdsWH+zrHsrLpAw6gm8Lt1MXK0=
122+
github.com/meilisearch/meilisearch-go v0.35.1 h1:5H2FeY5eR4HSkaZMJIoefNzOj3XX1+5dd7ZfhAfzeMg=
123+
github.com/meilisearch/meilisearch-go v0.35.1/go.mod h1:cUVJZ2zMqTvvwIMEEAdsWH+zrHsrLpAw6gm8Lt1MXK0=
124124
github.com/minio/crc64nvme v1.1.1 h1:8dwx/Pz49suywbO+auHCBpCtlW1OfpcLN7wYgVR6wAI=
125125
github.com/minio/crc64nvme v1.1.1/go.mod h1:eVfm2fAzLlxMdUGc0EEBGSMmPwmXD5XiNRpnu9J3bvg=
126126
github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
@@ -162,8 +162,8 @@ github.com/swaggo/swag v1.16.6 h1:qBNcx53ZaX+M5dxVyTrgQ0PJ/ACK+NzhwcbieTt+9yI=
162162
github.com/swaggo/swag v1.16.6/go.mod h1:ngP2etMK5a0P3QBizic5MEwpRmluJZPHjXcMoj4Xesg=
163163
github.com/telegram-mini-apps/init-data-golang v1.5.0 h1:rtpsmQ/nihkicPvnrdRXmHHtTnPvG1FmxMRZJwMKPz0=
164164
github.com/telegram-mini-apps/init-data-golang v1.5.0/go.mod h1:GG4HnRx9ocjD4MjjzOw7gf9Ptm0NvFbDr5xqnfFOYuY=
165-
github.com/tinylib/msgp v1.6.1 h1:ESRv8eL3u+DNHUoSAAQRE50Hm162zqAnBoGv9PzScPY=
166-
github.com/tinylib/msgp v1.6.1/go.mod h1:RSp0LW9oSxFut3KzESt5Voq4GVWyS+PSulT77roAqEA=
165+
github.com/tinylib/msgp v1.6.3 h1:bCSxiTz386UTgyT1i0MSCvdbWjVW+8sG3PjkGsZQt4s=
166+
github.com/tinylib/msgp v1.6.3/go.mod h1:RSp0LW9oSxFut3KzESt5Voq4GVWyS+PSulT77roAqEA=
167167
github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
168168
github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
169169
github.com/yitter/idgenerator-go v1.3.3 h1:i6rzmpbCL0vlmr/tuW5+lSQzNuDG9vYBjIYRvnRcHE8=
@@ -264,8 +264,8 @@ modernc.org/gc/v3 v3.1.1 h1:k8T3gkXWY9sEiytKhcgyiZ2L0DTyCQ/nvX+LoCljoRE=
264264
modernc.org/gc/v3 v3.1.1/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY=
265265
modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks=
266266
modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI=
267-
modernc.org/libc v1.67.1 h1:bFaqOaa5/zbWYJo8aW0tXPX21hXsngG2M7mckCnFSVk=
268-
modernc.org/libc v1.67.1/go.mod h1:QvvnnJ5P7aitu0ReNpVIEyesuhmDLQ8kaEoyMjIFZJA=
267+
modernc.org/libc v1.67.4 h1:zZGmCMUVPORtKv95c2ReQN5VDjvkoRm9GWPTEPuvlWg=
268+
modernc.org/libc v1.67.4/go.mod h1:QvvnnJ5P7aitu0ReNpVIEyesuhmDLQ8kaEoyMjIFZJA=
269269
modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU=
270270
modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg=
271271
modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI=
@@ -274,11 +274,11 @@ modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8=
274274
modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns=
275275
modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w=
276276
modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE=
277-
modernc.org/sqlite v1.41.0 h1:bJXddp4ZpsqMsNN1vS0jWo4IJTZzb8nWpcgvyCFG9Ck=
278-
modernc.org/sqlite v1.41.0/go.mod h1:9fjQZ0mB1LLP0GYrp39oOJXx/I2sxEnZtzCmEQIKvGE=
277+
modernc.org/sqlite v1.42.2 h1:7hkZUNJvJFN2PgfUdjni9Kbvd4ef4mNLOu0B9FGxM74=
278+
modernc.org/sqlite v1.42.2/go.mod h1:+VkC6v3pLOAE0A0uVucQEcbVW0I5nHCeDaBf+DpsQT8=
279279
modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0=
280280
modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A=
281281
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
282282
modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
283-
resty.dev/v3 v3.0.0-beta.5 h1:NV1xbqOLzSq7XMTs1t/HLPvu7xrxoXzF90SR4OO6faQ=
284-
resty.dev/v3 v3.0.0-beta.5/go.mod h1:NTOerrC/4T7/FE6tXIZGIysXXBdgNqwMZuKtxpea9NM=
283+
resty.dev/v3 v3.0.0-beta.6 h1:ghRdNpoE8/wBCv+kTKIOauW1aCrSIeTq7GxtfYgtevU=
284+
resty.dev/v3 v3.0.0-beta.6/go.mod h1:NTOerrC/4T7/FE6tXIZGIysXXBdgNqwMZuKtxpea9NM=

server/service/reverseproxy/proxy.go

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,11 @@ type (
1414
)
1515

1616
type Options struct {
17-
target *url.URL
18-
director func(*http.Request)
19-
keygen RequestCacheKeyFunc
20-
checker ResponseCacheCheckFunc
17+
target *url.URL
18+
director func(*http.Request)
19+
errorHandler func(error)
20+
keygen RequestCacheKeyFunc
21+
checker ResponseCacheCheckFunc
2122
}
2223

2324
type Option = func(*Options)
@@ -39,6 +40,9 @@ func newOptions(opts ...Option) *Options {
3940
}
4041
return true
4142
},
43+
errorHandler: func(err error) {
44+
// default: do nothing
45+
},
4246
}
4347
for _, opt := range opts {
4448
opt(conf)
@@ -74,6 +78,12 @@ func WithDirector(director func(*http.Request)) Option {
7478
}
7579
}
7680

81+
func WithErrorHandler(handler func(error)) Option {
82+
return func(config *Options) {
83+
config.errorHandler = handler
84+
}
85+
}
86+
7787
func WithCacheKeyFunc(cacheKeyFunc RequestCacheKeyFunc) Option {
7888
return func(config *Options) {
7989
config.keygen = cacheKeyFunc
@@ -145,6 +155,7 @@ func CreateCacheReverseProxy(cache Cache, opts ...Option) (*httputil.ReverseProx
145155
if err := cache.Save(ctx, key, resp.Header, cachePipeReader); err != nil {
146156
// Cache save failed, but continue serving client
147157
// Error is silently ignored as cache is not critical
158+
conf.errorHandler(err)
148159
}
149160
}()
150161

server/service/reverseproxy/proxy_test.go

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"os"
99
"strings"
1010
"testing"
11-
"time"
1211

1312
"github.com/go-sphere/sphere/cache/memory"
1413
"github.com/go-sphere/sphere/storage/local"
@@ -62,9 +61,6 @@ func TestServeCacheReverseProxy_CacheMiss(t *testing.T) {
6261
t.Errorf("Expected 'backend response', got '%s'", body)
6362
}
6463

65-
// Wait a bit for cache to be saved (async operation)
66-
time.Sleep(100 * time.Millisecond)
67-
6864
// Verify cache was populated
6965
exists, err := cache.Exists(req.Context(), "/test")
7066
if err != nil {
@@ -106,9 +102,6 @@ func TestServeCacheReverseProxy_CacheHit(t *testing.T) {
106102
t.Fatalf("First request failed with status %d", rec1.Code)
107103
}
108104

109-
// Wait for cache to be saved
110-
time.Sleep(200 * time.Millisecond)
111-
112105
// Second request - should hit cache
113106
req2 := httptest.NewRequest(http.MethodGet, "/cached", nil)
114107
rec2 := httptest.NewRecorder()
@@ -150,8 +143,6 @@ func TestServeCacheReverseProxy_NonGETNotCached(t *testing.T) {
150143
t.Errorf("Expected status 200, got %d", rec.Code)
151144
}
152145

153-
// Wait and verify cache is empty
154-
time.Sleep(100 * time.Millisecond)
155146
exists, _ := cache.Exists(req.Context(), "/api/data")
156147
if exists {
157148
t.Error("POST request should not be cached")

0 commit comments

Comments
 (0)