From 63ddbbfc3642d58d74c6b40edb138dc673b6ae71 Mon Sep 17 00:00:00 2001 From: fabiante <7669818+fabiante@users.noreply.github.com> Date: Sat, 15 Jun 2024 07:55:24 +0000 Subject: [PATCH] Fix redirecting on gin router with prefixed path Fixes #15 --- handler.go | 16 ++++++++++---- handler_test.go | 55 ++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 66 insertions(+), 5 deletions(-) diff --git a/handler.go b/handler.go index 0791ab7..1c9170f 100644 --- a/handler.go +++ b/handler.go @@ -55,9 +55,7 @@ func NewHandler(specYML []byte, opts ...Option) (*Handler, error) { func (handler *Handler) Register(router gin.IRoutes) { router.GET("/openapi.yml", handler.GetSpec) router.StaticFS("/swagger-ui", handler.FS) - router.GET("/swaggerui", func(ctx *gin.Context) { - ctx.Redirect(http.StatusPermanentRedirect, getRedirectPath(ctx)) - }) + router.GET("/swaggerui", handler.Redirect) } // Option objects used to construct Handler objects. @@ -145,6 +143,16 @@ func (handler *Handler) GetSpec(ctx *gin.Context) { ctx.YAML(200, spec) } -func getRedirectPath(_ *gin.Context) string { +func (handler *Handler) Redirect(ctx *gin.Context) { + ctx.Redirect(http.StatusPermanentRedirect, getRedirectPath(ctx)) +} + +func getRedirectPath(ctx *gin.Context) string { + if ctx != nil && ctx.Request != nil && ctx.Request.URL != nil { + p := ctx.Request.URL.Path + p = strings.TrimSuffix(p, "/swaggerui") + return p + "/swagger-ui" + } + return "/swagger-ui" } diff --git a/handler_test.go b/handler_test.go index bcd9fb4..699e829 100644 --- a/handler_test.go +++ b/handler_test.go @@ -47,5 +47,58 @@ func TestHandler(t *testing.T) { } func TestGetRedirectPath(t *testing.T) { - require.Equal(t, "/swagger-ui", getRedirectPath(nil)) + gin.SetMode(gin.TestMode) + + t.Run("returns proper path when using no prefix", func(t *testing.T) { + engine := gin.New() + testServer := httptest.NewServer(engine) + defer testServer.Close() + + handler := &Handler{} + + // Register redirect handler on prefixed path + engine.Any("/swaggerui", handler.Redirect) + + client := testServer.Client() + + redirectCalled := false + + client.CheckRedirect = func(req *http.Request, via []*http.Request) error { + require.Equal(t, "/swagger-ui", req.URL.Path) + redirectCalled = true + return nil + } + + _, err := client.Get(testServer.URL + "/swaggerui") + assert.NoError(t, err) + + require.True(t, redirectCalled, "handler did not respond with redirect") + }) + + t.Run("returns proper path when using prefix", func(t *testing.T) { + engine := gin.New() + testServer := httptest.NewServer(engine) + defer testServer.Close() + + handler := &Handler{} + + // Register redirect handler on prefixed path + group := engine.Group("/prefix") + group.Any("/swaggerui", handler.Redirect) + + client := testServer.Client() + + redirectCalled := false + + client.CheckRedirect = func(req *http.Request, via []*http.Request) error { + require.Equal(t, "/prefix/swagger-ui", req.URL.Path) + redirectCalled = true + return nil + } + + _, err := client.Get(testServer.URL + "/prefix/swaggerui") + assert.NoError(t, err) + + require.True(t, redirectCalled, "handler did not respond with redirect") + }) }