Skip to content

Commit 135b0e5

Browse files
lunny6543
andauthored
Fix log http status is always zero (#14400)
* Fix log http status is always zero * Fix lint Co-authored-by: 6543 <[email protected]>
1 parent 41e19b9 commit 135b0e5

File tree

2 files changed

+72
-2
lines changed

2 files changed

+72
-2
lines changed

modules/context/response.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
// Copyright 2021 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package context
6+
7+
import "net/http"
8+
9+
// ResponseWriter represents a response writer for HTTP
10+
type ResponseWriter interface {
11+
http.ResponseWriter
12+
Flush()
13+
Status() int
14+
}
15+
16+
var (
17+
_ ResponseWriter = &Response{}
18+
)
19+
20+
// Response represents a response
21+
type Response struct {
22+
http.ResponseWriter
23+
status int
24+
}
25+
26+
// Write writes bytes to HTTP endpoint
27+
func (r *Response) Write(bs []byte) (int, error) {
28+
size, err := r.ResponseWriter.Write(bs)
29+
if err != nil {
30+
return 0, err
31+
}
32+
if r.status == 0 {
33+
r.WriteHeader(200)
34+
}
35+
return size, nil
36+
}
37+
38+
// WriteHeader write status code
39+
func (r *Response) WriteHeader(statusCode int) {
40+
r.status = statusCode
41+
r.ResponseWriter.WriteHeader(statusCode)
42+
}
43+
44+
// Flush flush cached data
45+
func (r *Response) Flush() {
46+
if f, ok := r.ResponseWriter.(http.Flusher); ok {
47+
f.Flush()
48+
}
49+
}
50+
51+
// Status returned status code written
52+
func (r *Response) Status() int {
53+
return r.status
54+
}
55+
56+
// NewResponse creates a response
57+
func NewResponse(resp http.ResponseWriter) *Response {
58+
if v, ok := resp.(*Response); ok {
59+
return v
60+
}
61+
return &Response{resp, 0}
62+
}

routers/routes/chi.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"text/template"
1717
"time"
1818

19+
"code.gitea.io/gitea/modules/context"
1920
"code.gitea.io/gitea/modules/httpcache"
2021
"code.gitea.io/gitea/modules/log"
2122
"code.gitea.io/gitea/modules/metrics"
@@ -90,9 +91,11 @@ func LoggerHandler(level log.Level) func(next http.Handler) http.Handler {
9091

9192
next.ServeHTTP(w, req)
9293

93-
ww := middleware.NewWrapResponseWriter(w, req.ProtoMajor)
94+
var status int
95+
if v, ok := w.(context.ResponseWriter); ok {
96+
status = v.Status()
97+
}
9498

95-
status := ww.Status()
9699
_ = log.GetLogger("router").Log(0, level, "Completed %s %s %v %s in %v", log.ColoredMethod(req.Method), req.URL.RequestURI(), log.ColoredStatus(status), log.ColoredStatus(status, http.StatusText(status)), log.ColoredTime(time.Since(start)))
97100
})
98101
}
@@ -183,6 +186,11 @@ var (
183186
// NewChi creates a chi Router
184187
func NewChi() chi.Router {
185188
c := chi.NewRouter()
189+
c.Use(func(next http.Handler) http.Handler {
190+
return http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) {
191+
next.ServeHTTP(context.NewResponse(resp), req)
192+
})
193+
})
186194
c.Use(middleware.RealIP)
187195
if !setting.DisableRouterLog && setting.RouterLogLevel != log.NONE {
188196
if log.GetLogger("router").GetLevel() <= setting.RouterLogLevel {

0 commit comments

Comments
 (0)