diff --git a/app/v2/notifications/post_notifications.py b/app/v2/notifications/post_notifications.py index 01cf21a56..c5ea8d2b3 100644 --- a/app/v2/notifications/post_notifications.py +++ b/app/v2/notifications/post_notifications.py @@ -232,9 +232,10 @@ def process_sms_or_email_notification( reply_to_text=reply_to_text ) return resp - except botocore.exceptions.ClientError: - # if SQS cannot put the task on the queue, it's probably because the notification body was too long and it - # went over SQS's 256kb message limit. If so, we + except (botocore.exceptions.ClientError, botocore.parsers.ResponseParserError): + # If SQS cannot put the task on the queue, it's probably because the notification body was too long and it + # went over SQS's 256kb message limit. If the body is very large, it may exceed the HTTP max content length; + # the exception we get here isn't handled correctly by botocore - we get a ResponseParserError instead. current_app.logger.info( f'Notification {notification_id} failed to save to high volume queue. Using normal flow instead' ) diff --git a/tests/app/v2/notifications/test_post_notifications.py b/tests/app/v2/notifications/test_post_notifications.py index 7d500d84a..1164eb34f 100644 --- a/tests/app/v2/notifications/test_post_notifications.py +++ b/tests/app/v2/notifications/test_post_notifications.py @@ -1068,13 +1068,21 @@ def test_post_notifications_saves_email_or_sms_to_queue(client, notify_db_sessio assert len(Notification.query.all()) == 0 +@pytest.mark.parametrize("exception", [ + botocore.exceptions.ClientError({'some': 'json'}, 'some opname'), + botocore.parsers.ResponseParserError('exceeded max HTTP body length'), +]) @pytest.mark.parametrize("notification_type", ("email", "sms")) def test_post_notifications_saves_email_or_sms_normally_if_saving_to_queue_fails( - client, notify_db_session, mocker, notification_type + client, + notify_db_session, + mocker, + notification_type, + exception ): save_task = mocker.patch( f"app.celery.tasks.save_api_{notification_type}.apply_async", - side_effect=botocore.exceptions.ClientError({'some': 'json'}, 'some opname') + side_effect=exception, ) mock_send_task = mocker.patch(f'app.celery.provider_tasks.deliver_{notification_type}.apply_async')