{"record":{"id":"b9001052b16899ec","repo":"sgl-project/sglang","slug":"invalid-x-data-parallel-rank-header-must-be-an-in","errorCode":null,"errorMessage":"Invalid X-Data-Parallel-Rank header: must be an integer, got '{header_value}'","messagePattern":"Invalid X-Data-Parallel-Rank header: must be an integer, got '(.+?)'","errorType":"http","errorClass":"HTTPException","httpStatus":400,"severity":"error","filePath":"python/sglang/srt/entrypoints/openai/serving_base.py","lineNumber":288,"sourceCode":"        \"\"\"\n        if raw_request is None:\n            return body_routed_dp_rank\n\n        header_value = raw_request.headers.get(\"x-data-parallel-rank\")\n        if header_value is not None:\n            try:\n                header_dp_rank = int(header_value)\n                if (\n                    body_routed_dp_rank is not None\n                    and header_dp_rank != body_routed_dp_rank\n                ):\n                    logger.debug(\n                        f\"X-Data-Parallel-Rank header ({header_dp_rank}) overrides \"\n                        f\"body routed_dp_rank ({body_routed_dp_rank})\"\n                    )\n                return header_dp_rank\n            except ValueError:\n                raise HTTPException(\n                    status_code=400,\n                    detail=f\"Invalid X-Data-Parallel-Rank header: must be an integer, got '{header_value}'\",\n                )\n\n        return body_routed_dp_rank\n","sourceCodeStart":270,"sourceCodeEnd":294,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/entrypoints/openai/serving_base.py#L270-L294","documentation":"OpenAIServingBase.extract_routed_dp_rank_from_header raises HTTP 400 when the X-Data-Parallel-Rank request header is present but not parseable as an integer. The header is used to pin requests to a specific data-parallel rank and overrides the body's routed_dp_rank.","triggerScenarios":"Any /v1/... request with header X-Data-Parallel-Rank: \"abc\" or \"1.5\" (non-integer string), while the router feature is enabled.","commonSituations":"Load balancers or proxies appending stringified floats; clients passing rank names like 'rank-0'; misconfigured HTTP clients sending the header with whitespace/quotes.","solutions":["Send an integer string, e.g. X-Data-Parallel-Rank: 3","Omit the header and set routed_dp_rank in the JSON body instead","Strip the header at the proxy if you don't intend per-rank routing"],"exampleFix":"# before\nX-Data-Parallel-Rank: rank-1\n# after\nX-Data-Parallel-Rank: 1","handlingStrategy":"validation","validationCode":"v = headers.get(\"X-Data-Parallel-Rank\")\nif v is not None:\n    int(v)  # raises if invalid; fix or drop before sending","typeGuard":"def valid_dp_rank_header(v): \n    try: int(v); return True\n    except (TypeError, ValueError): return False","tryCatchPattern":"except HTTPError as e:\n    if e.response.status_code == 400 and 'X-Data-Parallel-Rank' in e.response.text: headers.pop('X-Data-Parallel-Rank'); retry()","preventionTips":["Only send the header as a plain integer string","Strip unknown headers at proxy level"],"tags":["http-header","data-parallel","routing","sglang"],"backgroundTag":"invalid-http-header","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}