Browse Source
Fix access log (#14475)
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.mj-v1.14.3
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 129 additions and 72 deletions
-
3modules/auth/sso/oauth2.go
-
10modules/auth/sso/sso.go
-
7modules/auth/sso/sspi_windows.go
-
60modules/context/access_log.go
-
25modules/context/context.go
-
10modules/context/response.go
-
20modules/middlewares/request.go
-
5routers/api/v1/api.go
-
53routers/routes/base.go
-
8routers/routes/web.go
@ -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/") |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue