diff --git a/pkg/profiles/openapi.go b/pkg/profiles/openapi.go index 877d6a570412b..dc0f9f1c67e15 100644 --- a/pkg/profiles/openapi.go +++ b/pkg/profiles/openapi.go @@ -4,8 +4,8 @@ import ( "fmt" "io" "net/http" - "path" "sort" + "strings" "github.com/go-openapi/spec" sp "github.com/linkerd/linkerd2/controller/gen/apis/serviceprofile/v1alpha2" @@ -67,9 +67,10 @@ func swaggerToServiceProfile(swagger spec.Swagger, namespace, name, clusterDomai sort.Strings(paths) } + base := strings.TrimRight(swagger.BasePath, "/") for _, relPath := range paths { item := swagger.Paths.Paths[relPath] - path := path.Join(swagger.BasePath, relPath) + path := base + "/" + strings.TrimLeft(relPath, "/") pathRegex := PathToRegex(path) if item.Delete != nil { spec := MkRouteSpec(path, pathRegex, http.MethodDelete, item.Delete) diff --git a/pkg/profiles/openapi_test.go b/pkg/profiles/openapi_test.go index 1ea3961ae186d..e25f3892827af 100644 --- a/pkg/profiles/openapi_test.go +++ b/pkg/profiles/openapi_test.go @@ -35,6 +35,11 @@ func TestSwaggerToServiceProfile(t *testing.T) { }, }, }, + "/path/with/trailing/slash/": { + PathItemProps: spec.PathItemProps{ + Get: &spec.Operation{}, + }, + }, }, }, }, @@ -68,6 +73,13 @@ func TestSwaggerToServiceProfile(t *testing.T) { IsRetryable: true, Timeout: "60s", }, + { + Name: "GET /path/with/trailing/slash/", + Condition: &sp.RequestMatch{ + PathRegex: "/path/with/trailing/slash/", + Method: "GET", + }, + }, }, }, }