@@ -663,7 +663,7 @@ class HttpRequestTemplate:
663663 static_prefix: Pre-merged request line + host header bytes
664664 """
665665
666- __slots__ = ("static_prefix" , "_extra_headers_cache" , "extra_cached_headers " )
666+ __slots__ = ("static_prefix" , "cached_headers " )
667667
668668 # Pre-encoded general headers
669669 HEADERS_STREAMING = (
@@ -675,8 +675,7 @@ class HttpRequestTemplate:
675675
676676 def __init__ (self , static_prefix : bytes ):
677677 self .static_prefix = static_prefix
678- self ._extra_headers_cache : dict [frozenset , bytes ] = {}
679- self .extra_cached_headers = b""
678+ self .cached_headers = b""
680679
681680 @classmethod
682681 def from_url (cls , host : str , port : int , path : str = "/" ) -> HttpRequestTemplate :
@@ -706,20 +705,14 @@ def from_url(cls, host: str, port: int, path: str = "/") -> HttpRequestTemplate:
706705
707706 def cache_headers (self , headers : dict [str , str ]) -> None :
708707 """
709- Pre-cache extra headers to avoid first-call encoding overhead.
710-
711- Call this during setup to prime the cache for headers that will be
712- used repeatedly at runtime.
708+ Pre-encode extra headers during setup to avoid encoding in the hotpath.
713709
714710 Args:
715711 headers: Headers to pre-encode and cache
716712 """
717- cache_key = frozenset (headers .items ())
718- if cache_key not in self ._extra_headers_cache :
719- self ._extra_headers_cache [cache_key ] = "" .join (
720- f"{ k } : { v } \r \n " for k , v in headers .items ()
721- ).encode ("utf-8" , "surrogateescape" )
722- self .extra_cached_headers = b"" .join (self ._extra_headers_cache .values ())
713+ self .cached_headers += "" .join (
714+ f"{ k } : { v } \r \n " for k , v in headers .items ()
715+ ).encode ("utf-8" , "surrogateescape" )
723716
724717 def build_request (
725718 self ,
@@ -748,25 +741,22 @@ def build_request(
748741 return b"" .join (
749742 [
750743 self .static_prefix ,
751- self .extra_cached_headers ,
744+ self .cached_headers ,
752745 content_type_headers ,
753746 content_length ,
754747 body ,
755748 ]
756749 )
757750
758- # Slow path: extra headers (~1us uncached, ~50ns per extra-header cached)
759- cache_key = frozenset (extra_headers .items ())
760- if (extra := self ._extra_headers_cache .get (cache_key )) is None :
761- extra = "" .join (f"{ k } : { v } \r \n " for k , v in extra_headers .items ()).encode (
762- "utf-8" , "surrogateescape"
763- )
764- self ._extra_headers_cache [cache_key ] = extra
765-
751+ # Slow path: extra headers are encoded per-call;
752+ # use cache_headers() at setup time for headers that repeat every request.
753+ extra = "" .join (f"{ k } : { v } \r \n " for k , v in extra_headers .items ()).encode (
754+ "utf-8" , "surrogateescape"
755+ )
766756 return b"" .join (
767757 [
768758 self .static_prefix ,
769- self .extra_cached_headers ,
759+ self .cached_headers ,
770760 content_type_headers ,
771761 extra ,
772762 content_length ,
0 commit comments