@@ -189,7 +189,7 @@ func (s *SouinBaseHandler) Store(
189189 ma = time .Duration (responseCc .SMaxAge ) * time .Second
190190 } else if responseCc .MaxAge >= 0 {
191191 ma = time .Duration (responseCc .MaxAge ) * time .Second
192- } else if customWriter .Header ().Get ("Expires" ) != "" {
192+ } else if ! modeContext . Bypass_response && customWriter .Header ().Get ("Expires" ) != "" {
193193 exp , err := time .Parse (time .RFC1123 , customWriter .Header ().Get ("Expires" ))
194194 if err != nil {
195195 return nil
@@ -249,7 +249,7 @@ func (s *SouinBaseHandler) Store(
249249 }
250250 res .Header .Set (rfc .StoredLengthHeader , res .Header .Get ("Content-Length" ))
251251 response , err := httputil .DumpResponse (& res , true )
252- if err == nil && (bLen > 0 || canStatusCodeEmptyContent (statusCode )) {
252+ if err == nil && (bLen > 0 || canStatusCodeEmptyContent (statusCode ) || s . hasAllowedAdditionalStatusCodesToCache ( statusCode ) ) {
253253 variedHeaders , isVaryStar := rfc .VariedHeaderAllCommaSepValues (res .Header )
254254 if isVaryStar {
255255 // "Implies that the response is uncacheable"
@@ -372,7 +372,9 @@ func (s *SouinBaseHandler) Upstream(
372372 }
373373
374374 err := s .Store (customWriter , rq , requestCc , cachedKey )
375- defer customWriter .Buf .Reset ()
375+ defer customWriter .handleBuffer (func (b * bytes.Buffer ) {
376+ b .Reset ()
377+ })
376378
377379 return singleflightValue {
378380 body : customWriter .Buf .Bytes (),
@@ -423,7 +425,9 @@ func (s *SouinBaseHandler) Revalidate(validator *types.Revalidator, next handler
423425 statusCode := customWriter .GetStatusCode ()
424426 if err == nil {
425427 if validator .IfUnmodifiedSincePresent && statusCode != http .StatusNotModified {
426- customWriter .Buf .Reset ()
428+ customWriter .handleBuffer (func (b * bytes.Buffer ) {
429+ b .Reset ()
430+ })
427431 customWriter .Rw .WriteHeader (http .StatusPreconditionFailed )
428432
429433 return nil , errors .New ("" )
@@ -444,7 +448,9 @@ func (s *SouinBaseHandler) Revalidate(validator *types.Revalidator, next handler
444448 ),
445449 )
446450
447- defer customWriter .Buf .Reset ()
451+ defer customWriter .handleBuffer (func (b * bytes.Buffer ) {
452+ b .Reset ()
453+ })
448454 return singleflightValue {
449455 body : customWriter .Buf .Bytes (),
450456 headers : customWriter .Header ().Clone (),
@@ -493,6 +499,7 @@ func (s *SouinBaseHandler) ServeHTTP(rw http.ResponseWriter, rq *http.Request, n
493499 handler (rw , rq )
494500 return nil
495501 }
502+
496503 req := s .context .SetBaseContext (rq )
497504 cacheName := req .Context ().Value (context .CacheName ).(string )
498505
@@ -526,7 +533,6 @@ func (s *SouinBaseHandler) ServeHTTP(rw http.ResponseWriter, rq *http.Request, n
526533 requestCc , coErr := cacheobject .ParseRequestCacheControl (rfc .HeaderAllCommaSepValuesString (req .Header , "Cache-Control" ))
527534
528535 modeContext := req .Context ().Value (context .Mode ).(* context.ModeContext )
529-
530536 if ! modeContext .Bypass_request && (coErr != nil || requestCc == nil ) {
531537 rw .Header ().Set ("Cache-Status" , cacheName + "; fwd=bypass; detail=CACHE-CONTROL-EXTRACTION-ERROR" )
532538
@@ -593,14 +599,18 @@ func (s *SouinBaseHandler) ServeHTTP(rw http.ResponseWriter, rq *http.Request, n
593599 }
594600 if validator .NotModified {
595601 customWriter .WriteHeader (http .StatusNotModified )
596- customWriter .Buf .Reset ()
602+ customWriter .handleBuffer (func (b * bytes.Buffer ) {
603+ b .Reset ()
604+ })
597605 _ , _ = customWriter .Send ()
598606
599607 return nil
600608 }
601609
602610 customWriter .WriteHeader (response .StatusCode )
603- _ , _ = io .Copy (customWriter .Buf , response .Body )
611+ customWriter .handleBuffer (func (b * bytes.Buffer ) {
612+ _ , _ = io .Copy (b , response .Body )
613+ })
604614 _ , _ = customWriter .Send ()
605615
606616 return nil
@@ -624,7 +634,9 @@ func (s *SouinBaseHandler) ServeHTTP(rw http.ResponseWriter, rq *http.Request, n
624634 customWriter .Header ()[h ] = v
625635 }
626636 customWriter .WriteHeader (response .StatusCode )
627- _ , _ = io .Copy (customWriter .Buf , response .Body )
637+ customWriter .handleBuffer (func (b * bytes.Buffer ) {
638+ _ , _ = io .Copy (b , response .Body )
639+ })
628640 _ , err := customWriter .Send ()
629641
630642 return err
@@ -643,7 +655,9 @@ func (s *SouinBaseHandler) ServeHTTP(rw http.ResponseWriter, rq *http.Request, n
643655 }
644656 customWriter .WriteHeader (response .StatusCode )
645657 rfc .HitStaleCache (& response .Header )
646- _ , _ = io .Copy (customWriter .Buf , response .Body )
658+ customWriter .handleBuffer (func (b * bytes.Buffer ) {
659+ _ , _ = io .Copy (b , response .Body )
660+ })
647661 _ , err := customWriter .Send ()
648662 customWriter = NewCustomWriter (req , rw , bufPool )
649663 go func (v * types.Revalidator , goCw * CustomWriter , goRq * http.Request , goNext func (http.ResponseWriter , * http.Request ) error , goCc * cacheobject.RequestCacheDirectives , goCk string , goUri string ) {
@@ -656,7 +670,7 @@ func (s *SouinBaseHandler) ServeHTTP(rw http.ResponseWriter, rq *http.Request, n
656670 return err
657671 }
658672
659- if responseCc .MustRevalidate || responseCc .NoCachePresent || validator .NeedRevalidation {
673+ if modeContext . Bypass_response || responseCc .MustRevalidate || responseCc .NoCachePresent || validator .NeedRevalidation {
660674 req .Header ["If-None-Match" ] = append (req .Header ["If-None-Match" ], validator .ResponseETag )
661675 err := s .Revalidate (validator , next , customWriter , req , requestCc , cachedKey , uri )
662676 statusCode := customWriter .GetStatusCode ()
@@ -670,14 +684,18 @@ func (s *SouinBaseHandler) ServeHTTP(rw http.ResponseWriter, rq *http.Request, n
670684 customWriter .Header ().Set (k , response .Header .Get (k ))
671685 }
672686 customWriter .WriteHeader (response .StatusCode )
673- customWriter .Buf .Reset ()
674- _ , _ = io .Copy (customWriter .Buf , response .Body )
687+ customWriter .handleBuffer (func (b * bytes.Buffer ) {
688+ b .Reset ()
689+ _ , _ = io .Copy (b , response .Body )
690+ })
675691 _ , err := customWriter .Send ()
676692
677693 return err
678694 }
679695 rw .WriteHeader (http .StatusGatewayTimeout )
680- customWriter .Buf .Reset ()
696+ customWriter .handleBuffer (func (b * bytes.Buffer ) {
697+ b .Reset ()
698+ })
681699 _ , err := customWriter .Send ()
682700
683701 return err
@@ -691,7 +709,9 @@ func (s *SouinBaseHandler) ServeHTTP(rw http.ResponseWriter, rq *http.Request, n
691709 for k := range response .Header {
692710 customWriter .Header ().Set (k , response .Header .Get (k ))
693711 }
694- _ , _ = io .Copy (customWriter .Buf , response .Body )
712+ customWriter .handleBuffer (func (b * bytes.Buffer ) {
713+ _ , _ = io .Copy (b , response .Body )
714+ })
695715 _ , _ = customWriter .Send ()
696716
697717 return err
@@ -700,7 +720,9 @@ func (s *SouinBaseHandler) ServeHTTP(rw http.ResponseWriter, rq *http.Request, n
700720
701721 if statusCode != http .StatusNotModified && validator .Matched {
702722 customWriter .WriteHeader (http .StatusNotModified )
703- customWriter .Buf .Reset ()
723+ customWriter .handleBuffer (func (b * bytes.Buffer ) {
724+ b .Reset ()
725+ })
704726 _ , _ = customWriter .Send ()
705727
706728 return err
@@ -718,7 +740,9 @@ func (s *SouinBaseHandler) ServeHTTP(rw http.ResponseWriter, rq *http.Request, n
718740 for k := range response .Header {
719741 customWriter .Header ().Set (k , response .Header .Get (k ))
720742 }
721- _ , _ = io .Copy (customWriter .Buf , response .Body )
743+ customWriter .handleBuffer (func (b * bytes.Buffer ) {
744+ _ , _ = io .Copy (b , response .Body )
745+ })
722746 _ , err := customWriter .Send ()
723747
724748 return err
@@ -747,8 +771,10 @@ func (s *SouinBaseHandler) ServeHTTP(rw http.ResponseWriter, rq *http.Request, n
747771 customWriter .Header ().Set (k , response .Header .Get (k ))
748772 }
749773 customWriter .WriteHeader (response .StatusCode )
750- customWriter .Buf .Reset ()
751- _ , _ = io .Copy (customWriter .Buf , response .Body )
774+ customWriter .handleBuffer (func (b * bytes.Buffer ) {
775+ b .Reset ()
776+ _ , _ = io .Copy (b , response .Body )
777+ })
752778 _ , err := customWriter .Send ()
753779
754780 return err
0 commit comments