{"record":{"id":"c1bf6e427444a53a","repo":"quarkusio/quarkus","slug":"no-end-to-parameter","errorCode":null,"errorMessage":"No end to parameter","messagePattern":"No end to parameter","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"independent-projects/resteasy-reactive/common/runtime/src/main/java/org/jboss/resteasy/reactive/common/headers/LinkDelegate.java","lineNumber":90,"sourceCode":"                        builder.param(name, val);\n\n                }\n            }\n        }\n\n        public String parseLink() {\n            int end = value.indexOf('>', curr);\n            if (end == -1)\n                throw new IllegalArgumentException(\"No end to link\");\n            String href = value.substring(curr + 1, end);\n            curr = end + 1;\n            return href;\n        }\n\n        public void parseAttribute(MultivaluedMap<String, String> attributes) {\n            int end = value.indexOf('=', curr);\n            if (end == -1 || end + 1 >= value.length())\n                throw new IllegalArgumentException(\"No end to parameter\");\n            String name = value.substring(curr, end);\n            name = name.trim();\n            curr = end + 1;\n            String val = null;\n            if (curr >= value.length()) {\n                val = \"\";\n            } else {\n\n                if (value.charAt(curr) == '\"') {\n                    if (curr + 1 >= value.length())\n                        throw new IllegalArgumentException(\"No end to parameter\");\n                    curr++;\n                    end = value.indexOf('\"', curr);\n                    if (end == -1)\n                        throw new IllegalArgumentException(\"No end to parameter\");\n                    val = value.substring(curr, end);\n                    curr = end + 1;\n                } else {","sourceCodeStart":72,"sourceCodeEnd":108,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/independent-projects/resteasy-reactive/common/runtime/src/main/java/org/jboss/resteasy/reactive/common/headers/LinkDelegate.java#L72-L108","documentation":"LinkDelegate parses an RFC 5988 Link header into a jakarta.ws.rs.core.Link. Its internal Parser.parseAttribute() extracts each `name=value` parameter and throws IllegalArgumentException when it cannot find a terminating '=' followed by at least one more character, i.e. the parameter name is dangling with no '=' or the '=' is the last character of the header value.","triggerScenarios":"Parsing a Link header (via LinkDelegate.fromString, Link.valueOf, or header deserialization) where a parameter after the first '; ' lacks an '=' (e.g. `<http://x>; rel`), or has an '=' as the final character (e.g. `<http://x>; rel=`).","commonSituations":"Hand-written or mis-generated Link/Set-Cookie-style headers from proxies or custom clients; truncated headers; server code building Link strings manually with a formatting bug; header values stripped by middleware.","solutions":["Inspect the raw Link header string and ensure every parameter is of the form name=value (e.g. rel=\"next\", title=\"foo\").","Fix the code generating the header so it emits '=' followed by a value for each parameter; trim trailing '; ' or dangling keys.","Escape/quote values containing spaces or '=' as required by RFC 5988 before serializing.","Wrap header parsing in try-catch for IllegalArgumentException and fall back to treating the header as unusable rather than failing the request."],"exampleFix":"// before\nString header = \"<https://api.example.com/page/2>; rel\";\nLink link = Link.valueOf(header); // throws\n// after\nString header = \"<https://api.example.com/page/2>; rel=\\\"next\\\"\";\nLink link = Link.valueOf(header);","handlingStrategy":"validation","validationCode":"boolean isParsableLink(String h) {\n    if (h == null) return false;\n    for (String param : h.split(\";\")) {\n        String p = param.trim();\n        if (p.isEmpty() || p.startsWith(\"<\")) continue;\n        if (p.indexOf('=') <= 0 || p.indexOf('=') == p.length() - 1) return false;\n    }\n    return true;\n}","typeGuard":null,"tryCatchPattern":"try {\n    Link link = Link.valueOf(header);\n} catch (IllegalArgumentException e) {\n    log.warn(\"Malformed Link header: \" + header, e);\n    // proceed without link\n}","preventionTips":["Build Link headers with Link.Builder or LinkDelegate.toString, never manual string concatenation","Validate every parameter has name=value form before sending","Quote values containing spaces, '=', or ';' per RFC 5988","Unit-test header round-trips: toString(fromString(h)).equals(h)"],"tags":["http-headers","parsing","jaxrs","link-header"],"backgroundTag":"header-parse-failure","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"}