common.go 2.5 KB

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