From 6f4fdc3ec4545d77ce9f36016e2f2bc7356a356c Mon Sep 17 00:00:00 2001 From: Nikita Goncharov Date: Wed, 26 Sep 2018 05:28:12 +0300 Subject: [PATCH] feat: add disabling handler (#33) --- README.md | 41 +++++++++++++++++++++++++++++++++++++++++ swagger.go | 19 ++++++++++++++++++- swagger_test.go | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3b9a46c..d4b27fc 100644 --- a/README.md +++ b/README.md @@ -75,3 +75,44 @@ func main() { ![swagger_index.html](https://user-images.githubusercontent.com/8943871/31943004-dd08a10e-b88c-11e7-9e77-19d2c759a586.png) +6. If you want to disable swagger when some environment variable is set, use `DisablingWrapHandler` + +### Example with disabling: + +```go +package main + +import ( + "github.com/gin-gonic/gin" + "github.com/swaggo/gin-swagger" + "github.com/swaggo/gin-swagger/swaggerFiles" + + _ "./docs" // docs is generated by Swag CLI, you have to import it. +) + +// @title Swagger Example API +// @version 1.0 +// @description This is a sample server Petstore server. +// @termsOfService http://swagger.io/terms/ + +// @contact.name API Support +// @contact.url http://www.swagger.io/support +// @contact.email support@swagger.io + +// @license.name Apache 2.0 +// @license.url http://www.apache.org/licenses/LICENSE-2.0.html + +// @host petstore.swagger.io +// @BasePath /v2 +func main() { + r := gin.New() + + // use ginSwagger middleware to + r.GET("/swagger/*any", ginSwagger.DisablingWrapHandler(swaggerFiles.Handler, "NAME_OF_ENV_VARIABLE")) + + r.Run() +} +``` + +Then, if you set envioment variable `NAME_OF_ENV_VARIABLE` to anything, `/swagger/*any` +will respond 404, just like when route unspecified. diff --git a/swagger.go b/swagger.go index c7f49f8..fd58935 100644 --- a/swagger.go +++ b/swagger.go @@ -1,10 +1,12 @@ package ginSwagger import ( - "golang.org/x/net/webdav" "html/template" + "os" "regexp" + "golang.org/x/net/webdav" + "github.com/gin-gonic/gin" "github.com/swaggo/swag" ) @@ -49,6 +51,21 @@ func WrapHandler(h *webdav.Handler) gin.HandlerFunc { } } +// DisablingWrapHandler turn handler off +// if specified environment variable passed +func DisablingWrapHandler(h *webdav.Handler, envName string) gin.HandlerFunc { + eFlag := os.Getenv(envName) + if eFlag != "" { + return func(c *gin.Context) { + // Simulate behavior when route unspecified and + // return 404 HTTP code + c.String(404, "") + } + } + + return WrapHandler(h) +} + const swagger_index_templ = ` diff --git a/swagger_test.go b/swagger_test.go index 7815e0e..4fffb2b 100644 --- a/swagger_test.go +++ b/swagger_test.go @@ -2,6 +2,7 @@ package ginSwagger import ( "net/http/httptest" + "os" "testing" "github.com/gin-gonic/gin" @@ -28,7 +29,43 @@ func TestWrapHandler(t *testing.T) { w4 := performRequest("GET", "/notfound", router) assert.Equal(t, 404, w4.Code) +} +func TestDisablingWrapHandler(t *testing.T) { + gin.SetMode(gin.TestMode) + + router := gin.New() + disablingKey := "SWAGGER_DISABLE" + + router.GET("/simple/*any", DisablingWrapHandler(swaggerFiles.Handler, disablingKey)) + + w1 := performRequest("GET", "/simple/index.html", router) + assert.Equal(t, 200, w1.Code) + + w2 := performRequest("GET", "/simple/doc.json", router) + assert.Equal(t, 200, w2.Code) + + w3 := performRequest("GET", "/simple/favicon-16x16.png", router) + assert.Equal(t, 200, w3.Code) + + w4 := performRequest("GET", "/simple/notfound", router) + assert.Equal(t, 404, w4.Code) + + os.Setenv(disablingKey, "true") + + router.GET("/disabling/*any", DisablingWrapHandler(swaggerFiles.Handler, disablingKey)) + + w11 := performRequest("GET", "/disabling/index.html", router) + assert.Equal(t, 404, w11.Code) + + w22 := performRequest("GET", "/disabling/doc.json", router) + assert.Equal(t, 404, w22.Code) + + w33 := performRequest("GET", "/disabling/favicon-16x16.png", router) + assert.Equal(t, 404, w33.Code) + + w44 := performRequest("GET", "/disabling/notfound", router) + assert.Equal(t, 404, w44.Code) } func performRequest(method, target string, router *gin.Engine) *httptest.ResponseRecorder {