render.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package api
  2. import (
  3. "fmt"
  4. "net/http"
  5. "strconv"
  6. "time"
  7. m "github.com/grafana/grafana/pkg/models"
  8. "github.com/grafana/grafana/pkg/services/rendering"
  9. "github.com/grafana/grafana/pkg/util"
  10. )
  11. func (hs *HTTPServer) RenderToPng(c *m.ReqContext) {
  12. queryReader, err := util.NewUrlQueryReader(c.Req.URL)
  13. if err != nil {
  14. c.Handle(400, "Render parameters error", err)
  15. return
  16. }
  17. queryParams := fmt.Sprintf("?%s", c.Req.URL.RawQuery)
  18. width, err := strconv.Atoi(queryReader.Get("width", "800"))
  19. if err != nil {
  20. c.Handle(400, "Render parameters error", fmt.Errorf("Cannot parse width as int: %s", err))
  21. return
  22. }
  23. height, err := strconv.Atoi(queryReader.Get("height", "400"))
  24. if err != nil {
  25. c.Handle(400, "Render parameters error", fmt.Errorf("Cannot parse height as int: %s", err))
  26. return
  27. }
  28. timeout, err := strconv.Atoi(queryReader.Get("timeout", "60"))
  29. if err != nil {
  30. c.Handle(400, "Render parameters error", fmt.Errorf("Cannot parse timeout as int: %s", err))
  31. return
  32. }
  33. result, err := hs.RenderService.Render(c.Req.Context(), rendering.Opts{
  34. Width: width,
  35. Height: height,
  36. Timeout: time.Duration(timeout) * time.Second,
  37. OrgId: c.OrgId,
  38. UserId: c.UserId,
  39. OrgRole: c.OrgRole,
  40. Path: c.Params("*") + queryParams,
  41. Timezone: queryReader.Get("tz", ""),
  42. Encoding: queryReader.Get("encoding", ""),
  43. })
  44. if err != nil && err == rendering.ErrTimeout {
  45. c.Handle(500, err.Error(), err)
  46. return
  47. }
  48. if err != nil {
  49. c.Handle(500, "Rendering failed.", err)
  50. return
  51. }
  52. c.Resp.Header().Set("Content-Type", "image/png")
  53. http.ServeFile(c.Resp, c.Req.Request, result.FilePath)
  54. }