mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-05-20 13:31:56 +00:00
69 lines
1.3 KiB
Go
69 lines
1.3 KiB
Go
package trim
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"strings"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
)
|
|
|
|
// JSONBody trims whitespace from string fields in JSON request bodies.
|
|
func JSONBody() fiber.Handler {
|
|
return func(c *fiber.Ctx) error {
|
|
contentType := c.Get(fiber.HeaderContentType)
|
|
if !strings.Contains(contentType, fiber.MIMEApplicationJSON) {
|
|
return c.Next()
|
|
}
|
|
|
|
if strings.EqualFold(c.Path(), "/api/sso/users/sync") {
|
|
return c.Next()
|
|
}
|
|
|
|
body := c.Body()
|
|
if len(body) == 0 {
|
|
return c.Next()
|
|
}
|
|
|
|
var payload any
|
|
if err := json.Unmarshal(body, &payload); err != nil {
|
|
return c.Next()
|
|
}
|
|
|
|
trimStrings(payload)
|
|
|
|
buf := bytes.Buffer{}
|
|
encoder := json.NewEncoder(&buf)
|
|
encoder.SetEscapeHTML(false)
|
|
if err := encoder.Encode(payload); err != nil {
|
|
return err
|
|
}
|
|
|
|
trimmedBody := bytes.TrimSpace(buf.Bytes())
|
|
c.Request().SetBody(trimmedBody)
|
|
|
|
return c.Next()
|
|
}
|
|
}
|
|
|
|
func trimStrings(value any) {
|
|
switch v := value.(type) {
|
|
case map[string]any:
|
|
for key, val := range v {
|
|
if str, ok := val.(string); ok {
|
|
v[key] = strings.TrimSpace(str)
|
|
continue
|
|
}
|
|
trimStrings(val)
|
|
}
|
|
case []any:
|
|
for i, elem := range v {
|
|
if str, ok := elem.(string); ok {
|
|
v[i] = strings.TrimSpace(str)
|
|
continue
|
|
}
|
|
trimStrings(elem)
|
|
}
|
|
}
|
|
}
|