{"record":{"id":"b46dac282567a542","repo":"alibaba/Sentinel","slug":"metadata-key-cannot-be-empty","errorCode":null,"errorMessage":"Metadata key cannot be empty","messagePattern":"Metadata key cannot be empty","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"warning","filePath":"sentinel-transport/sentinel-transport-common/src/main/java/com/alibaba/csp/sentinel/command/CommandRequest.java","lineNumber":70,"sourceCode":"        String value = parameters.get(key);\n        return StringUtil.isBlank(value) ? defaultValue : value;\n    }\n\n    public CommandRequest addParam(String key, String value) {\n        if (StringUtil.isBlank(key)) {\n            throw new IllegalArgumentException(\"Parameter key cannot be empty\");\n        }\n        parameters.put(key, value);\n        return this;\n    }\n\n    public Map<String, String> getMetadata() {\n        return metadata;\n    }\n\n    public CommandRequest addMetadata(String key, String value) {\n        if (StringUtil.isBlank(key)) {\n            throw new IllegalArgumentException(\"Metadata key cannot be empty\");\n        }\n        metadata.put(key, value);\n        return this;\n    }\n}\n","sourceCodeStart":52,"sourceCodeEnd":76,"githubUrl":"https://github.com/alibaba/Sentinel/blob/a3f40ba8e900c8489bd520274739f17235a7721c/sentinel-transport/sentinel-transport-common/src/main/java/com/alibaba/csp/sentinel/command/CommandRequest.java#L52-L76","documentation":"CommandRequest.addMetadata rejects blank metadata keys with IllegalArgumentException, mirroring addParam. Metadata carries per-request transport info (e.g. the \"command-target\" entry used by HttpCommandUtils.getTarget to route a request to its handler), so a blank key would corrupt routing. It is populated by command-center request parsers (netty HttpServerHandler, simple-http HttpEventTask).","triggerScenarios":"request.addMetadata(\"\", value) or addMetadata(null, value); most often from custom code copying external header maps into metadata where a header line like \": value\" yields an empty key.","commonSituations":"Forwarding arbitrary HTTP headers into CommandRequest metadata without filtering; parsing bugs in custom transports that split headers on the wrong delimiter; test fixtures with empty header names.","solutions":["Skip blank keys when copying headers: filter with StringUtil.isNotBlank before addMetadata","Fix the header-parsing code that produced an empty name (usually a wrong indexOf(\":\") split)","Only add well-known metadata keys (e.g. HttpCommandUtils.REQUEST_TARGET) in custom transports"],"exampleFix":"// before\nfor (String k : headers.keySet()) {\n    request.addMetadata(k, headers.get(k));\n}\n\n// after\nfor (Map.Entry<String,String> e : headers.entrySet()) {\n    if (StringUtil.isNotBlank(e.getKey())) {\n        request.addMetadata(e.getKey(), e.getValue());\n    }\n}","handlingStrategy":"validation","validationCode":"if (StringUtil.isNotBlank(key)) {\n    request.addMetadata(key, value);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Only add well-known metadata keys in custom transports","Filter header maps for blank keys before copying into CommandRequest"],"tags":["sentinel","transport","http","validation"],"backgroundTag":null,"analyzedSha":"a3f40ba8e900c8489bd520274739f17235a7721c","analyzedAt":"2026-08-14T11:10:30.678Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}