aboutsummaryrefslogtreecommitdiffstats
path: root/pydis_site/apps/api
diff options
context:
space:
mode:
authorGravatar Joe Banks <[email protected]>2024-04-01 13:59:16 +0100
committerGravatar GitHub <[email protected]>2024-04-01 13:59:16 +0100
commit5d4e72910b85b0961b33959dfb606d26de69b98a (patch)
tree0ab1f6022c92d903aeb6ca4d9a228c7f01505da1 /pydis_site/apps/api
parentUpdate Python version requirements in contributing guide (#1283) (diff)
parentLog failed webhook attempts to stderr in GitHub Webhook Filter (diff)
Merge pull request #1281 from python-discord/jb3/github-webhook-no-status
Don't propagate the status received from Discord to GitHub Webhook
Diffstat (limited to 'pydis_site/apps/api')
-rw-r--r--pydis_site/apps/api/tests/test_github_webhook_filter.py20
-rw-r--r--pydis_site/apps/api/views.py23
2 files changed, 38 insertions, 5 deletions
diff --git a/pydis_site/apps/api/tests/test_github_webhook_filter.py b/pydis_site/apps/api/tests/test_github_webhook_filter.py
index 8ca60511..649a9e64 100644
--- a/pydis_site/apps/api/tests/test_github_webhook_filter.py
+++ b/pydis_site/apps/api/tests/test_github_webhook_filter.py
@@ -44,8 +44,10 @@ class GitHubWebhookFilterAPITests(APITestCase):
context_mock.read.return_value = b'{"status": "ok"}'
response = self.client.post(url, data=payload, headers=headers)
- self.assertEqual(response.status_code, context_mock.status)
- self.assertEqual(response.headers.get('X-Clacks-Overhead'), 'Joe Armstrong')
+ response_body = response.json()
+ self.assertEqual(response.status_code, 200)
+ self.assertEqual(response_body.get("headers", {}).get("X-Clacks-Overhead"), 'Joe Armstrong')
+ self.assertEqual(response_body.get("original_status"), 299)
def test_rate_limit_is_logged_to_sentry(self):
url = reverse('api:github-webhook-filter', args=('id', 'token'))
@@ -60,3 +62,17 @@ class GitHubWebhookFilterAPITests(APITestCase):
self.client.post(url, data=payload, headers=headers)
logger.warning.assert_called_once()
+
+ def test_other_error_is_logged(self):
+ url = reverse('api:github-webhook-filter', args=('id', 'token'))
+ payload = {}
+ headers = {'X-GitHub-Event': 'pull_request_review'}
+ with (
+ mock.patch('urllib.request.urlopen') as urlopen,
+ mock.patch.object(GitHubWebhookFilterView, "logger") as logger,
+ ):
+ urlopen.side_effect = HTTPError(None, 451, 'Unavailable For Legal Reasons', {}, None)
+ logger.warning = mock.PropertyMock()
+ self.client.post(url, data=payload, headers=headers)
+
+ logger.warning.assert_called_once()
diff --git a/pydis_site/apps/api/views.py b/pydis_site/apps/api/views.py
index 1fa3efc2..a3b0016c 100644
--- a/pydis_site/apps/api/views.py
+++ b/pydis_site/apps/api/views.py
@@ -303,9 +303,26 @@ class GitHubWebhookFilterView(APIView):
(response_status, headers, body) = self.send_webhook(
webhook_id, webhook_token, request.data, dict(request.headers),
)
- headers.pop('Connection', None)
- headers.pop('Content-Length', None)
- return Response(data=body, headers=headers, status=response_status)
+
+ body_decoded = body.decode("utf-8")
+
+ if (
+ not (status.HTTP_200_OK <= response_status < status.HTTP_300_MULTIPLE_CHOICES)
+ and response_status != status.HTTP_429_TOO_MANY_REQUESTS
+ ):
+ self.logger.warning(
+ "Failed to send GitHub webhook to Discord. Response code %d, body: %s",
+ response_status,
+ body_decoded,
+ )
+
+ response_body = {
+ "original_status": response_status,
+ "data": body_decoded,
+ "headers": headers,
+ }
+
+ return Response(response_body)
def send_webhook(
self,