{"record":{"id":"494e02c0beb06dd0","repo":"apple/pkl","slug":"invalidhttpheadername","errorCode":"invalidHttpHeaderName","errorMessage":"HTTP header `{0}` has invalid syntax.","messagePattern":"HTTP header `(.+?)` has invalid syntax\\.","errorType":"error_code","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"pkl-core/src/main/java/org/pkl/core/util/IoUtils.java","lineNumber":943,"sourceCode":"      }\n    }\n    return false;\n  }\n\n  // keep in sync with stdlib EvaluatorSettings.HttpHeaderName\n  public static void validateHeaderName(String headerName) {\n    if (isReservedHeaderName(headerName)) {\n      throw new IllegalArgumentException(\n          ErrorMessages.create(\"invalidHttpHeaderReserved\", headerName));\n    }\n\n    if (hasReservedHeaderPrefix(headerName)) {\n      throw new IllegalArgumentException(\n          ErrorMessages.create(\"invalidHttpHeaderReservedPrefix\", headerName));\n    }\n\n    if (!headerNameLike.matcher(headerName).matches()) {\n      throw new IllegalArgumentException(ErrorMessages.create(\"invalidHttpHeaderName\", headerName));\n    }\n  }\n\n  public static void validateHeaderValue(String headerValue) {\n    if (!headerValueLike.matcher(headerValue).matches()) {\n      throw new IllegalArgumentException(\n          ErrorMessages.create(\"invalidHttpHeaderValue\", headerValue));\n    }\n    if (headerValue.length() > 4096) {\n      throw new IllegalArgumentException(\n          ErrorMessages.create(\"invalidHttpHeaderValueTooLong\", headerValue));\n    }\n  }\n\n  private static @Nullable String getFilenameExtension(String fileName) {\n    var dotIndex = fileName.lastIndexOf('.');\n    // 0 if hidden file (e.g. `.gitignore`); not an extension\n    if (dotIndex == -1 || dotIndex == 0) {","sourceCodeStart":925,"sourceCodeEnd":961,"githubUrl":"https://github.com/apple/pkl/blob/f3efcbfc9b60d30053b0536d664948d7aa1b8673/pkl-core/src/main/java/org/pkl/core/util/IoUtils.java#L925-L961","documentation":"This error means the HTTP header name failed Pkl's lexical syntax check (headerNameLike regex): valid header names are token characters per RFC 7230 (letters, digits, and select punctuation, no spaces or colons). Thrown from IoUtils.validateHeaderName after reserved checks pass.","triggerScenarios":"Header names containing spaces, colons, non-ASCII characters, or being empty, e.g. externalHttpHeaders[\"My Header\"] = \"value\" or externalHttpHeaders[\"\"] = \"x\".","commonSituations":"Typos in config files (\"Content Type\", \"Accept-Language :\"), programmatically built header maps with empty keys, or headers copied with surrounding whitespace from docs.","solutions":["Fix the header name to a valid RFC 7230 token (no spaces/colons, ASCII token chars only).","Trim surrounding whitespace from the key.","Ensure the key is non-empty."],"exampleFix":"// before\nexternalHttpHeaders {\n  [\"Content Type\"] = \"application/json\"\n}\n// after\nexternalHttpHeaders {\n  [\"Content-Type\"] = \"application/json\"\n}","handlingStrategy":"validation","validationCode":"private static final Pattern TOKEN = Pattern.compile(\"[!#$%&'*+\\\\-.^_`|~0-9A-Za-z]+\");\nif (name == null || !TOKEN.matcher(name).matches()) throw new IllegalArgumentException(\"bad header name: \" + name);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Trim header keys read from config/env files.","Never build header names from unvalidated user input.","Follow RFC 7230 token rules when naming headers."],"tags":["http","validation","syntax"],"backgroundTag":"invalid-argument-format","analyzedSha":"f3efcbfc9b60d30053b0536d664948d7aa1b8673","analyzedAt":"2026-09-08T13:10:45.570Z","contentChangedAt":"2026-09-08T13:10:45.570Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}