render.go 1.9 KB

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