From 9dbdf9804f227e456c1838b448ea6018d6868bdd Mon Sep 17 00:00:00 2001 From: CodeName393 Date: Fri, 24 Apr 2026 23:54:24 +0900 Subject: [PATCH 1/2] Fix(session): header handling in session request method Ensure headers are converted to a dictionary if provided. --- unshackle/core/session.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/unshackle/core/session.py b/unshackle/core/session.py index 2529934..81bc5ca 100644 --- a/unshackle/core/session.py +++ b/unshackle/core/session.py @@ -586,6 +586,9 @@ class RnetSession: # Skip retry for non-allowed methods if method_upper not in self.allowed_methods: + if "headers" in kwargs and kwargs["headers"] is not None: + kwargs["headers"] = dict(kwargs["headers"]) + raw_resp = client.request(rnet_method, url, **kwargs) return RnetResponse(raw_resp) @@ -594,6 +597,9 @@ class RnetSession: for attempt in range(self.max_retries + 1): try: + if "headers" in kwargs and kwargs["headers"] is not None: + kwargs["headers"] = dict(kwargs["headers"]) + raw_resp = client.request(rnet_method, url, **kwargs) response = RnetResponse(raw_resp) if response.status_code not in self.status_forcelist: From bddb305c5d5d2db24a68d2e117dc41643ea6c446 Mon Sep 17 00:00:00 2001 From: CodeName393 Date: Sat, 25 Apr 2026 14:53:07 +0900 Subject: [PATCH 2/2] feat(session): Optimize header handling in session requests Removed redundant conversion of headers to dict for requests. --- unshackle/core/session.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/unshackle/core/session.py b/unshackle/core/session.py index 81bc5ca..c51d45b 100644 --- a/unshackle/core/session.py +++ b/unshackle/core/session.py @@ -584,11 +584,12 @@ class RnetSession: if rnet_method is None: raise ValueError(f"Unsupported HTTP method: {method}") + # Convert headers to standard dict once to resolve PyO3 CaseInsensitiveDict rejection. + if kwargs.get("headers") is not None: + kwargs["headers"] = dict(kwargs["headers"]) + # Skip retry for non-allowed methods if method_upper not in self.allowed_methods: - if "headers" in kwargs and kwargs["headers"] is not None: - kwargs["headers"] = dict(kwargs["headers"]) - raw_resp = client.request(rnet_method, url, **kwargs) return RnetResponse(raw_resp) @@ -597,9 +598,6 @@ class RnetSession: for attempt in range(self.max_retries + 1): try: - if "headers" in kwargs and kwargs["headers"] is not None: - kwargs["headers"] = dict(kwargs["headers"]) - raw_resp = client.request(rnet_method, url, **kwargs) response = RnetResponse(raw_resp) if response.status_code not in self.status_forcelist: