{"record":{"id":"6ac9eae97023fc66","repo":"flowable/flowable-engine","slug":"invalid-header-clause","errorCode":null,"errorMessage":"Invalid header clause: ","messagePattern":"Invalid header clause: ","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-osgi/src/main/java/org/flowable/osgi/HeaderParser.java","lineNumber":48,"sourceCode":" */\npublic class HeaderParser {\n\n    /**\n     * Parse a given OSGi header into a list of paths\n     *\n     * @param header the OSGi header to parse\n     * @return the list of paths extracted from this header\n     */\n    public static List<PathElement> parseHeader(String header) {\n        List<PathElement> elements = new ArrayList<>();\n        if (header == null || header.trim().length() == 0) {\n            return elements;\n        }\n        String[] clauses = header.split(\",\");\n        for (String clause : clauses) {\n            String[] tokens = clause.split(\";\");\n            if (tokens.length < 1) {\n                throw new IllegalArgumentException(\"Invalid header clause: \" + clause);\n            }\n            PathElement elem = new PathElement(tokens[0].trim());\n            elements.add(elem);\n            for (int i = 1; i < tokens.length; i++) {\n                int pos = tokens[i].indexOf('=');\n                if (pos != -1) {\n                    if (pos > 0 && tokens[i].charAt(pos - 1) == ':') {\n                        String name = tokens[i].substring(0, pos - 1).trim();\n                        String value = tokens[i].substring(pos + 1).trim();\n                        elem.addDirective(name, value);\n                    } else {\n                        String name = tokens[i].substring(0, pos).trim();\n                        String value = tokens[i].substring(pos + 1).trim();\n                        elem.addAttribute(name, value);\n                    }\n                } else {\n                    elem = new PathElement(tokens[i].trim());\n                    elements.add(elem);","sourceCodeStart":30,"sourceCodeEnd":66,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-osgi/src/main/java/org/flowable/osgi/HeaderParser.java#L30-L66","documentation":"HeaderParser.parseHeader splits an OSGi-style header value into comma-separated clauses and semicolon-separated tokens, building PathElements. It throws IllegalArgumentException('Invalid header clause: <clause>') when a clause yields no tokens, i.e. the header clause is malformed for the expected syntax.","triggerScenarios":"Passing a malformed header string (e.g. an empty or comma-only clause like \"a,,b\" producing an empty clause) to parseHeader while parsing OSGi resource headers used by the Flowable OSGi extender.","commonSituations":"Bundle manifest headers with stray commas or empty clauses; programmatically assembled header strings with trailing separators; whitespace/formatting mistakes when defining deployment headers.","solutions":["Fix the header value to remove empty/malformed clauses (no leading/trailing/duplicate commas)","Inspect the clause printed in the exception to locate the exact offending fragment","If building headers programmatically, join non-empty parts with ',' and strip empties first"],"exampleFix":"// before\nString header = \"path1;attr=x,,path2\";\n// after\nString header = \"path1;attr=x,path2\"; // no empty clauses","handlingStrategy":"validation","validationCode":"boolean isValidHeader(String header) {\n    if (header == null || header.trim().isEmpty()) return false;\n    for (String clause : header.split(\",\")) {\n        if (clause.trim().isEmpty()) return false; // empty clause -> Invalid header clause\n    }\n    return true;\n}","typeGuard":null,"tryCatchPattern":"try {\n    List<PathElement> elements = HeaderParser.parseHeader(header);\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().startsWith(\"Invalid header clause\")) {\n        logger.error(\"Malformed OSGi header: {}\", header, e);\n    }\n    throw e;\n}","preventionTips":["Trim and filter empty segments when assembling header strings programmatically","Lint manifest headers for stray/trailing commas","Keep header values to the documented OSGi clause syntax (path;attr=value;...)"],"tags":["osgi","parsing","validation"],"backgroundTag":"invalid-argument-format","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-18T11:17:12.947Z"}