{"record":{"id":"83a086b003745c16","repo":"quarkusio/quarkus","slug":"path-not-specified","errorCode":null,"errorMessage":"Path not specified","messagePattern":"Path not specified","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"extensions/vertx-http/runtime/src/main/java/io/quarkus/vertx/http/runtime/security/ImmutablePathMatcher.java","lineNumber":306,"sourceCode":"                String stripped = pathWithWildcard.substring(0, pathWithWildcard.length() - 2);\n                pathWithoutWildcard = stripped.isEmpty() ? \"/\" : stripped;\n            } else {\n                // remove *\n                pathWithoutWildcard = pathWithWildcard.substring(0, pathWithWildcard.length() - 1);\n            }\n\n            Path<T> p = pathsWithWildcard.computeIfAbsent(pathWithoutWildcard, Path::new);\n            p.originalPath = originalPath;\n            if (pathAfter1stWildcard == null) {\n                p.addPrefixPath(handler, handlerAccumulator);\n            } else {\n                p.addPathWithInnerWildcard(pathAfter1stWildcard, handler);\n            }\n        }\n\n        private void addExactPath(final String path, final T handler) {\n            if (path.isEmpty()) {\n                throw new IllegalArgumentException(\"Path not specified\");\n            }\n            if (exactPathMatches.containsKey(path) && handlerAccumulator != null) {\n                handlerAccumulator.accept(exactPathMatches.get(path), handler);\n            } else {\n                exactPathMatches.put(path, handler);\n            }\n            // when 'path.equals(\"/api/hello\")' then the other path is '/api/hello/'\n            final String otherPath;\n            if (path.endsWith(STRING_PATH_SEPARATOR)) {\n                if (path.length() == 1) {\n                    // path '/' is only valid option, '' is not allowed\n                    return;\n                }\n                // drop path separator\n                otherPath = path.substring(0, path.length() - 1);\n            } else {\n                otherPath = path + STRING_PATH_SEPARATOR;\n            }","sourceCodeStart":288,"sourceCodeEnd":324,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/vertx-http/runtime/src/main/java/io/quarkus/vertx/http/runtime/security/ImmutablePathMatcher.java#L288-L324","documentation":"ImmutablePathMatcher's addExactPath requires a non-empty path string. An empty string is not a valid exact path to register, so it throws IllegalArgumentException('Path not specified'). This typically surfaces when a configured pattern normalized down to an empty string.","triggerScenarios":"Calling addExactPath with an empty string, which happens via addPath when a permission path is blank or becomes empty after stripping a wildcard/prefix, e.g. quarkus.http.auth.permission.x.paths= (empty) or paths=* alone.","commonSituations":"Empty quarkus.http.auth.permission paths property, config placeholders resolving to empty string, or code that strips a leading segment leaving nothing behind.","solutions":["Provide at least one concrete path such as paths=/* for root-wide matching (use '/*' rather than an empty value).","Remove the empty permission entry from application.properties if it was unintentional.","In code, guard addPath calls: skip or substitute \"/\" when the computed path is empty."],"exampleFix":"// before (application.properties)\nquarkus.http.auth.permission.public.paths=\n// after\nquarkus.http.auth.permission.public.paths=/*","handlingStrategy":"validation","validationCode":"if (paths == null || paths.isEmpty() || paths.stream().anyMatch(String::isBlank)) {\n  throw new IllegalStateException(\"permission paths must contain at least one non-blank path\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use /* instead of leaving paths empty","Never bind empty config placeholders into permission paths","Add startup assertions for permission configuration"],"tags":["quarkus","http-security","configuration","path"],"backgroundTag":"path-not-specified","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}