fix(api): redirect swagger base path
Co-Authored-By: Virgil <virgil@lethean.io>
This commit is contained in:
parent
bbee19204f
commit
08cb1385d3
2 changed files with 69 additions and 0 deletions
|
|
@ -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)))
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue