common.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package api
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "github.com/Unknwon/macaron"
  6. "github.com/grafana/grafana/pkg/log"
  7. "github.com/grafana/grafana/pkg/metrics"
  8. "github.com/grafana/grafana/pkg/middleware"
  9. "github.com/grafana/grafana/pkg/setting"
  10. )
  11. var (
  12. NotFound = ApiError(404, "Not found", nil)
  13. ServerError = ApiError(500, "Server error", nil)
  14. )
  15. type Response interface {
  16. WriteTo(out http.ResponseWriter)
  17. }
  18. type NormalResponse struct {
  19. status int
  20. body []byte
  21. header http.Header
  22. }
  23. func wrap(action interface{}) macaron.Handler {
  24. return func(c *middleware.Context) {
  25. var res Response
  26. val, err := c.Invoke(action)
  27. if err == nil && val != nil && len(val) > 0 {
  28. res = val[0].Interface().(Response)
  29. } else {
  30. res = ServerError
  31. }
  32. res.WriteTo(c.Resp)
  33. }
  34. }
  35. func (r *NormalResponse) WriteTo(out http.ResponseWriter) {
  36. header := out.Header()
  37. for k, v := range r.header {
  38. header[k] = v
  39. }
  40. out.WriteHeader(r.status)
  41. out.Write(r.body)
  42. }
  43. func (r *NormalResponse) Cache(ttl string) *NormalResponse {
  44. return r.Header("Cache-Control", "public,max-age="+ttl)
  45. }
  46. func (r *NormalResponse) Header(key, value string) *NormalResponse {
  47. r.header.Set(key, value)
  48. return r
  49. }
  50. // functions to create responses
  51. func Empty(status int) *NormalResponse {
  52. return Respond(status, nil)
  53. }
  54. func Json(status int, body interface{}) *NormalResponse {
  55. return Respond(status, body).Header("Content-Type", "application/json")
  56. }
  57. func ApiSuccess(message string) *NormalResponse {
  58. resp := make(map[string]interface{})
  59. resp["message"] = message
  60. return Respond(200, resp)
  61. }
  62. func ApiError(status int, message string, err error) *NormalResponse {
  63. resp := make(map[string]interface{})
  64. if err != nil {
  65. log.Error(4, "%s: %v", message, err)
  66. if setting.Env != setting.PROD {
  67. resp["error"] = err.Error()
  68. }
  69. }
  70. switch status {
  71. case 404:
  72. resp["message"] = "Not Found"
  73. metrics.M_Api_Status_500.Inc(1)
  74. case 500:
  75. metrics.M_Api_Status_404.Inc(1)
  76. resp["message"] = "Internal Server Error"
  77. }
  78. if message != "" {
  79. resp["message"] = message
  80. }
  81. return Json(status, resp)
  82. }
  83. func Respond(status int, body interface{}) *NormalResponse {
  84. var b []byte
  85. var err error
  86. switch t := body.(type) {
  87. case []byte:
  88. b = t
  89. case string:
  90. b = []byte(t)
  91. default:
  92. if b, err = json.Marshal(body); err != nil {
  93. return ApiError(500, "body json marshal", err)
  94. }
  95. }
  96. return &NormalResponse{
  97. body: b,
  98. status: status,
  99. header: make(http.Header),
  100. }
  101. }