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:
Steve Howell
2018-10-11 12:11:52 +00:00
committed by Tim Abbott
parent 8226e13e9c
commit 8379aeee15
2 changed files with 29 additions and 2 deletions

View File

@@ -37,6 +37,13 @@ class GenericOutgoingWebhookService(OutgoingWebhookServiceInterface):
"trigger": event['trigger']}
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],
event: Dict[str, Any]) -> Optional[Dict[str, Any]]:
if "response_not_required" in response_json and response_json['response_not_required']:
@@ -78,6 +85,12 @@ class SlackOutgoingWebhookService(OutgoingWebhookServiceInterface):
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],
event: Dict[str, Any]) -> Optional[Dict[str, Any]]:
if "text" in response_json:
@@ -250,7 +263,10 @@ def do_rest_call(base_url: str,
event: Dict[str, Any],
service_handler: Any) -> None:
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'):
process_success_response(event, service_handler, response)
else:

View File

@@ -10,7 +10,12 @@ from django.test import override_settings
from requests import Response
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.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)
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:
response = ResponseMock(500)