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