@@ -20,7 +20,7 @@ from threading import Lock
2020{ {/compatibleWithPythonLegacyApi} }
2121
2222from urllib.parse import quote
23- from typing import Tuple, Optional, List, Dict, Union{ {#compatibleWithPythonLegacy } }, Any { {/compatibleWithPythonLegacy } }
23+ from typing import Any, Tuple, Optional, List, Dict, Union
2424from pydantic import SecretStr
2525
2626from { {packageName} }.configuration import Configuration
@@ -231,16 +231,36 @@ https://github.com/OpenAPITools/openapi-generator/blob/c84b949df1a9ec04ba75989cb
231231 @property
232232 def user_agent(self):
233233 """User agent for this API client"""
234- return self.default_headers['User-Agent']
234+ for name, value in reversed(self.default_headers.items()):
235+ if name.lower() == 'user-agent':
236+ return value
237+ raise KeyError('User-Agent')
235238
236239 @user_agent.setter
237240 def user_agent(self, value):
238- self.default_headers[ 'User-Agent'] = value
241+ self._set_header(self. default_headers, 'User-Agent', value)
239242
240243 def set_default_header(self, header_name, header_value):
241- self.default_headers[ header_name] = header_value
244+ self._set_header(self. default_headers, header_name, header_value)
242245
243246
247+ @staticmethod
248+ def _set_header(headers: Dict[str, Any], name: str, value: Any) -> None:
249+ """Replace a header case-insensitively, retaining the winning spelling."""
250+ for key in list(headers):
251+ if key.lower() == name.lower():
252+ del headers[key]
253+ headers[name] = value
254+
255+ @classmethod
256+ def _merge_headers(cls, *sources: Optional[Dict[str, Any]]) -> Dict[str, Any]:
257+ """Copy headers; later sources and later entries in each dict win."""
258+ headers: Dict[str, Any] = { }
259+ for source in sources:
260+ for name, value in (source or { } ).items():
261+ cls._set_header(headers, name, value)
262+ return headers
263+
244264 _default = None
245265
246266{ {#useIndependentImplicitClients} }
@@ -321,10 +341,9 @@ https://github.com/OpenAPITools/openapi-generator/blob/c84b949df1a9ec04ba75989cb
321341 config = self.configuration
322342
323343 # header parameters
324- header_params = header_params or { }
325- header_params.update(self.default_headers)
344+ header_params = self._merge_headers(header_params, self.default_headers)
326345 if self.cookie:
327- header_params[ 'Cookie'] = self.cookie
346+ self._set_header( header_params, 'Cookie', self.cookie)
328347 if header_params:
329348 header_params = self.sanitize_for_serialization(header_params)
330349 header_params = dict(
@@ -856,7 +875,11 @@ https://github.com/OpenAPITools/openapi-generator/blob/c84b949df1a9ec04ba75989cb
856875 :param auth_setting: auth settings for the endpoint
857876 """
858877 if auth_setting['in'] == 'cookie':
859- if not 'Cookie' in headers:
878+ for key in list(headers):
879+ if key.lower() == 'cookie':
880+ self._set_header(headers, 'Cookie', headers[key])
881+ break
882+ if not headers.get('Cookie'):
860883 headers['Cookie'] = ""
861884 else:
862885 headers['Cookie'] += "; "
@@ -865,15 +888,16 @@ https://github.com/OpenAPITools/openapi-generator/blob/c84b949df1a9ec04ba75989cb
865888 headers['Cookie'] += f"{ auth_setting[' key' ]} ={ cookie_value} "
866889 elif auth_setting['in'] == 'header':
867890 if auth_setting['type'] != 'http-signature':
868- headers[ auth_setting['key']] = auth_setting['value']
891+ self._set_header( headers, auth_setting['key'], auth_setting['value'])
869892 { {#hasHttpSignatureMethods} }
870893 else:
871894 # The HTTP signature scheme requires multiple HTTP headers
872895 # that are calculated dynamically.
873896 signing_info = self.configuration.signing_info
874897 auth_headers = signing_info.get_http_signature_headers(
875898 resource_path, method, headers, body, queries)
876- headers.update(auth_headers)
899+ for name, value in auth_headers.items():
900+ self._set_header(headers, name, value)
877901 { {/hasHttpSignatureMethods} }
878902 elif auth_setting['in'] == 'query':
879903 queries.append((auth_setting['key'], auth_setting['value']))
0 commit comments