Skip to content

Commit e9aa0f1

Browse files
authored
fix(bypass): use default TTL if bypass response (#628)
* fix(bypass): use default TTL if bypass response * fix(traefik): reset buffer on singleflight to avoid body duplication
1 parent 5eb29cf commit e9aa0f1

6 files changed

Lines changed: 105 additions & 70 deletions

File tree

pkg/middleware/middleware.go

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -284,28 +284,30 @@ func (s *SouinBaseHandler) Store(
284284

285285
hasFreshness := false
286286
ma := currentMatchedURL.TTL.Duration
287-
if responseCc.SMaxAge >= 0 {
288-
ma = time.Duration(responseCc.SMaxAge) * time.Second
289-
} else if responseCc.MaxAge >= 0 {
290-
ma = time.Duration(responseCc.MaxAge) * time.Second
291-
} else if !modeContext.Bypass_response && customWriter.Header().Get("Expires") != "" {
292-
exp, err := time.Parse(time.RFC1123, customWriter.Header().Get("Expires"))
293-
if err != nil {
294-
return nil
295-
}
287+
if !modeContext.Bypass_response {
288+
if responseCc.SMaxAge >= 0 {
289+
ma = time.Duration(responseCc.SMaxAge) * time.Second
290+
} else if responseCc.MaxAge >= 0 {
291+
ma = time.Duration(responseCc.MaxAge) * time.Second
292+
} else if customWriter.Header().Get("Expires") != "" {
293+
exp, err := time.Parse(time.RFC1123, customWriter.Header().Get("Expires"))
294+
if err != nil {
295+
return nil
296+
}
296297

297-
duration := time.Until(exp)
298-
if duration <= 0 || duration > 10*types.OneYearDuration {
299-
return nil
300-
}
298+
duration := time.Until(exp)
299+
if duration <= 0 || duration > 10*types.OneYearDuration {
300+
return nil
301+
}
301302

302-
date, _ := time.Parse(time.RFC1123, customWriter.Header().Get("Date"))
303-
if date.Sub(exp) > 0 {
304-
return nil
305-
}
303+
date, _ := time.Parse(time.RFC1123, customWriter.Header().Get("Date"))
304+
if date.Sub(exp) > 0 {
305+
return nil
306+
}
306307

307-
ma = duration
308-
hasFreshness = true
308+
ma = duration
309+
hasFreshness = true
310+
}
309311
}
310312

311313
now := rq.Context().Value(context.Now).(time.Time)
@@ -729,6 +731,7 @@ func (s *SouinBaseHandler) ServeHTTP(rw http.ResponseWriter, rq *http.Request, n
729731
}
730732
for _, currentStorer := range s.Storers {
731733
fresh, stale = currentStorer.GetMultiLevel(finalKey, req, validator)
734+
fmt.Printf("modecontext: %#v\n%#v\n%#v\n\n", modeContext, fresh, stale)
732735

733736
if fresh != nil || stale != nil {
734737
storerName = currentStorer.Name()

plugins/go-zero/examples/internal/handler/routes.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

plugins/traefik/override/middleware/middleware.go

Lines changed: 35 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -185,28 +185,30 @@ func (s *SouinBaseHandler) Store(
185185

186186
hasFreshness := false
187187
ma := currentMatchedURL.TTL.Duration
188-
if responseCc.SMaxAge >= 0 {
189-
ma = time.Duration(responseCc.SMaxAge) * time.Second
190-
} else if responseCc.MaxAge >= 0 {
191-
ma = time.Duration(responseCc.MaxAge) * time.Second
192-
} else if !modeContext.Bypass_response && customWriter.Header().Get("Expires") != "" {
193-
exp, err := time.Parse(time.RFC1123, customWriter.Header().Get("Expires"))
194-
if err != nil {
195-
return nil
196-
}
188+
if !modeContext.Bypass_response {
189+
if responseCc.SMaxAge >= 0 {
190+
ma = time.Duration(responseCc.SMaxAge) * time.Second
191+
} else if responseCc.MaxAge >= 0 {
192+
ma = time.Duration(responseCc.MaxAge) * time.Second
193+
} else if customWriter.Header().Get("Expires") != "" {
194+
exp, err := time.Parse(time.RFC1123, customWriter.Header().Get("Expires"))
195+
if err != nil {
196+
return nil
197+
}
197198

198-
duration := time.Until(exp)
199-
if duration <= 0 || duration > 10*types.OneYearDuration {
200-
return nil
201-
}
199+
duration := time.Until(exp)
200+
if duration <= 0 || duration > 10*types.OneYearDuration {
201+
return nil
202+
}
202203

203-
date, _ := time.Parse(time.RFC1123, customWriter.Header().Get("Date"))
204-
if date.Sub(exp) > 0 {
205-
return nil
206-
}
204+
date, _ := time.Parse(time.RFC1123, customWriter.Header().Get("Date"))
205+
if date.Sub(exp) > 0 {
206+
return nil
207+
}
207208

208-
ma = duration
209-
hasFreshness = true
209+
ma = duration
210+
hasFreshness = true
211+
}
210212
}
211213

212214
now := rq.Context().Value(context.Now).(time.Time)
@@ -402,6 +404,7 @@ func (s *SouinBaseHandler) Upstream(
402404
}
403405
}
404406
}
407+
customWriter.Buf.Reset()
405408
_, _ = customWriter.Write(sfWriter.body)
406409
// Yaegi sucks, we can't use maps.
407410
for k := range sfWriter.headers {
@@ -433,6 +436,17 @@ func (s *SouinBaseHandler) Revalidate(validator *types.Revalidator, next handler
433436
return nil, errors.New("")
434437
}
435438

439+
if validator.IfModifiedSincePresent {
440+
if lastModified, err := time.Parse(time.RFC1123, customWriter.Header().Get("Last-Modified")); err == nil && validator.IfModifiedSince.Sub(lastModified) > 0 {
441+
customWriter.handleBuffer(func(b *bytes.Buffer) {
442+
b.Reset()
443+
})
444+
customWriter.Rw.WriteHeader(http.StatusNotModified)
445+
446+
return nil, errors.New("")
447+
}
448+
}
449+
436450
if statusCode != http.StatusNotModified {
437451
err = s.Store(customWriter, rq, requestCc, cachedKey)
438452
}
@@ -616,13 +630,13 @@ func (s *SouinBaseHandler) ServeHTTP(rw http.ResponseWriter, rq *http.Request, n
616630
return nil
617631
}
618632

619-
if validator.NeedRevalidation {
633+
if !modeContext.Bypass_request && validator.NeedRevalidation {
620634
err := s.Revalidate(validator, next, customWriter, req, requestCc, cachedKey, uri)
621635
_, _ = customWriter.Send()
622636

623637
return err
624638
}
625-
if resCc, _ := cacheobject.ParseResponseCacheControl(rfc.HeaderAllCommaSepValuesString(response.Header, headerName)); resCc.NoCachePresent {
639+
if resCc, _ := cacheobject.ParseResponseCacheControl(rfc.HeaderAllCommaSepValuesString(response.Header, headerName)); !modeContext.Bypass_response && resCc.NoCachePresent {
626640
err := s.Revalidate(validator, next, customWriter, req, requestCc, cachedKey, uri)
627641
_, _ = customWriter.Send()
628642

plugins/traefik/override/middleware/writer.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package middleware
22

33
import (
44
"bytes"
5+
"fmt"
56
"net/http"
67
"strconv"
78
"sync"
@@ -76,17 +77,18 @@ func (r *CustomWriter) WriteHeader(code int) {
7677

7778
// Write will write the response body
7879
func (r *CustomWriter) Write(b []byte) (int, error) {
79-
r.mutex.Lock()
80-
defer r.mutex.Unlock()
81-
r.Buf.Grow(len(b))
82-
_, _ = r.Buf.Write(b)
80+
r.handleBuffer(func(actual *bytes.Buffer) {
81+
actual.Grow(len(b))
82+
_, _ = actual.Write(b)
83+
})
8384

8485
return len(b), nil
8586
}
8687

8788
// Send delays the response to handle Cache-Status
8889
func (r *CustomWriter) Send() (int, error) {
8990
defer r.Buf.Reset()
91+
fmt.Println("Upstream Send", r.Buf.Len())
9092
storedLength := r.Header().Get(rfc.StoredLengthHeader)
9193
if storedLength != "" {
9294
r.Header().Set("Content-Length", storedLength)

plugins/traefik/vendor/github.com/darkweak/souin/pkg/middleware/middleware.go

Lines changed: 35 additions & 21 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

plugins/traefik/vendor/github.com/darkweak/souin/pkg/middleware/writer.go

Lines changed: 6 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)