Fix log http status is always zero (#14400)
* Fix log http status is always zero * Fix lint Co-authored-by: 6543 <6543@obermui.de>
This commit is contained in:
		
							parent
							
								
									41e19b93a2
								
							
						
					
					
						commit
						135b0e502d
					
				
					 2 changed files with 72 additions and 2 deletions
				
			
		
							
								
								
									
										62
									
								
								modules/context/response.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								modules/context/response.go
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,62 @@ | ||||||
|  | // Copyright 2021 The Gitea Authors. All rights reserved.
 | ||||||
|  | // Use of this source code is governed by a MIT-style
 | ||||||
|  | // license that can be found in the LICENSE file.
 | ||||||
|  | 
 | ||||||
|  | package context | ||||||
|  | 
 | ||||||
|  | import "net/http" | ||||||
|  | 
 | ||||||
|  | // ResponseWriter represents a response writer for HTTP
 | ||||||
|  | type ResponseWriter interface { | ||||||
|  | 	http.ResponseWriter | ||||||
|  | 	Flush() | ||||||
|  | 	Status() int | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	_ ResponseWriter = &Response{} | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Response represents a response
 | ||||||
|  | type Response struct { | ||||||
|  | 	http.ResponseWriter | ||||||
|  | 	status int | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Write writes bytes to HTTP endpoint
 | ||||||
|  | func (r *Response) Write(bs []byte) (int, error) { | ||||||
|  | 	size, err := r.ResponseWriter.Write(bs) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return 0, err | ||||||
|  | 	} | ||||||
|  | 	if r.status == 0 { | ||||||
|  | 		r.WriteHeader(200) | ||||||
|  | 	} | ||||||
|  | 	return size, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // WriteHeader write status code
 | ||||||
|  | func (r *Response) WriteHeader(statusCode int) { | ||||||
|  | 	r.status = statusCode | ||||||
|  | 	r.ResponseWriter.WriteHeader(statusCode) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Flush flush cached data
 | ||||||
|  | func (r *Response) Flush() { | ||||||
|  | 	if f, ok := r.ResponseWriter.(http.Flusher); ok { | ||||||
|  | 		f.Flush() | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Status returned status code written
 | ||||||
|  | func (r *Response) Status() int { | ||||||
|  | 	return r.status | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewResponse creates a response
 | ||||||
|  | func NewResponse(resp http.ResponseWriter) *Response { | ||||||
|  | 	if v, ok := resp.(*Response); ok { | ||||||
|  | 		return v | ||||||
|  | 	} | ||||||
|  | 	return &Response{resp, 0} | ||||||
|  | } | ||||||
|  | @ -16,6 +16,7 @@ import ( | ||||||
| 	"text/template" | 	"text/template" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
|  | 	"code.gitea.io/gitea/modules/context" | ||||||
| 	"code.gitea.io/gitea/modules/httpcache" | 	"code.gitea.io/gitea/modules/httpcache" | ||||||
| 	"code.gitea.io/gitea/modules/log" | 	"code.gitea.io/gitea/modules/log" | ||||||
| 	"code.gitea.io/gitea/modules/metrics" | 	"code.gitea.io/gitea/modules/metrics" | ||||||
|  | @ -90,9 +91,11 @@ func LoggerHandler(level log.Level) func(next http.Handler) http.Handler { | ||||||
| 
 | 
 | ||||||
| 			next.ServeHTTP(w, req) | 			next.ServeHTTP(w, req) | ||||||
| 
 | 
 | ||||||
| 			ww := middleware.NewWrapResponseWriter(w, req.ProtoMajor) | 			var status int | ||||||
|  | 			if v, ok := w.(context.ResponseWriter); ok { | ||||||
|  | 				status = v.Status() | ||||||
|  | 			} | ||||||
| 
 | 
 | ||||||
| 			status := ww.Status() |  | ||||||
| 			_ = 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))) | 			_ = 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))) | ||||||
| 		}) | 		}) | ||||||
| 	} | 	} | ||||||
|  | @ -183,6 +186,11 @@ var ( | ||||||
| // NewChi creates a chi Router
 | // NewChi creates a chi Router
 | ||||||
| func NewChi() chi.Router { | func NewChi() chi.Router { | ||||||
| 	c := chi.NewRouter() | 	c := chi.NewRouter() | ||||||
|  | 	c.Use(func(next http.Handler) http.Handler { | ||||||
|  | 		return http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) { | ||||||
|  | 			next.ServeHTTP(context.NewResponse(resp), req) | ||||||
|  | 		}) | ||||||
|  | 	}) | ||||||
| 	c.Use(middleware.RealIP) | 	c.Use(middleware.RealIP) | ||||||
| 	if !setting.DisableRouterLog && setting.RouterLogLevel != log.NONE { | 	if !setting.DisableRouterLog && setting.RouterLogLevel != log.NONE { | ||||||
| 		if log.GetLogger("router").GetLevel() <= setting.RouterLogLevel { | 		if log.GetLogger("router").GetLevel() <= setting.RouterLogLevel { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue