rookie-ninja / rk-boot

Build microservice with rk-boot and let the team take over clean and tidy code.

Home Page:https://rkdev.info

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Swagger/Docs Panic: no / before catch-all in path '\/sw\*any'

feidhlimx opened this issue · comments

Describe the bug
Swagger / Docs enabled in boot.yaml produces panic in rk-boot - Bootstrap
go/pkg/mod/github.com/rookie-ninja/rk-boot/v2@v2.2.11/boot.go:174
panic: no / before catch-all in path '/\sw*any'

To Reproduce
Steps to reproduce the behavior:

swag init -g api/main.go
go run .\api\main.go
see go.mod below...

Desktop (please complete the following information):

  • OS: Windows 10
  • VSCode Terminal > go run .\api\main.go
  • Version rk-boot/v2@v2.2.11

func main() {
boot := rkboot.NewBoot()
...
boot.Bootstrap(context.TODO())
boot.WaitForShutdownSig(context.TODO())
}

boot,yaml includes (extract):
gin:

  • name: app-api
    port: 8088
    enabled: true
    loggerEntry: zap-log
    eventEntry: event-log
    commonService:
    enabled: true # health endpoints
    pathPrefix: "/restricted/common"
    sw:
    enabled: true # Swagger UI
    path: "/sw"
    docs:
    enabled: true # API Doc
    path: "/docs"
    prom:
    enabled: true # Prometheus Client
    path: "/public/metrics"
    middleware:
    logging:
    enabled: true
    loggerEncoding: "json"
    loggerOutputPaths: ["stdout"]
    eventEncoding: "json"
    eventOutputPaths: ["stdout"]
    prom:
    enabled: true
    meta:
    enabled: true
    trace:
    enabled: true

Additional context
{"level":"ERROR","ts":"2022-11-23T09:56:32.916+0100","caller":"v2@v2.2.11/boot.go:257","msg":"Panic occured, shutting down... \ngoroutine 1 [running]:\nruntime/debug.Stack()\n\tC:/Program Files/Go/src/runtime/debug/stack.go:24 +0x65\ngithub.com/rookie-ninja/rk-boot/v2.syncLog({0xc000620000, 0x24})\n\tC:/Users//go/pkg/mod/github.com/rookie-ninja/rk-boot/v2@v2.2.11/boot.go:249 +0x65\npanic({0x12034a0, 0xc000339280})\n\tC:/Program Files/Go/src/runtime/panic.go:838 +0x207\ngithub.com/gin-gonic/gin.(*node).insertChild(0x12e2840?, {0xc00039b532?, 0x0?}, {0xc00039b530, 0x9}, {0xc00020d1d0, 0x6, 0x6})\n\tC:/Users/mcconig/go/pkg/mod/github.com/gin-gonic/gin@v1.8.1/tree.go:363 +0xb2e\ngithub.com/gin-gonic/gin.(*node).addRoute(0x1374618?, {0xc00039b530, 0x9}, {0xc00020d1d0, 0x6, 0x6})\n\tC:/Users//go/pkg/mod/github.com/gin-gonic/gin@v1.8.1/tree.go:252 +0xa39\ngithub.com/gin-gonic/gin.(*Engine).addRoute(0xc00008cea0, {0x1374618, 0x3}, {0xc00039b530, 0x9}, {0xc00020d1d0, 0x6, 0x6})\n\tC:/Users//go/pkg/mod/github.com/gin-gonic/gin@v1.8.1/gin.go:331
+0x226\ngithub.com/gin-gonic/gin.(*RouterGroup).handle(0xc00008cea0, {0x1374618, 0x3}, {0xc00039b4f0?, 0xc00020cb10?}, {0xc0000068f0, 0x1, 0x68?})\n\tC:/Users/
/go/pkg/mod/github.com/gin-gonic/gin@v1.8.1/routergroup.go:88 +0x145\ngithub.com/gin-gonic/gin.(*RouterGroup).GET(...)\n\tC:/Users//go/pkg/mod/github.com/gin-gonic/gin@v1.8.1/routergroup.go:116\ngithub.com/rookie-ninja/rk-gin/v2/boot.(*GinEntry).Bootstrap(0xc00062adc0, {0x1685d40, 0xc00020cb10})\n\tC:/Users/mcconig/go/pkg/mod/github.com/rookie-ninja/rk-gin/v2@v2.2.14/boot/gin_entry.go:387 +0x53f\ngithub.com/rookie-ninja/rk-boot/v2.(*Boot).Bootstrap(0xc0001aed20, {0x1685cd0, 0xc000036068})\n\tC:/Users/mcconig/go/pkg/mod/github.com/rookie-ninja/rk-boot/v2@v2.2.11/boot.go:174 +0x46e\nmain.main()\n\tC:/Users//repos/configcontrol-api-ssh/api/main.go:28 +0x575\n","eventId":"d1e0a1e6-3095-408a-9e1c-a19a2edfdb3c","RootCause":"no / before catch-all in path '/\sw\*any'"}
panic: no / before catch-all in path '/\sw*any' [recovered]
panic: no / before catch-all in path '/\sw*any'

go.mod:

go 1.18

require (
github.com/gin-gonic/gin v1.8.1
github.com/rookie-ninja/rk-boot/v2 v2.2.11
github.com/rookie-ninja/rk-db/mysql v1.2.12
github.com/rookie-ninja/rk-entry/v2 v2.2.11
github.com/rookie-ninja/rk-gin/v2 v2.2.14
github.com/swaggo/swag v1.8.7
gorm.io/gorm v1.24.1
)

require (
github.com/KyleBanks/depth v1.2.1 // indirect
github.com/PuerkitoBio/purell v1.1.1 // indirect
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/cenkalti/backoff/v4 v4.1.3 // indirect
github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/fsnotify/fsnotify v1.5.4 // indirect
github.com/gin-contrib/pprof v1.3.0 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-logr/logr v1.2.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-openapi/jsonpointer v0.19.5 // indirect
github.com/go-openapi/jsonreference v0.19.6 // indirect
github.com/go-openapi/spec v0.20.4 // indirect
github.com/go-openapi/swag v0.19.15 // indirect
github.com/go-playground/locales v0.14.0 // indirect
github.com/go-playground/universal-translator v0.18.0 // indirect
github.com/go-playground/validator/v10 v10.10.0 // indirect
github.com/go-sql-driver/mysql v1.6.0 // indirect
github.com/goccy/go-json v0.9.7 // indirect
github.com/golang-jwt/jwt/v4 v4.4.2 // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.1 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/leodido/go-urn v1.2.1 // indirect
github.com/magiconair/properties v1.8.6 // indirect
github.com/mailru/easyjson v0.7.6 // indirect
github.com/mattn/go-isatty v0.0.14 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/openzipkin/zipkin-go v0.4.0 // indirect
github.com/pelletier/go-toml v1.9.5 // indirect
github.com/pelletier/go-toml/v2 v2.0.1 // indirect
github.com/prometheus/client_golang v1.13.0 // indirect
github.com/prometheus/client_model v0.2.0 // indirect
github.com/prometheus/common v0.37.0 // indirect
github.com/prometheus/procfs v0.8.0 // indirect
github.com/rookie-ninja/rk-logger v1.2.12 // indirect
github.com/rookie-ninja/rk-query v1.2.14 // indirect
github.com/rs/xid v1.3.0 // indirect
github.com/spf13/afero v1.8.2 // indirect
github.com/spf13/cast v1.5.0 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/spf13/viper v1.12.0 // indirect
github.com/subosito/gotenv v1.3.0 // indirect
github.com/ugorji/go/codec v1.2.7 // indirect
go.opentelemetry.io/contrib v1.8.0 // indirect
go.opentelemetry.io/otel v1.10.0 // indirect
go.opentelemetry.io/otel/exporters/jaeger v1.8.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.10.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.10.0 // indirect
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.8.0 // indirect
go.opentelemetry.io/otel/exporters/zipkin v1.10.0 // indirect
go.opentelemetry.io/otel/sdk v1.10.0 // indirect

@feidhlimx The above boot.yaml works in my Mac environment, I will find a windows machine to reproduce the problem

I've spent some more time in the debugger and to me it looks like some form of windows slash vs backslash problem..

The path of the route (in tree.go of gin-gonic) looks different between windows and linux, see attached screenshots:
Windows:
windows

Linux:
linux

I think it comes down to common_service_entry.go which joins paths using filepath.Join, resulting in backslashes on Windows
See Variable ReadyPath containing "\rk\v1\ready" instead of "/rk/v1/ready".
I guess the correct way of joining the segments would be using url.JoinPath

image

@friesoft Good catch. There are some places use filepath.join() function while joining URL. Your solution looks correct. I will fix this bug ASAP

@friesoft Please pull the latest version of rk-boot and dependencies. I think new releases will fix the problem.

Thanks, we will be testing within the next days :)

This problem is tested and fixed with version github.com/rookie-ninja/rk-boot/v2 v2.2.12

Thanks!