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  }