Fix access log (#14475)
Fix #14121, #14478. The `AccessLog` middleware has to be after `Contexter` or `APIContexter` so that we can get `LoginUserName` if possible. And also there is a **BREAK** change that it removed internal API access log.tokarchuk/v1.17
parent
4c6e029506
commit
a51cc6dea4
@ -0,0 +1,60 @@ |
|||||||
|
// Copyright 2020 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 ( |
||||||
|
"bytes" |
||||||
|
"html/template" |
||||||
|
"net/http" |
||||||
|
"time" |
||||||
|
|
||||||
|
"code.gitea.io/gitea/modules/log" |
||||||
|
"code.gitea.io/gitea/modules/setting" |
||||||
|
) |
||||||
|
|
||||||
|
type routerLoggerOptions struct { |
||||||
|
req *http.Request |
||||||
|
Identity *string |
||||||
|
Start *time.Time |
||||||
|
ResponseWriter http.ResponseWriter |
||||||
|
Ctx map[string]interface{} |
||||||
|
} |
||||||
|
|
||||||
|
// AccessLogger returns a middleware to log access logger
|
||||||
|
func AccessLogger() func(http.Handler) http.Handler { |
||||||
|
logger := log.GetLogger("access") |
||||||
|
logTemplate, _ := template.New("log").Parse(setting.AccessLogTemplate) |
||||||
|
return func(next http.Handler) http.Handler { |
||||||
|
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { |
||||||
|
start := time.Now() |
||||||
|
next.ServeHTTP(w, req) |
||||||
|
identity := "-" |
||||||
|
if val := SignedUserName(req); val != "" { |
||||||
|
identity = val |
||||||
|
} |
||||||
|
rw := w.(ResponseWriter) |
||||||
|
|
||||||
|
buf := bytes.NewBuffer([]byte{}) |
||||||
|
err := logTemplate.Execute(buf, routerLoggerOptions{ |
||||||
|
req: req, |
||||||
|
Identity: &identity, |
||||||
|
Start: &start, |
||||||
|
ResponseWriter: rw, |
||||||
|
Ctx: map[string]interface{}{ |
||||||
|
"RemoteAddr": req.RemoteAddr, |
||||||
|
"Req": req, |
||||||
|
}, |
||||||
|
}) |
||||||
|
if err != nil { |
||||||
|
log.Error("Could not set up chi access logger: %v", err.Error()) |
||||||
|
} |
||||||
|
|
||||||
|
err = logger.SendLog(log.INFO, "", "", 0, buf.String(), "") |
||||||
|
if err != nil { |
||||||
|
log.Error("Could not set up chi access logger: %v", err.Error()) |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,20 @@ |
|||||||
|
// Copyright 2020 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 middlewares |
||||||
|
|
||||||
|
import ( |
||||||
|
"net/http" |
||||||
|
"strings" |
||||||
|
) |
||||||
|
|
||||||
|
// IsAPIPath returns true if the specified URL is an API path
|
||||||
|
func IsAPIPath(req *http.Request) bool { |
||||||
|
return strings.HasPrefix(req.URL.Path, "/api/") |
||||||
|
} |
||||||
|
|
||||||
|
// IsInternalPath returns true if the specified URL is an internal API path
|
||||||
|
func IsInternalPath(req *http.Request) bool { |
||||||
|
return strings.HasPrefix(req.URL.Path, "/api/internal/") |
||||||
|
} |
Loading…
Reference in new issue