util.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package server
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/emersion/go-smtp"
  6. "net/http"
  7. "strings"
  8. )
  9. func readBoolParam(r *http.Request, defaultValue bool, names ...string) bool {
  10. value := strings.ToLower(readParam(r, names...))
  11. if value == "" {
  12. return defaultValue
  13. }
  14. return value == "1" || value == "yes" || value == "true"
  15. }
  16. func readParam(r *http.Request, names ...string) string {
  17. value := readHeaderParam(r, names...)
  18. if value != "" {
  19. return value
  20. }
  21. return readQueryParam(r, names...)
  22. }
  23. func readHeaderParam(r *http.Request, names ...string) string {
  24. for _, name := range names {
  25. value := r.Header.Get(name)
  26. if value != "" {
  27. return strings.TrimSpace(value)
  28. }
  29. }
  30. return ""
  31. }
  32. func readQueryParam(r *http.Request, names ...string) string {
  33. for _, name := range names {
  34. value := r.URL.Query().Get(strings.ToLower(name))
  35. if value != "" {
  36. return strings.TrimSpace(value)
  37. }
  38. }
  39. return ""
  40. }
  41. func logMessagePrefix(v *visitor, m *message) string {
  42. return fmt.Sprintf("%s/%s/%s", v.ip, m.Topic, m.ID)
  43. }
  44. func logHTTPPrefix(v *visitor, r *http.Request) string {
  45. requestURI := r.RequestURI
  46. if requestURI == "" {
  47. requestURI = r.URL.Path
  48. }
  49. return fmt.Sprintf("%s HTTP %s %s", v.ip, r.Method, requestURI)
  50. }
  51. func logSMTPPrefix(state *smtp.ConnectionState) string {
  52. return fmt.Sprintf("%s/%s SMTP", state.Hostname, state.RemoteAddr.String())
  53. }
  54. func maybeMarshalJSON(v interface{}) string {
  55. messageJSON, err := json.MarshalIndent(v, "", " ")
  56. if err != nil {
  57. return "<cannot serialize>"
  58. }
  59. if len(messageJSON) > 5000 {
  60. return string(messageJSON)[:5000]
  61. }
  62. return string(messageJSON)
  63. }