|
|
|
|
|
|
|
|
|
|
|
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 |
|
|
} |
|
|
|