{"record":{"id":"a85cca4c600db780","repo":"grpc/grpc-java","slug":"header-name-length-must-be-in-range-1-16384","errorCode":null,"errorMessage":"Header name length must be in range [1, 16384): ${length}","messagePattern":"Header name length must be in range \\[1, 16384\\): (.+?)","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"xds/src/main/java/io/grpc/xds/internal/matcher/HeaderMatchInput.java","lineNumber":43,"sourceCode":"import io.grpc.Metadata;\nimport java.util.Locale;\n\n/**\n * MatchInput for extracting HTTP headers.\n */\nfinal class HeaderMatchInput implements MatchInput {\n  private static final BaseEncoding BASE64 = BaseEncoding.base64();\n  private final String headerName;\n  private final Metadata.Key<byte[]> binaryKey;\n  private final Metadata.Key<String> stringKey;\n\n  static final String TYPE_URL =\n      \"type.googleapis.com/envoy.type.matcher.v3.HttpRequestHeaderMatchInput\";\n    \n  HeaderMatchInput(String headerName) {\n    this.headerName = checkNotNull(headerName, \"headerName\");\n    if (headerName.isEmpty() || headerName.length() >= 16384) {\n      throw new IllegalArgumentException(\n          \"Header name length must be in range [1, 16384): \" + headerName.length());\n    }\n    if (!headerName.equals(headerName.toLowerCase(Locale.ROOT))) {\n      throw new IllegalArgumentException(\"Header name must be lowercase: \" + headerName);\n    }\n    try {\n      if (headerName.endsWith(Metadata.BINARY_HEADER_SUFFIX)) {\n        this.binaryKey = Metadata.Key.of(headerName, Metadata.BINARY_BYTE_MARSHALLER);\n        this.stringKey = null;\n      } else {\n        this.binaryKey = null;\n        this.stringKey = Metadata.Key.of(headerName, Metadata.ASCII_STRING_MARSHALLER);\n      }\n    } catch (IllegalArgumentException e) {\n      throw new IllegalArgumentException(\"Invalid header name: \" + headerName, e);\n    }\n  }\n    ","sourceCodeStart":25,"sourceCodeEnd":61,"githubUrl":"https://github.com/grpc/grpc-java/blob/64daddc1f3d1975670f769f3e97bde8b2ba32d25/xds/src/main/java/io/grpc/xds/internal/matcher/HeaderMatchInput.java#L25-L61","documentation":"The HeaderMatchInput constructor validates header names used as xDS HttpRequestHeaderMatchInput: a name must be non-empty and shorter than 16384 characters, matching HTTP header name limits. Names that are empty or too long cannot appear in a valid HTTP request, so the constructor rejects them immediately with IllegalArgumentException and the offending length.","triggerScenarios":"Constructing HeaderMatchInput with \"\" (length 0) or a name whose length() >= 16384; the check is headerName.isEmpty() || headerName.length() >= 16384.","commonSituations":"Config generators emitting empty header-name fields; pathological or corrupted xDS configs; programmatic construction with unvalidated user-supplied header names; truncation/concatenation bugs producing huge strings.","solutions":["Ensure the header name is a valid non-empty HTTP header name, e.g. \"x-user-id\".","Validate length (1..16383) on the config producer before emitting the matcher input.","Catch IllegalArgumentException around HeaderMatchInput construction and reject the config with the root cause."],"exampleFix":"// before\nnew HeaderMatchInput(\"\");\n// after\nif (name == null || name.isEmpty() || name.length() >= 16384) throw new ConfigException(\"bad header name\");\nnew HeaderMatchInput(name);","handlingStrategy":"validation","validationCode":"if (name == null || name.isEmpty() || name.length() >= 16384)\n  throw new IllegalArgumentException(\"header name length must be in [1, 16384)\");","typeGuard":"boolean isValidHeaderNameLength(String name) {\n  return name != null && !name.isEmpty() && name.length() < 16384;\n}","tryCatchPattern":"try { return new HeaderMatchInput(name); }\ncatch (IllegalArgumentException e) { logger.warn(\"bad header name\", e); return null; }","preventionTips":["Validate header names against HTTP limits when configs are authored.","Never emit empty header-name fields from generators.","Fuzz config parsers with empty/oversized names in tests."],"tags":["grpc-xds","header-validation","argument-out-of-range","http"],"backgroundTag":"argument-out-of-range","analyzedSha":"64daddc1f3d1975670f769f3e97bde8b2ba32d25","analyzedAt":"2026-09-08T06:14:57.704Z","contentChangedAt":"2026-09-08T06:14:57.704Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}