mirror of
https://github.com/binwiederhier/ntfy.git
synced 2024-11-29 14:23:40 +03:00
refactor gjson parsing code
This commit is contained in:
parent
b2eb5b94bd
commit
867cf28080
@ -110,6 +110,7 @@ var (
|
||||
fileRegex = regexp.MustCompile(`^/file/([-_A-Za-z0-9]{1,64})(?:\.[A-Za-z0-9]{1,16})?$`)
|
||||
urlRegex = regexp.MustCompile(`^https?://`)
|
||||
phoneNumberRegex = regexp.MustCompile(`^\+\d{1,100}$`)
|
||||
templateVarRegex = regexp.MustCompile(`\${([^}]+)}`)
|
||||
|
||||
//go:embed site
|
||||
webFs embed.FS
|
||||
@ -1076,36 +1077,28 @@ func (s *Server) handleBodyAsMessageAutoDetect(m *message, body *util.PeekedRead
|
||||
return nil
|
||||
}
|
||||
|
||||
func replaceGJSONTemplate(template string, source string) string {
|
||||
matches := templateVarRegex.FindAllStringSubmatch(template, -1)
|
||||
for _, v := range matches {
|
||||
query := v[1]
|
||||
if result := gjson.Get(source, query); result.Exists() {
|
||||
template = strings.ReplaceAll(template, fmt.Sprintf("${%s}", query), result.String())
|
||||
}
|
||||
}
|
||||
return template
|
||||
}
|
||||
|
||||
func (s *Server) handleBodyAsTextMessage(m *message, body *util.PeekedReadCloser, template bool) error {
|
||||
if !utf8.Valid(body.PeekedBytes) {
|
||||
return errHTTPBadRequestMessageNotUTF8.With(m)
|
||||
}
|
||||
if len(body.PeekedBytes) > 0 { // Empty body should not override message (publish via GET!)
|
||||
peakedBody := strings.TrimSpace(string(body.PeekedBytes)) // Truncates the message to the peek limit if required
|
||||
if template && gjson.Valid(peakedBody) {
|
||||
// Replace JSON paths in message
|
||||
r := regexp.MustCompile(`\${([^}]+)}`)
|
||||
matches := r.FindAllStringSubmatch(m.Message, -1)
|
||||
for _, v := range matches {
|
||||
query := v[1]
|
||||
result := gjson.Get(peakedBody, query)
|
||||
if result.Exists() {
|
||||
m.Message = strings.ReplaceAll(m.Message, fmt.Sprintf("${%s}", query), result.String())
|
||||
}
|
||||
}
|
||||
|
||||
// Replace JSON paths in title
|
||||
r = regexp.MustCompile(`\${([^}]+)}`)
|
||||
matches = r.FindAllStringSubmatch(m.Title, -1)
|
||||
for _, v := range matches {
|
||||
query := v[1]
|
||||
result := gjson.Get(peakedBody, query)
|
||||
if result.Exists() {
|
||||
m.Title = strings.ReplaceAll(m.Title, fmt.Sprintf("${%s}", query), result.String())
|
||||
}
|
||||
}
|
||||
peekedBody := strings.TrimSpace(string(body.PeekedBytes)) // Truncates the message to the peek limit if required
|
||||
if template && gjson.Valid(peekedBody) {
|
||||
m.Message = replaceGJSONTemplate(m.Message, peekedBody)
|
||||
m.Title = replaceGJSONTemplate(m.Title, peekedBody)
|
||||
} else {
|
||||
m.Message = peakedBody
|
||||
m.Message = peekedBody
|
||||
}
|
||||
}
|
||||
if m.Attachment != nil && m.Attachment.Name != "" && m.Message == "" {
|
||||
|
Loading…
Reference in New Issue
Block a user