github.com/avenga/couper@v1.12.2/handler/middleware/status.go (about) 1 package middleware 2 3 import ( 4 "context" 5 "net/http" 6 7 "github.com/avenga/couper/config/request" 8 "github.com/avenga/couper/server/writer" 9 ) 10 11 func NewRecordHandler(secureCookies string) Next { 12 return func(handler http.Handler) *NextHandler { 13 return NewHandler(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { 14 gw := writer.NewGzipWriter(rw, req.Header) 15 w := writer.NewResponseWriter(gw, secureCookies) 16 17 // This defer closes the GZ writer but more important is triggering our own buffer logic in all cases 18 // for this writer to prevent the 200 OK status fallback (http.ResponseWriter) and an empty response body. 19 defer func() { 20 select { // do not close on cancel since we may have nothing to write and the client may be gone anyways. 21 case <-req.Context().Done(): 22 return 23 default: 24 _ = gw.Close() 25 } 26 }() 27 28 ctx := context.WithValue(req.Context(), request.ResponseWriter, w) 29 *req = *req.WithContext(ctx) 30 handler.ServeHTTP(w, req) 31 }), handler) 32 } 33 }