diff --git a/sentry_sdk/integrations/wsgi.py b/sentry_sdk/integrations/wsgi.py index 50deae10c5..4feba42fc9 100644 --- a/sentry_sdk/integrations/wsgi.py +++ b/sentry_sdk/integrations/wsgi.py @@ -134,6 +134,11 @@ def __call__(self, environ, start_response): _sentry_start_response, start_response, transaction ), ) + except StopIteration: + if "gunicorn" in environ.get("SERVER_SOFTWARE", ""): + raise + else: + reraise(*_capture_exception()) except BaseException: reraise(*_capture_exception()) finally: diff --git a/tests/integrations/wsgi/test_wsgi.py b/tests/integrations/wsgi/test_wsgi.py index 656fc1757f..a2d101ba85 100644 --- a/tests/integrations/wsgi/test_wsgi.py +++ b/tests/integrations/wsgi/test_wsgi.py @@ -2,7 +2,7 @@ from unittest import mock import pytest -from werkzeug.test import Client +from werkzeug.test import Client, EnvironBuilder import sentry_sdk from sentry_sdk import capture_message @@ -135,6 +135,49 @@ def test_keyboard_interrupt_is_captured(sentry_init, capture_events): assert event["level"] == "error" +def test_stopiteration_is_not_ignored(sentry_init, capture_events, request): + sentry_init(send_default_pii=True) + + def exiting_app(environ, start_response): + raise StopIteration() + + app = SentryWsgiMiddleware(exiting_app) + client = Client(app) + events = capture_events() + + with pytest.raises(StopIteration): + client.get("/") + + (event,) = events + + assert "exception" in event + exc = event["exception"]["values"][-1] + assert exc["type"] == "StopIteration" + assert exc["value"] == "" + assert event["level"] == "error" + + +def test_stopiteration_is_ignored_for_gunicorn(sentry_init, capture_events, request): + sentry_init(send_default_pii=True) + + def exiting_app(environ, start_response): + raise StopIteration() + + app = SentryWsgiMiddleware(exiting_app) + client = Client(app) + events = capture_events() + + with pytest.raises(StopIteration): + builder = EnvironBuilder( + "/", environ_base={"SERVER_SOFTWARE": "gunicorn/23.0.0"} + ) + request = builder.get_request() + builder.close() + client.open(request) + + assert len(events) == 0 + + def test_transaction_with_error( sentry_init, crashing_app, capture_events, DictionaryContaining # noqa:N803 ):