From 46b5537ddb8b1c36fd920a76bf0ab22e988c57ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lorenzo=20Pe=C3=B1a?= Date: Sat, 20 Jul 2019 01:22:07 -0400 Subject: [PATCH 1/2] Fixed sentry_patched_popen_init regarding args passed as iterators --- sentry_sdk/integrations/stdlib.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/sentry_sdk/integrations/stdlib.py b/sentry_sdk/integrations/stdlib.py index 3b7772ed58..4e65393901 100644 --- a/sentry_sdk/integrations/stdlib.py +++ b/sentry_sdk/integrations/stdlib.py @@ -111,7 +111,7 @@ def getresponse(self, *args, **kwargs): HTTPConnection.getresponse = getresponse -def _init_argument(args, kwargs, name, position, setdefault_callback=None): +def _init_argument(args, kwargs, name, position, setdefault_callback=None, force_setdefault=False): """ given (*args, **kwargs) of a function call, retrieve (and optionally set a default for) an argument by either name or position. @@ -123,11 +123,11 @@ def _init_argument(args, kwargs, name, position, setdefault_callback=None): if name in kwargs: rv = kwargs[name] - if rv is None and setdefault_callback is not None: + if (force_setdefault or rv is None) and setdefault_callback is not None: rv = kwargs[name] = setdefault_callback() elif position < len(args): rv = args[position] - if rv is None and setdefault_callback is not None: + if (force_setdefault or rv is None) and setdefault_callback is not None: rv = args[position] = setdefault_callback() else: rv = setdefault_callback and setdefault_callback() @@ -145,11 +145,21 @@ def sentry_patched_popen_init(self, *a, **kw): if hub.get_integration(StdlibIntegration) is None: return old_popen_init(self, *a, **kw) + # a needs conversion from tuple to list in order to setdefault + a = list(a) + # do not setdefault! args is required by Popen, doing setdefault would # make invalid calls valid - args = _init_argument(a, kw, "args", 0) or [] + args = _init_argument(a, kw, "args", 0) cwd = _init_argument(a, kw, "cwd", 10) + if args is None: + args = [] + elif args is str: + args = [args] + else: # args could be iterator, reinsert as list via forced setdefault + args = _init_argument(a, kw, "args", 0, lambda: list(args), True) + env = None for k, v in hub.iter_trace_propagation_headers(): From 4e2d18e5e362237ead3347efa1d3f7ffbd0cabd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lorenzo=20Pe=C3=B1a?= Date: Sat, 20 Jul 2019 01:47:08 -0400 Subject: [PATCH 2/2] Linting correction --- sentry_sdk/integrations/stdlib.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sentry_sdk/integrations/stdlib.py b/sentry_sdk/integrations/stdlib.py index 4e65393901..abd69818a9 100644 --- a/sentry_sdk/integrations/stdlib.py +++ b/sentry_sdk/integrations/stdlib.py @@ -111,7 +111,9 @@ def getresponse(self, *args, **kwargs): HTTPConnection.getresponse = getresponse -def _init_argument(args, kwargs, name, position, setdefault_callback=None, force_setdefault=False): +def _init_argument( + args, kwargs, name, position, setdefault_callback=None, force_setdefault=False +): """ given (*args, **kwargs) of a function call, retrieve (and optionally set a default for) an argument by either name or position. @@ -157,7 +159,7 @@ def sentry_patched_popen_init(self, *a, **kw): args = [] elif args is str: args = [args] - else: # args could be iterator, reinsert as list via forced setdefault + else: # args could be iterator, reinsert as list via forced setdefault args = _init_argument(a, kw, "args", 0, lambda: list(args), True) env = None