| | |
| | |
| | |
| | package middleware |
| |
|
| | import ( |
| | "bytes" |
| | "io" |
| | "net/http" |
| | "strings" |
| |
|
| | "github.com/gin-gonic/gin" |
| | "github.com/router-for-me/CLIProxyAPI/v6/internal/logging" |
| | "github.com/router-for-me/CLIProxyAPI/v6/internal/util" |
| | ) |
| |
|
| | |
| | |
| | |
| | |
| | func RequestLoggingMiddleware(logger logging.RequestLogger) gin.HandlerFunc { |
| | return func(c *gin.Context) { |
| | if logger == nil { |
| | c.Next() |
| | return |
| | } |
| |
|
| | if c.Request.Method == http.MethodGet { |
| | c.Next() |
| | return |
| | } |
| |
|
| | path := c.Request.URL.Path |
| | if !shouldLogRequest(path) { |
| | c.Next() |
| | return |
| | } |
| |
|
| | |
| | requestInfo, err := captureRequestInfo(c) |
| | if err != nil { |
| | |
| | |
| | c.Next() |
| | return |
| | } |
| |
|
| | |
| | wrapper := NewResponseWriterWrapper(c.Writer, logger, requestInfo) |
| | if !logger.IsEnabled() { |
| | wrapper.logOnErrorOnly = true |
| | } |
| | c.Writer = wrapper |
| |
|
| | |
| | c.Next() |
| |
|
| | |
| | if err = wrapper.Finalize(c); err != nil { |
| | |
| | |
| | } |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | func captureRequestInfo(c *gin.Context) (*RequestInfo, error) { |
| | |
| | maskedQuery := util.MaskSensitiveQuery(c.Request.URL.RawQuery) |
| | url := c.Request.URL.Path |
| | if maskedQuery != "" { |
| | url += "?" + maskedQuery |
| | } |
| |
|
| | |
| | method := c.Request.Method |
| |
|
| | |
| | headers := make(map[string][]string) |
| | for key, values := range c.Request.Header { |
| | headers[key] = values |
| | } |
| |
|
| | |
| | var body []byte |
| | if c.Request.Body != nil { |
| | |
| | bodyBytes, err := io.ReadAll(c.Request.Body) |
| | if err != nil { |
| | return nil, err |
| | } |
| |
|
| | |
| | c.Request.Body = io.NopCloser(bytes.NewBuffer(bodyBytes)) |
| | body = bodyBytes |
| | } |
| |
|
| | return &RequestInfo{ |
| | URL: url, |
| | Method: method, |
| | Headers: headers, |
| | Body: body, |
| | RequestID: logging.GetGinRequestID(c), |
| | }, nil |
| | } |
| |
|
| | |
| | |
| | |
| | func shouldLogRequest(path string) bool { |
| | if strings.HasPrefix(path, "/v0/management") || strings.HasPrefix(path, "/management") { |
| | return false |
| | } |
| |
|
| | if strings.HasPrefix(path, "/api") { |
| | return strings.HasPrefix(path, "/api/provider") |
| | } |
| |
|
| | return true |
| | } |
| |
|