mirror of
				https://github.com/go-gitea/gitea
				synced 2025-11-03 21:08:25 +00:00 
			
		
		
		
	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:
		
							
								
								
									
										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 {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user