{"record":{"id":"3463071ff348f5e6","repo":"psf/requests","slug":"header-part-header-part-r-from-header-must-b","errorCode":null,"errorMessage":"Header part ({header_part!r}) from {header} must be of type str or bytes, not {type(header_part)}","messagePattern":"Header part \\((.+?)\\) from (.+?) must be of type str or bytes, not (.+?)","errorType":"exception","errorClass":"InvalidHeader","httpStatus":null,"severity":"error","filePath":"src/requests/utils.py","lineNumber":1109,"sourceCode":"    :param header: tuple, in the format (name, value).\n    \"\"\"\n    name, value = header\n    _validate_header_part(header, name, 0)\n    _validate_header_part(header, value, 1)\n\n\ndef _validate_header_part(\n    header: tuple[str | bytes, str | bytes],\n    header_part: str | bytes,\n    header_validator_index: int,\n) -> None:\n    if isinstance(header_part, str):\n        validator = _HEADER_VALIDATORS_STR[header_validator_index]\n    elif isinstance(header_part, bytes):\n        # runtime guard for non-str/bytes input\n        validator = _HEADER_VALIDATORS_BYTE[header_validator_index]\n    else:\n        raise InvalidHeader(\n            f\"Header part ({header_part!r}) from {header} \"\n            f\"must be of type str or bytes, not {type(header_part)}\"\n        )\n\n    if not validator.match(header_part):  # type: ignore[arg-type]\n        header_kind = \"name\" if header_validator_index == 0 else \"value\"\n        raise InvalidHeader(\n            f\"Invalid leading whitespace, reserved character(s), or return \"\n            f\"character(s) in header {header_kind}: {header_part!r}\"\n        )\n\n\ndef urldefragauth(url: str) -> str:\n    \"\"\"\n    Given a url remove the fragment and the authentication part.\n\n    :rtype: str\n    \"\"\"","sourceCodeStart":1091,"sourceCodeEnd":1127,"githubUrl":"https://github.com/psf/requests/blob/8068356288978c4f54661ae6f95afe0e0831885e/src/requests/utils.py#L1091-L1127","documentation":"Raised by _validate_header_part() when a header name or value is neither str nor bytes (e.g., int, float, None, list). This is a runtime type guard — the type system expects str | bytes, but untyped callers can pass other types. It fires during request preparation before the request is sent.","triggerScenarios":"Passing headers={'Content-Length': 123} (int value); headers={None: 'value'} (None key); headers={'X-Count': 3.14} (float); any header dict where name or value is not str or bytes.","commonSituations":"Computed numeric values passed directly as header values without str() conversion; JSON-parsed data used as headers without type coercion; None values from optional config passed through without filtering.","solutions":["Convert all header values to strings: headers={k: str(v) for k, v in headers.items()}.","Filter out None values before setting headers: {k: v for k, v in headers.items() if v is not None}.","Use a helper to normalize header dicts before passing to requests."],"exampleFix":"# before\nrequests.get(url, headers={'Content-Length': 123, 'X-Token': None})\n\n# after\nheaders = {k: str(v) for k, v in {'Content-Length': 123, 'X-Token': None}.items() if v is not None}\nrequests.get(url, headers=headers)","handlingStrategy":"type-guard","validationCode":"clean_headers = {\n    str(k): str(v)\n    for k, v in headers.items()\n    if v is not None\n}\nresp = requests.get(url, headers=clean_headers)","typeGuard":"def has_valid_header_types(headers: dict) -> bool:\n    return all(\n        isinstance(k, (str, bytes)) and isinstance(v, (str, bytes))\n        for k, v in headers.items()\n    )","tryCatchPattern":null,"preventionTips":["Convert all header values to str before passing: {k: str(v) for k, v in headers.items()}.","Filter out None values from header dicts before making requests.","Use type annotations on header construction to catch type issues early."],"tags":["invalid-header","type-error","headers","input-validation","request-preparation"],"backgroundTag":null,"analyzedSha":"8068356288978c4f54661ae6f95afe0e0831885e","analyzedAt":"2026-08-11T20:11:09.238Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}