mirror of
https://github.com/zulip/zulip.git
synced 2025-11-05 22:43:42 +00:00
outgoing bots: Fix header for generic servers.
For our bots that use GenericOutgoingWebhookService (which are basically Zulip style bots), we now include a "content-type" header of "application/json". We accomplish this by having the service classes implement their own custom method called `send_data_to_server`. For the Slack-related code, we just extracted code from `do_rest_call`, and then for the Zulip-related code, we added a `headers` parameter.
This commit is contained in:
@@ -37,6 +37,13 @@ class GenericOutgoingWebhookService(OutgoingWebhookServiceInterface):
|
|||||||
"trigger": event['trigger']}
|
"trigger": event['trigger']}
|
||||||
return json.dumps(request_data)
|
return json.dumps(request_data)
|
||||||
|
|
||||||
|
def send_data_to_server(self,
|
||||||
|
base_url: str,
|
||||||
|
request_data: Any) -> Response:
|
||||||
|
headers = {'content-type': 'application/json'}
|
||||||
|
response = requests.request('POST', base_url, data=request_data, headers=headers)
|
||||||
|
return response
|
||||||
|
|
||||||
def process_success(self, response_json: Dict[str, Any],
|
def process_success(self, response_json: Dict[str, Any],
|
||||||
event: Dict[str, Any]) -> Optional[Dict[str, Any]]:
|
event: Dict[str, Any]) -> Optional[Dict[str, Any]]:
|
||||||
if "response_not_required" in response_json and response_json['response_not_required']:
|
if "response_not_required" in response_json and response_json['response_not_required']:
|
||||||
@@ -78,6 +85,12 @@ class SlackOutgoingWebhookService(OutgoingWebhookServiceInterface):
|
|||||||
|
|
||||||
return request_data
|
return request_data
|
||||||
|
|
||||||
|
def send_data_to_server(self,
|
||||||
|
base_url: str,
|
||||||
|
request_data: Any) -> Response:
|
||||||
|
response = requests.request('POST', base_url, data=request_data)
|
||||||
|
return response
|
||||||
|
|
||||||
def process_success(self, response_json: Dict[str, Any],
|
def process_success(self, response_json: Dict[str, Any],
|
||||||
event: Dict[str, Any]) -> Optional[Dict[str, Any]]:
|
event: Dict[str, Any]) -> Optional[Dict[str, Any]]:
|
||||||
if "text" in response_json:
|
if "text" in response_json:
|
||||||
@@ -250,7 +263,10 @@ def do_rest_call(base_url: str,
|
|||||||
event: Dict[str, Any],
|
event: Dict[str, Any],
|
||||||
service_handler: Any) -> None:
|
service_handler: Any) -> None:
|
||||||
try:
|
try:
|
||||||
response = requests.request('POST', base_url, data=request_data)
|
response = service_handler.send_data_to_server(
|
||||||
|
base_url=base_url,
|
||||||
|
request_data=request_data,
|
||||||
|
)
|
||||||
if str(response.status_code).startswith('2'):
|
if str(response.status_code).startswith('2'):
|
||||||
process_success_response(event, service_handler, response)
|
process_success_response(event, service_handler, response)
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -10,7 +10,12 @@ from django.test import override_settings
|
|||||||
from requests import Response
|
from requests import Response
|
||||||
from typing import Any, Dict, Tuple, Optional
|
from typing import Any, Dict, Tuple, Optional
|
||||||
|
|
||||||
from zerver.lib.outgoing_webhook import do_rest_call, GenericOutgoingWebhookService
|
from zerver.lib.outgoing_webhook import (
|
||||||
|
do_rest_call,
|
||||||
|
GenericOutgoingWebhookService,
|
||||||
|
SlackOutgoingWebhookService,
|
||||||
|
)
|
||||||
|
|
||||||
from zerver.lib.test_classes import ZulipTestCase
|
from zerver.lib.test_classes import ZulipTestCase
|
||||||
from zerver.models import get_realm, get_user, UserProfile, get_display_recipient
|
from zerver.models import get_realm, get_user, UserProfile, get_display_recipient
|
||||||
|
|
||||||
@@ -59,6 +64,12 @@ class DoRestCallTests(ZulipTestCase):
|
|||||||
do_rest_call('', None, self.mock_event, service_handler)
|
do_rest_call('', None, self.mock_event, service_handler)
|
||||||
self.assertTrue(mock_send.called)
|
self.assertTrue(mock_send.called)
|
||||||
|
|
||||||
|
for service_class in [GenericOutgoingWebhookService, SlackOutgoingWebhookService]:
|
||||||
|
handler = service_class(None, None, None)
|
||||||
|
with mock.patch('requests.request', return_value=response):
|
||||||
|
do_rest_call('', None, self.mock_event, handler)
|
||||||
|
self.assertTrue(mock_send.called)
|
||||||
|
|
||||||
def test_retry_request(self: mock.Mock) -> None:
|
def test_retry_request(self: mock.Mock) -> None:
|
||||||
response = ResponseMock(500)
|
response = ResponseMock(500)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user