diff --git a/sdk/cosmos/azure-cosmos/CHANGELOG.md b/sdk/cosmos/azure-cosmos/CHANGELOG.md index 011365c27ffc..56a574dca1ad 100644 --- a/sdk/cosmos/azure-cosmos/CHANGELOG.md +++ b/sdk/cosmos/azure-cosmos/CHANGELOG.md @@ -10,6 +10,7 @@ #### Breaking Changes #### Bugs Fixed +* Fixed regression where `user_agent_overwrite` kwarg was not cleaned up properly, causing `TypeError` crash on sync client construction. See [PR 45653](https://github.com/Azure/azure-sdk-for-python/pull/45653) #### Other Changes diff --git a/sdk/cosmos/azure-cosmos/azure/cosmos/_cosmos_client_connection.py b/sdk/cosmos/azure-cosmos/azure/cosmos/_cosmos_client_connection.py index 3ffe52448d14..d1f628c1db31 100644 --- a/sdk/cosmos/azure-cosmos/azure/cosmos/_cosmos_client_connection.py +++ b/sdk/cosmos/azure-cosmos/azure/cosmos/_cosmos_client_connection.py @@ -1,4 +1,4 @@ -# The MIT License (MIT) +# The MIT License (MIT) # Copyright (c) 2014 Microsoft Corporation # Permission is hereby granted, free of charge, to any person obtaining a copy @@ -248,6 +248,7 @@ def __init__( # pylint: disable=too-many-statements ] # after passing in the user_agent into the user agent policy the user_agent is no longer needed kwargs.pop("user_agent", None) + kwargs.pop("user_agent_overwrite", None) transport = kwargs.pop("transport", None) self.pipeline_client: PipelineClient[HttpRequest, HttpResponse] = PipelineClient( diff --git a/sdk/cosmos/azure-cosmos/azure/cosmos/aio/_cosmos_client_connection_async.py b/sdk/cosmos/azure-cosmos/azure/cosmos/aio/_cosmos_client_connection_async.py index f12a8ab50e70..df06a4a554a0 100644 --- a/sdk/cosmos/azure-cosmos/azure/cosmos/aio/_cosmos_client_connection_async.py +++ b/sdk/cosmos/azure-cosmos/azure/cosmos/aio/_cosmos_client_connection_async.py @@ -245,6 +245,7 @@ def __init__( # pylint: disable=too-many-statements ] # after passing in the user_agent into the user agent policy the user_agent is no longer needed kwargs.pop("user_agent", None) + kwargs.pop("user_agent_overwrite", None) transport = kwargs.pop("transport", None) self.pipeline_client: AsyncPipelineClient[HttpRequest, AsyncHttpResponse] = AsyncPipelineClient( diff --git a/sdk/cosmos/azure-cosmos/tests/test_user_agent.py b/sdk/cosmos/azure-cosmos/tests/test_user_agent.py index 41beb3cde109..c57cf09880ce 100644 --- a/sdk/cosmos/azure-cosmos/tests/test_user_agent.py +++ b/sdk/cosmos/azure-cosmos/tests/test_user_agent.py @@ -95,6 +95,22 @@ def _run_case(use_suffix: bool) -> None: _run_case(False) # prefix scenario _run_case(True) # suffix scenario + def test_user_agent_overwrite_does_not_leak_sync(self): + """Regression test: user_agent_overwrite must not leak into the HTTP transport kwargs. + """ + # user_agent + user_agent_overwrite=True at client level + self._check({'user_agent': 'MyApp/1.0', 'user_agent_overwrite': True}) + # user_agent + user_agent_overwrite=False at client level + self._check({'user_agent': 'MyApp/1.0', 'user_agent_overwrite': False}) + # user_agent_suffix + user_agent_overwrite=True at client level + self._check({'user_agent_suffix': 'MyApp/1.0', 'user_agent_overwrite': True}) + # user_agent_suffix + user_agent_overwrite=False at client level + self._check({'user_agent_suffix': 'MyApp/1.0', 'user_agent_overwrite': False}) + # user_agent_overwrite=True alone (no custom user_agent string) + self._check({'user_agent_overwrite': True}) + # user_agent_overwrite=False alone + self._check({'user_agent_overwrite': False}) + if __name__ == '__main__': unittest.main() diff --git a/sdk/cosmos/azure-cosmos/tests/test_user_agent_async.py b/sdk/cosmos/azure-cosmos/tests/test_user_agent_async.py index 507a3f1e81b0..af6cd1ba9486 100644 --- a/sdk/cosmos/azure-cosmos/tests/test_user_agent_async.py +++ b/sdk/cosmos/azure-cosmos/tests/test_user_agent_async.py @@ -84,7 +84,22 @@ async def _run_case(use_suffix: bool): await _run_case(False) await _run_case(True) + async def test_user_agent_overwrite_does_not_leak_async(self): + """Regression test: user_agent_overwrite must not leak into the HTTP transport kwargs. + """ + # user_agent + user_agent_overwrite=True at client level + await self._check({'user_agent': 'MyApp/1.0', 'user_agent_overwrite': True}) + # user_agent + user_agent_overwrite=False at client level + await self._check({'user_agent': 'MyApp/1.0', 'user_agent_overwrite': False}) + # user_agent_suffix + user_agent_overwrite=True at client level + await self._check({'user_agent_suffix': 'MyApp/1.0', 'user_agent_overwrite': True}) + # user_agent_suffix + user_agent_overwrite=False at client level + await self._check({'user_agent_suffix': 'MyApp/1.0', 'user_agent_overwrite': False}) + # user_agent_overwrite=True alone (no custom user_agent string) + await self._check({'user_agent_overwrite': True}) + # user_agent_overwrite=False alone + await self._check({'user_agent_overwrite': False}) + if __name__ == "__main__": unittest.main() -