{"record":{"id":"654ee4ecb21e983c","repo":"didi/DoKit","slug":"unexpected-header-name-value","errorCode":null,"errorMessage":"Unexpected header: \" + name + \": \" + value","messagePattern":"Unexpected header: \" \\+ name \\+ \": \" \\+ value","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"Android/dokit/src/main/java/com/didichuxing/doraemonkit/kit/network/common/CommonHeaders.java","lineNumber":178,"sourceCode":"  public static CommonHeaders of(String... namesAndValues) {\n    if (namesAndValues == null) throw new NullPointerException(\"namesAndValues == null\");\n    if (namesAndValues.length % 2 != 0) {\n      throw new IllegalArgumentException(\"Expected alternating header names and values\");\n    }\n\n    // Make a defensive copy and clean it up.\n    namesAndValues = namesAndValues.clone();\n    for (int i = 0; i < namesAndValues.length; i++) {\n      if (namesAndValues[i] == null) throw new IllegalArgumentException(\"Headers cannot be null\");\n      namesAndValues[i] = namesAndValues[i].trim();\n    }\n\n    // Check for malformed headers.\n    for (int i = 0; i < namesAndValues.length; i += 2) {\n      String name = namesAndValues[i];\n      String value = namesAndValues[i + 1];\n      if (name.length() == 0 || name.indexOf('\\0') != -1 || value.indexOf('\\0') != -1) {\n        throw new IllegalArgumentException(\"Unexpected header: \" + name + \": \" + value);\n      }\n    }\n\n    return new CommonHeaders(namesAndValues);\n  }\n\n  /**\n   * Returns headers for the header names and values in the {@link Map}.\n   */\n  public static CommonHeaders of(Map<String, String> headers) {\n    if (headers == null) throw new NullPointerException(\"headers == null\");\n\n    // Make a defensive copy and clean it up.\n    String[] namesAndValues = new String[headers.size() * 2];\n    int i = 0;\n    for (Map.Entry<String, String> header : headers.entrySet()) {\n      if (header.getKey() == null || header.getValue() == null) {\n        throw new IllegalArgumentException(\"Headers cannot be null\");","sourceCodeStart":160,"sourceCodeEnd":196,"githubUrl":"https://github.com/didi/DoKit/blob/626827cddb2feb2f3aee87a52a064b4e5ca2bed4/Android/dokit/src/main/java/com/didichuxing/doraemonkit/kit/network/common/CommonHeaders.java#L160-L196","documentation":"Thrown by CommonHeaders.of(String... namesAndValues) during the malformed-header check: after trimming, a header name is empty or the name or value contains a NUL character ('\\0'). Both conditions would produce unparseable or unsafe header output, mirroring okhttp's Headers validation.","triggerScenarios":"Passing a pair like (\"\", \"gzip\") or a header value containing '\\0' (often from binary data accidentally coerced into a String, or from trimming a string that was all whitespace leaving an empty name).","commonSituations":"Parsing raw header lines into pairs and losing the name when the line has no colon; a header name that consists only of spaces (trim → empty); binary/null-byte payload contamination in mock or replayed network data.","solutions":["Log the offending pair before calling of() so you can see exactly which header is empty or contains '\\0'","Filter out blank names and sanitize values (strip NUL bytes) before constructing the array","Fix the upstream parser that produced an empty name — typically a missing indexOf(':') guard when splitting a header line"],"exampleFix":"// before\nCommonHeaders.of(parsedName, parsedValue); // parsedName == \"\" for lines like \": value\"\n\n// after\nif (parsedName != null && !parsedName.trim().isEmpty() && parsedName.indexOf('\\0') == -1 && parsedValue.indexOf('\\0') == -1) {\n  builder.add(parsedName.trim(), parsedValue.trim());\n}","handlingStrategy":"validation","validationCode":"static boolean isValidHeaderPair(String n, String v) {\n  n = n == null ? \"\" : n.trim();\n  v = v == null ? \"\" : v.trim();\n  return n.length() > 0 && n.indexOf('\\0') == -1 && v.indexOf('\\0') == -1;\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Validate names/values (non-empty after trim, no NUL) before building the array","Guard header-line parsers with a colon check so empty names never reach of()"],"tags":["android","network","headers","validation"],"backgroundTag":null,"analyzedSha":"626827cddb2feb2f3aee87a52a064b4e5ca2bed4","analyzedAt":"2026-08-14T12:45:58.758Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}