Skip to content

Commit

Permalink
[PR #9366/43deadb2 backport][3.10] Small speed up to update_headers (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
bdraco authored Oct 1, 2024
1 parent 57ce46c commit 8e395a1
Showing 1 changed file with 41 additions and 22 deletions.
63 changes: 41 additions & 22 deletions aiohttp/client_reqrep.py
Original file line number Diff line number Diff line change
Expand Up @@ -431,30 +431,49 @@ def update_headers(self, headers: Optional[LooseHeaders]) -> None:
"""Update request headers."""
self.headers: CIMultiDict[str] = CIMultiDict()

# add host
# Build the host header
if _YARL_SUPPORTS_HOST_SUBCOMPONENT:
netloc = self.url.host_subcomponent
assert netloc is not None
host = self.url.host_subcomponent
# host_subcomponent is None when the URL is a relative URL.
# but we know we do not have a relative URL here.
assert host is not None
else:
netloc = cast(str, self.url.raw_host)
if helpers.is_ipv6_address(netloc):
netloc = f"[{netloc}]"
# See https://github.com/aio-libs/aiohttp/issues/3636.
netloc = netloc.rstrip(".")
if self.url.port is not None and not self.url.is_default_port():
netloc += ":" + str(self.url.port)
self.headers[hdrs.HOST] = netloc

if headers:
if isinstance(headers, (dict, MultiDictProxy, MultiDict)):
headers = headers.items()

for key, value in headers: # type: ignore[misc]
# A special case for Host header
if key.lower() == "host":
self.headers[key] = value
else:
self.headers.add(key, value)
host = cast(str, self.url.raw_host)
if helpers.is_ipv6_address(host):
host = f"[{host}]"

if host[-1] == ".":
# Remove all trailing dots from the netloc as while
# they are valid FQDNs in DNS, TLS validation fails.
# See https://github.com/aio-libs/aiohttp/issues/3636.
# To avoid string manipulation we only call rstrip if
# the last character is a dot.
host = host.rstrip(".")

# If explicit port is not None, it means that the port was
# explicitly specified in the URL. In this case we check
# if its not the default port for the scheme and add it to
# the host header. We check explicit_port first because
# yarl caches explicit_port and its likely to already be
# in the cache and non-default port URLs are far less common.
explicit_port = self.url.explicit_port
if explicit_port is not None and not self.url.is_default_port():
host = f"{host}:{explicit_port}"

self.headers[hdrs.HOST] = host

if not headers:
return

if isinstance(headers, (dict, MultiDictProxy, MultiDict)):
headers = headers.items()

for key, value in headers: # type: ignore[misc]
# A special case for Host header
if key.lower() == "host":
self.headers[key] = value
else:
self.headers.add(key, value)

def update_auto_headers(self, skip_auto_headers: Optional[Iterable[str]]) -> None:
if skip_auto_headers is not None:
Expand Down

0 comments on commit 8e395a1

Please sign in to comment.