middleware.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package bugsnag
  2. import (
  3. "net/http"
  4. )
  5. type (
  6. beforeFunc func(*Event, *Configuration) error
  7. // MiddlewareStacks keep middleware in the correct order. They are
  8. // called in reverse order, so if you add a new middleware it will
  9. // be called before all existing middleware.
  10. middlewareStack struct {
  11. before []beforeFunc
  12. }
  13. )
  14. // AddMiddleware adds a new middleware to the outside of the existing ones,
  15. // when the middlewareStack is Run it will be run before all middleware that
  16. // have been added before.
  17. func (stack *middlewareStack) OnBeforeNotify(middleware beforeFunc) {
  18. stack.before = append(stack.before, middleware)
  19. }
  20. // Run causes all the middleware to be run. If they all permit it the next callback
  21. // will be called with all the middleware on the stack.
  22. func (stack *middlewareStack) Run(event *Event, config *Configuration, next func() error) error {
  23. // run all the before filters in reverse order
  24. for i := range stack.before {
  25. before := stack.before[len(stack.before)-i-1]
  26. severity := event.Severity
  27. err := stack.runBeforeFilter(before, event, config)
  28. if err != nil {
  29. return err
  30. }
  31. if event.Severity != severity {
  32. event.handledState.SeverityReason = SeverityReasonCallbackSpecified
  33. }
  34. }
  35. return next()
  36. }
  37. func (stack *middlewareStack) runBeforeFilter(f beforeFunc, event *Event, config *Configuration) error {
  38. defer func() {
  39. if err := recover(); err != nil {
  40. config.logf("bugsnag/middleware: unexpected panic: %v", err)
  41. }
  42. }()
  43. return f(event, config)
  44. }
  45. // catchMiddlewarePanic is used to log any panics that happen inside Middleware,
  46. // we wouldn't want to not notify Bugsnag in this case.
  47. func catchMiddlewarePanic(event *Event, config *Configuration, next func() error) {
  48. }
  49. // httpRequestMiddleware is added OnBeforeNotify by default. It takes information
  50. // from an http.Request passed in as rawData, and adds it to the Event. You can
  51. // use this as a template for writing your own Middleware.
  52. func httpRequestMiddleware(event *Event, config *Configuration) error {
  53. for _, datum := range event.RawData {
  54. if request, ok := datum.(*http.Request); ok {
  55. event.MetaData.Update(MetaData{
  56. "request": {
  57. "params": request.URL.Query(),
  58. },
  59. })
  60. }
  61. }
  62. return nil
  63. }