diff --git a/openapi2kong/openapi2kong.go b/openapi2kong/openapi2kong.go index 55bd1b2..69f46e3 100644 --- a/openapi2kong/openapi2kong.go +++ b/openapi2kong/openapi2kong.go @@ -1074,7 +1074,12 @@ func Convert(content []byte, opts O2kOptions) (map[string]interface{}, error) { varName := match[1] // match single segment; '/', '?', and '#' can mark the end of a segment // see https://github.com/OAI/OpenAPI-Specification/issues/291#issuecomment-316593913 - regexMatch := "(?<" + sanitizeRegexCapture(varName, opts.InsoCompat) + ">[^#?/]+)" + captureName := sanitizeRegexCapture(varName, opts.InsoCompat) + if len(captureName) >= 32 { + return nil, fmt.Errorf("path-parameter name exceeds 32 characters: '%s' (sanitized to '%s')", + varName, captureName) + } + regexMatch := "(?<" + captureName + ">[^#?/]+)" placeHolder := "{" + varName + "}" logbasics.Debug("replacing path parameter", "parameter", placeHolder, "regex", regexMatch) convertedPath = strings.Replace(convertedPath, placeHolder, regexMatch, 1) diff --git a/openapi2kong/openapi2kong_test.go b/openapi2kong/openapi2kong_test.go index da30bb8..5292416 100644 --- a/openapi2kong/openapi2kong_test.go +++ b/openapi2kong/openapi2kong_test.go @@ -87,3 +87,34 @@ func Test_Openapi2kong_InsoCompat(t *testing.T) { } } } + +func Test_Openapi2kong_pathParamLength(t *testing.T) { + testDataString := ` +openapi: 3.0.3 +info: + title: Path parameter test + version: v1 +servers: + - url: "https://example.com" + +paths: + /demo/{something-very-long-that-is-way-beyond-the-32-limit}/: + get: + operationId: opsid + parameters: + - in: path + name: something-very-long-that-is-way-beyond-the-32-limit + required: true + schema: + type: string + responses: + "200": + description: OK +` + _, err := Convert([]byte(testDataString), O2kOptions{}) + if err == nil { + t.Error("Expected error, but got none") + } else { + assert.Contains(t, err.Error(), "path-parameter name exceeds 32 characters") + } +}