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"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/modules/context"
 | 
			
		||||
	"code.gitea.io/gitea/modules/httpcache"
 | 
			
		||||
	"code.gitea.io/gitea/modules/log"
 | 
			
		||||
	"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)
 | 
			
		||||
 | 
			
		||||
			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)))
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
@@ -183,6 +186,11 @@ var (
 | 
			
		||||
// NewChi creates a chi Router
 | 
			
		||||
func NewChi() chi.Router {
 | 
			
		||||
	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)
 | 
			
		||||
	if !setting.DisableRouterLog && setting.RouterLogLevel != log.NONE {
 | 
			
		||||
		if log.GetLogger("router").GetLevel() <= setting.RouterLogLevel {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user