From 475108b784043557598f6f25741f9e25ec48e29e Mon Sep 17 00:00:00 2001 From: Steve Howell Date: Wed, 9 Jan 2019 14:29:17 +0000 Subject: [PATCH] outgoing webhooks: Set a Zulip-specific user-agent. This now sets the user-agent to something like: ZulipOutgoingWebhook/2.0 (It uses the current ZULIP_VERSION.) Before this change, the user-agent would be something like `python-requests/2.18.4`. Fixes #10741 --- zerver/lib/outgoing_webhook.py | 8 +++++++- zerver/tests/test_outgoing_webhook_system.py | 15 +++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/zerver/lib/outgoing_webhook.py b/zerver/lib/outgoing_webhook.py index 307705fd20..d222863950 100644 --- a/zerver/lib/outgoing_webhook.py +++ b/zerver/lib/outgoing_webhook.py @@ -21,6 +21,8 @@ from zerver.lib.url_encoding import near_message_url from zerver.lib.validator import check_dict, check_string from zerver.decorator import JsonableError +from version import ZULIP_VERSION + class OutgoingWebhookServiceInterface: def __init__(self, token: str, user_profile: UserProfile, service_name: str) -> None: @@ -41,7 +43,11 @@ class GenericOutgoingWebhookService(OutgoingWebhookServiceInterface): def send_data_to_server(self, base_url: str, request_data: Any) -> Response: - headers = {'content-type': 'application/json'} + user_agent = 'ZulipOutgoingWebhook/' + ZULIP_VERSION + headers = { + 'content-type': 'application/json', + 'User-Agent': user_agent, + } response = requests.request('POST', base_url, data=request_data, headers=headers) return response diff --git a/zerver/tests/test_outgoing_webhook_system.py b/zerver/tests/test_outgoing_webhook_system.py index fc0a73b0e9..5c19547004 100644 --- a/zerver/tests/test_outgoing_webhook_system.py +++ b/zerver/tests/test_outgoing_webhook_system.py @@ -20,6 +20,8 @@ from zerver.lib.test_classes import ZulipTestCase from zerver.lib.topic import TOPIC_NAME from zerver.models import get_realm, get_user, UserProfile, get_display_recipient +from version import ZULIP_VERSION + class ResponseMock: def __init__(self, status_code: int, content: Optional[Any]=None) -> None: self.status_code = status_code @@ -96,6 +98,19 @@ The webhook got a response with status code *500*.''') The webhook got a response with status code *400*.''') self.assertEqual(bot_owner_notification.recipient_id, self.bot_user.bot_owner.id) + def test_headers(self) -> None: + with mock.patch('requests.request') as mock_request: + do_rest_call('', 'payload-stub', self.mock_event, service_handler) + kwargs = mock_request.call_args[1] + self.assertEqual(kwargs['data'], 'payload-stub') + + user_agent = 'ZulipOutgoingWebhook/' + ZULIP_VERSION + headers = { + 'content-type': 'application/json', + 'User-Agent': user_agent, + } + self.assertEqual(kwargs['headers'], headers) + def test_error_handling(self) -> None: def helper(side_effect: Any, error_text: str) -> None: with mock.patch('logging.info'):