diff --git a/internal/entrypoint/entrypoint.go b/internal/entrypoint/entrypoint.go index 1931db49..14627789 100644 --- a/internal/entrypoint/entrypoint.go +++ b/internal/entrypoint/entrypoint.go @@ -97,9 +97,12 @@ func (ep *Entrypoint) FindRoute(s string) types.HTTPRoute { func (ep *Entrypoint) ServeHTTP(w http.ResponseWriter, r *http.Request) { if ep.accessLogger != nil { - rec := accesslog.NewResponseRecorder(w) + rec := accesslog.GetResponseRecorder(w) w = rec - defer ep.accessLogger.Log(r, rec.Response()) + defer func() { + ep.accessLogger.Log(r, rec.Response()) + accesslog.PutResponseRecorder(rec) + }() } route := ep.findRouteFunc(r.Host) diff --git a/internal/logging/accesslog/response_recorder.go b/internal/logging/accesslog/response_recorder.go index 4a3b96ef..250346dd 100644 --- a/internal/logging/accesslog/response_recorder.go +++ b/internal/logging/accesslog/response_recorder.go @@ -5,6 +5,7 @@ import ( "fmt" "net" "net/http" + "sync" ) type ResponseRecorder struct { @@ -13,14 +14,30 @@ type ResponseRecorder struct { resp http.Response } -func NewResponseRecorder(w http.ResponseWriter) *ResponseRecorder { - return &ResponseRecorder{ - w: w, - resp: http.Response{ - StatusCode: http.StatusOK, - Header: w.Header(), - }, +var recorderPool = sync.Pool{ + New: func() any { + return &ResponseRecorder{} + }, +} + +func GetResponseRecorder(w http.ResponseWriter) *ResponseRecorder { + r := recorderPool.Get().(*ResponseRecorder) + r.w = w + r.resp = http.Response{ + StatusCode: http.StatusOK, + Header: w.Header(), } + return r +} + +func PutResponseRecorder(r *ResponseRecorder) { + r.w = nil + r.resp = http.Response{} + recorderPool.Put(r) +} + +func NewResponseRecorder(w http.ResponseWriter) *ResponseRecorder { + return GetResponseRecorder(w) } func (w *ResponseRecorder) Unwrap() http.ResponseWriter {