fix(api): redirect swagger base path

Co-Authored-By: Virgil <virgil@lethean.io>
This commit is contained in:
Virgil 2026-04-02 07:44:55 +00:00
parent bbee19204f
commit 08cb1385d3
2 changed files with 69 additions and 0 deletions

View file

@ -4,6 +4,7 @@ package api
import (
"fmt"
"net/http"
"strings"
"sync"
"sync/atomic"
@ -57,6 +58,9 @@ func registerSwagger(g *gin.Engine, e *Engine, groups []RouteGroup) {
spec := newSwaggerSpec(e.OpenAPISpecBuilder(), groups)
name := fmt.Sprintf("swagger_%d", swaggerSeq.Add(1))
swag.Register(name, spec)
g.GET(swaggerPath, func(c *gin.Context) {
c.Redirect(http.StatusMovedPermanently, swaggerPath+"/")
})
g.GET(swaggerPath+"/*any", ginSwagger.WrapHandler(swaggerFiles.NewHandler(), ginSwagger.InstanceName(name)))
}

View file

@ -111,6 +111,71 @@ func TestSwaggerEndpoint_Good_CustomPath(t *testing.T) {
}
}
func TestSwaggerEndpoint_Good_BasePathRedirect(t *testing.T) {
gin.SetMode(gin.TestMode)
e, err := api.New(api.WithSwagger("Test API", "A test API service", "1.0.0"))
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
srv := httptest.NewServer(e.Handler())
defer srv.Close()
client := &http.Client{
CheckRedirect: func(req *http.Request, via []*http.Request) error {
return http.ErrUseLastResponse
},
}
resp, err := client.Get(srv.URL + "/swagger")
if err != nil {
t.Fatalf("request failed: %v", err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusMovedPermanently {
t.Fatalf("expected 301 redirect, got %d", resp.StatusCode)
}
if got := resp.Header.Get("Location"); got != "/swagger/" {
t.Fatalf("expected Location=/swagger/, got %q", got)
}
}
func TestSwaggerEndpoint_Good_CustomBasePathRedirect(t *testing.T) {
gin.SetMode(gin.TestMode)
e, err := api.New(
api.WithSwagger("Test API", "A test API service", "1.0.0"),
api.WithSwaggerPath("/docs"),
)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
srv := httptest.NewServer(e.Handler())
defer srv.Close()
client := &http.Client{
CheckRedirect: func(req *http.Request, via []*http.Request) error {
return http.ErrUseLastResponse
},
}
resp, err := client.Get(srv.URL + "/docs")
if err != nil {
t.Fatalf("request failed: %v", err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusMovedPermanently {
t.Fatalf("expected 301 redirect, got %d", resp.StatusCode)
}
if got := resp.Header.Get("Location"); got != "/docs/" {
t.Fatalf("expected Location=/docs/, got %q", got)
}
}
func TestSwaggerDisabledByDefault_Good(t *testing.T) {
gin.SetMode(gin.TestMode)