{"record":{"id":"c4112c95aec9a8c6","repo":"apache/iceberg","slug":"header-name-cannot-be-empty","errorCode":null,"errorMessage":"Header name cannot be empty","messagePattern":"Header name cannot be empty","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"core/src/main/java/org/apache/iceberg/rest/HTTPHeaders.java","lineNumber":118,"sourceCode":"                .collect(Collectors.toList()))\n        .build();\n  }\n\n  /** Represents an HTTP header as a name-value pair. */\n  @Value.Style(redactedMask = \"****\", depluralize = true)\n  @Value.Immutable\n  @SuppressWarnings({\"ImmutablesStyle\", \"SafeLoggingPropagation\"})\n  interface HTTPHeader {\n\n    String name();\n\n    @Value.Redacted\n    String value();\n\n    @Value.Check\n    default void check() {\n      if (name().isEmpty()) {\n        throw new IllegalArgumentException(\"Header name cannot be empty\");\n      }\n    }\n\n    static HTTPHeader of(String name, String value) {\n      return ImmutableHTTPHeader.builder().name(name).value(value).build();\n    }\n  }\n}\n","sourceCodeStart":100,"sourceCodeEnd":127,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/core/src/main/java/org/apache/iceberg/rest/HTTPHeaders.java#L100-L127","documentation":"HTTPHeader is an Immutables value type whose @Value.Check rejects headers with an empty name at construction time. Creating an HTTPHeader with name \"\" throws IllegalArgumentException immediately, before any HTTP request is made. This is a fail-fast invariant protecting against malformed HTTP headers.","triggerScenarios":"Calling HTTPHeader.of(\"\", value), ImmutableHTTPHeader.builder().name(\"\")...build(), or programmatically building headers from a map/collection that contains an empty key (e.g. splitting a \"Name: Value\" string that produced an empty name).","commonSituations":"Parsing auth headers from config lines with a stray delimiter; building headers from a properties map where a key was accidentally blank; off-by-one substring when extracting a header name.","solutions":["Fix the code/config that produced the empty header name before constructing HTTPHeader.","Filter or skip entries with blank names when building the header map programmatically.","Validate user-supplied header strings (split on ':' and trim, then reject empty names) before conversion."],"exampleFix":"// before\nHTTPHeaders.from(Maps.filterValues(raw, v -> v != null)); // may contain \"\" key\n// after\nMap<String, String> clean = raw.entrySet().stream()\n    .filter(e -> !e.getKey().isEmpty())\n    .collect(ImmutableMap.toImmutableMap(Map.Entry::getKey, Map.Entry::getValue));","handlingStrategy":"validation","validationCode":"if (name == null || name.isEmpty()) {\n  throw new IllegalArgumentException(\"Header name must be non-empty\");\n}\nHTTPHeader header = HTTPHeader.of(name, value);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Filter blank keys when converting config maps into headers.","Validate 'Name: Value' header strings before parsing them into HTTPHeader.","Construct headers via HTTPHeader.of so the check fails at a clear point."],"tags":["http","headers","validation","immutables"],"backgroundTag":"empty-required-field","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}