appengine.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. // +build appengine
  2. package bugsnag
  3. import (
  4. "appengine"
  5. "appengine/urlfetch"
  6. "appengine/user"
  7. "fmt"
  8. "log"
  9. "net/http"
  10. )
  11. func defaultPanicHandler() {}
  12. func init() {
  13. OnBeforeNotify(appengineMiddleware)
  14. }
  15. func appengineMiddleware(event *Event, config *Configuration) (err error) {
  16. var c appengine.Context
  17. for _, datum := range event.RawData {
  18. if r, ok := datum.(*http.Request); ok {
  19. c = appengine.NewContext(r)
  20. break
  21. } else if context, ok := datum.(appengine.Context); ok {
  22. c = context
  23. break
  24. }
  25. }
  26. if c == nil {
  27. return fmt.Errorf("No appengine context given")
  28. }
  29. // You can only use the builtin http library if you pay for appengine,
  30. // so we use the appengine urlfetch service instead.
  31. config.Transport = &urlfetch.Transport{
  32. Context: c,
  33. }
  34. // Anything written to stderr/stdout is discarded, so lets log to the request.
  35. if configuredLogger, ok := config.Logger.(*log.Logger); ok {
  36. config.Logger = log.New(appengineWriter{c}, configuredLogger.Prefix(), configuredLogger.Flags())
  37. } else {
  38. config.Logger = log.New(appengineWriter{c}, log.Prefix(), log.Flags())
  39. }
  40. // Set the releaseStage appropriately
  41. if config.ReleaseStage == "" {
  42. if appengine.IsDevAppServer() {
  43. config.ReleaseStage = "development"
  44. } else {
  45. config.ReleaseStage = "production"
  46. }
  47. }
  48. if event.User == nil {
  49. u := user.Current(c)
  50. if u != nil {
  51. event.User = &User{
  52. Id: u.ID,
  53. Email: u.Email,
  54. }
  55. }
  56. }
  57. return nil
  58. }
  59. // Convert an appengine.Context into an io.Writer so we can create a log.Logger.
  60. type appengineWriter struct {
  61. appengine.Context
  62. }
  63. func (c appengineWriter) Write(b []byte) (int, error) {
  64. c.Warningf(string(b))
  65. return len(b), nil
  66. }