diff --git a/httpx/_models.py b/httpx/_models.py index 2d11888254..5bbeebbd3c 100644 --- a/httpx/_models.py +++ b/httpx/_models.py @@ -581,7 +581,8 @@ def encoding(self) -> str: for key, value in self.raw: try: key.decode(encoding) - value.decode(encoding) + if value is not None: + value.decode(encoding) except UnicodeDecodeError: break else: @@ -681,7 +682,12 @@ def get_list(self, key: str, split_commas: bool = False) -> typing.List[str]: def update(self, headers: HeaderTypes = None) -> None: # type: ignore headers = Headers(headers) for key, value in headers.raw: - self[key.decode(headers.encoding)] = value.decode(headers.encoding) + dk = key.decode(headers.encoding) + if value is not None: + self[dk] = value.decode(headers.encoding) + else: + if dk in self: + del self[dk] def copy(self) -> "Headers": return Headers(self, encoding=self.encoding) diff --git a/httpx/_utils.py b/httpx/_utils.py index 072db3f1e8..fe7017084d 100644 --- a/httpx/_utils.py +++ b/httpx/_utils.py @@ -51,9 +51,20 @@ def normalize_header_value( """ Coerce str/bytes into a strictly byte-wise HTTP header value. """ - if isinstance(value, bytes): + if isinstance( + value, + ( + bytes, + bytearray, + memoryview, + ), + ): + return value + if value is None: return value - return value.encode(encoding or "ascii") + if isinstance(value, str): + return value.encode(encoding or "ascii") + raise NotImplementedError def str_query_param(value: "PrimitiveData") -> str: