From 61de19250dbf09b8504d9be6f93beb0b6db32da3 Mon Sep 17 00:00:00 2001 From: Marcus Efraimsson Date: Tue, 21 Apr 2020 19:57:11 +0200 Subject: [PATCH] Image Rendering: Make it work using serve_from_sub_path configured (#23706) Make rendering work when using serve_from_sub_path and not have rendering.renderer_url configured. Fixes #21925 --- pkg/services/rendering/rendering.go | 7 ++- pkg/services/rendering/rendering_test.go | 59 ++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 pkg/services/rendering/rendering_test.go diff --git a/pkg/services/rendering/rendering.go b/pkg/services/rendering/rendering.go index 97380d79504..c45fd2978ed 100644 --- a/pkg/services/rendering/rendering.go +++ b/pkg/services/rendering/rendering.go @@ -186,8 +186,13 @@ func (rs *RenderingService) getURL(path string) string { protocol = "https" } + subPath := "" + if rs.Cfg.ServeFromSubPath { + subPath = rs.Cfg.AppSubUrl + } + // &render=1 signals to the legacy redirect layer to - return fmt.Sprintf("%s://%s:%s/%s&render=1", protocol, rs.domain, setting.HttpPort, path) + return fmt.Sprintf("%s://%s:%s%s/%s&render=1", protocol, rs.domain, setting.HttpPort, subPath, path) } func (rs *RenderingService) generateAndStoreRenderKey(orgId, userId int64, orgRole models.RoleType) (string, error) { diff --git a/pkg/services/rendering/rendering_test.go b/pkg/services/rendering/rendering_test.go new file mode 100644 index 00000000000..66b5b442123 --- /dev/null +++ b/pkg/services/rendering/rendering_test.go @@ -0,0 +1,59 @@ +package rendering + +import ( + "testing" + + "github.com/grafana/grafana/pkg/setting" + "github.com/stretchr/testify/require" +) + +func TestGetUrl(t *testing.T) { + path := "render/d-solo/5SdHCadmz/panel-tests-graph?orgId=1&from=1587390211965&to=1587393811965&panelId=5&width=1000&height=500&tz=Europe%2FStockholm" + rs := &RenderingService{ + Cfg: setting.NewCfg(), + } + + t.Run("When renderer and callback url configured should return callback url plus path", func(t *testing.T) { + rs.Cfg.RendererUrl = "http://localhost:8081/render" + rs.Cfg.RendererCallbackUrl = "http://public-grafana.com/" + url := rs.getURL(path) + require.Equal(t, rs.Cfg.RendererCallbackUrl+path+"&render=1", url) + }) + + t.Run("When renderer url not configured", func(t *testing.T) { + rs.Cfg.RendererUrl = "" + rs.domain = "localhost" + setting.HttpPort = "3000" + + t.Run("And protocol HTTP configured should return expected path", func(t *testing.T) { + rs.Cfg.ServeFromSubPath = false + rs.Cfg.AppSubUrl = "" + setting.Protocol = setting.HTTP + url := rs.getURL(path) + require.Equal(t, "http://localhost:3000/"+path+"&render=1", url) + + t.Run("And serve from sub path should return expected path", func(t *testing.T) { + rs.Cfg.ServeFromSubPath = true + rs.Cfg.AppSubUrl = "/grafana" + url := rs.getURL(path) + require.Equal(t, "http://localhost:3000/grafana/"+path+"&render=1", url) + }) + }) + + t.Run("And protocol HTTPS configured should return expected path", func(t *testing.T) { + rs.Cfg.ServeFromSubPath = false + rs.Cfg.AppSubUrl = "" + setting.Protocol = setting.HTTPS + url := rs.getURL(path) + require.Equal(t, "https://localhost:3000/"+path+"&render=1", url) + }) + + t.Run("And protocol HTTP2 configured should return expected path", func(t *testing.T) { + rs.Cfg.ServeFromSubPath = false + rs.Cfg.AppSubUrl = "" + setting.Protocol = setting.HTTP2 + url := rs.getURL(path) + require.Equal(t, "https://localhost:3000/"+path+"&render=1", url) + }) + }) +}