From e8b53e24e3099815d76b876534ce2d399485beac Mon Sep 17 00:00:00 2001 From: Jeremy Thurgood Date: Mon, 15 Dec 2014 18:16:48 +0200 Subject: [PATCH] Config UI for HTTP API message length limit. --- go/apps/http_api/tests/test_views.py | 58 ++++++++++++++++++- go/apps/http_api/view_definition.py | 6 ++ go/apps/http_api_nostream/tests/test_views.py | 55 ++++++++++++++++++ go/apps/http_api_nostream/view_definition.py | 6 ++ 4 files changed, 122 insertions(+), 3 deletions(-) diff --git a/go/apps/http_api/tests/test_views.py b/go/apps/http_api/tests/test_views.py index 0ce9ddf89..732fd50ab 100644 --- a/go/apps/http_api/tests/test_views.py +++ b/go/apps/http_api/tests/test_views.py @@ -46,7 +46,7 @@ def test_edit_view(self): 'metric_store': 'foo_metric_store', 'ignore_events': False, 'ignore_messages': False, - + 'content_length_limit': None, } }) @@ -70,7 +70,7 @@ def test_edit_view_no_event_url(self): 'metric_store': 'foo_metric_store', 'ignore_events': False, 'ignore_messages': False, - + 'content_length_limit': None, } }) self.assertEqual(conversation.config, {}) @@ -99,10 +99,62 @@ def test_edit_view_no_push_urls(self): 'metric_store': 'foo_metric_store', 'ignore_events': False, 'ignore_messages': False, - + 'content_length_limit': None, } }) self.assertEqual(conversation.config, {}) response = self.client.get(conv_helper.get_view_url('edit')) self.assertContains(response, 'foo_metric_store') self.assertEqual(response.status_code, 200) + + def test_edit_view_content_length_limit(self): + conv_helper = self.app_helper.create_conversation_helper() + conversation = conv_helper.get_conversation() + self.assertEqual(conversation.config, {}) + response = self.client.post(conv_helper.get_view_url('edit'), { + 'http_api-api_tokens': 'token', + 'http_api-push_message_url': 'http://messages/', + 'http_api-push_event_url': 'http://events/', + 'http_api-metric_store': 'foo_metric_store', + 'http_api-content_length_limit': '160', + }) + self.assertRedirects(response, conv_helper.get_view_url('show')) + + reloaded_conv = conv_helper.get_conversation() + self.assertEqual(reloaded_conv.config, { + 'http_api': { + 'push_event_url': 'http://events/', + 'push_message_url': 'http://messages/', + 'api_tokens': ['token'], + 'metric_store': 'foo_metric_store', + 'ignore_events': False, + 'ignore_messages': False, + 'content_length_limit': 160, + } + }) + + # Now unset the limit + response = self.client.get(conv_helper.get_view_url('edit')) + self.assertContains(response, '160') + self.assertEqual(response.status_code, 200) + response = self.client.post(conv_helper.get_view_url('edit'), { + 'http_api-api_tokens': 'token', + 'http_api-push_message_url': 'http://messages/', + 'http_api-push_event_url': 'http://events/', + 'http_api-metric_store': 'foo_metric_store', + 'http_api-content_length_limit': '', + }) + self.assertRedirects(response, conv_helper.get_view_url('show')) + + reloaded_conv = conv_helper.get_conversation() + self.assertEqual(reloaded_conv.config, { + 'http_api': { + 'push_event_url': 'http://events/', + 'push_message_url': 'http://messages/', + 'api_tokens': ['token'], + 'metric_store': 'foo_metric_store', + 'ignore_events': False, + 'ignore_messages': False, + 'content_length_limit': None, + } + }) diff --git a/go/apps/http_api/view_definition.py b/go/apps/http_api/view_definition.py index 27e9e1fc5..1357820cd 100644 --- a/go/apps/http_api/view_definition.py +++ b/go/apps/http_api/view_definition.py @@ -24,6 +24,10 @@ class TokenForm(forms.Form): metric_store = forms.CharField( help_text='Which store to publish metrics to.', required=False) + content_length_limit = forms.IntegerField( + help_text=('Optional content length limit. If set, messages with' + ' content longer than this will be rejected.'), + required=False) @staticmethod def initial_from_config(data): @@ -34,6 +38,7 @@ def initial_from_config(data): 'push_message_url': data.get('push_message_url', None), 'push_event_url': data.get('push_event_url', None), 'metric_store': data.get('metric_store', DEFAULT_METRIC_STORE), + 'content_length_limit': data.get('content_length_limit', None), } def to_config(self): @@ -43,6 +48,7 @@ def to_config(self): 'push_message_url': data['push_message_url'] or None, 'push_event_url': data['push_event_url'] or None, 'metric_store': data.get('metric_store') or DEFAULT_METRIC_STORE, + 'content_length_limit': data.get('content_length_limit', None), # The worker code checks these, but we don't provide config UI for # them. They should always be False. 'ignore_events': False, diff --git a/go/apps/http_api_nostream/tests/test_views.py b/go/apps/http_api_nostream/tests/test_views.py index 518841e34..f557dd72b 100644 --- a/go/apps/http_api_nostream/tests/test_views.py +++ b/go/apps/http_api_nostream/tests/test_views.py @@ -46,6 +46,7 @@ def test_edit_view(self): 'metric_store': 'foo_metric_store', 'ignore_events': False, 'ignore_messages': False, + 'content_length_limit': None, } }) self.assertEqual(conversation.config, {}) @@ -94,6 +95,7 @@ def test_edit_view_ignore_messages(self): 'metric_store': 'foo_metric_store', 'ignore_events': False, 'ignore_messages': True, + 'content_length_limit': None, } }) self.assertEqual(conversation.config, {}) @@ -122,6 +124,7 @@ def test_edit_view_ignore_events(self): 'metric_store': 'foo_metric_store', 'ignore_events': True, 'ignore_messages': False, + 'content_length_limit': None, } }) self.assertEqual(conversation.config, {}) @@ -129,6 +132,58 @@ def test_edit_view_ignore_events(self): self.assertContains(response, 'foo_metric_store') self.assertEqual(response.status_code, 200) + def test_edit_view_content_length_limit(self): + conv_helper = self.app_helper.create_conversation_helper() + conversation = conv_helper.get_conversation() + self.assertEqual(conversation.config, {}) + response = self.client.post(conv_helper.get_view_url('edit'), { + 'http_api_nostream-api_tokens': 'token', + 'http_api_nostream-push_message_url': 'http://messages/', + 'http_api_nostream-push_event_url': 'http://events/', + 'http_api_nostream-metric_store': 'foo_metric_store', + 'http_api_nostream-content_length_limit': '160', + }) + self.assertRedirects(response, conv_helper.get_view_url('show')) + + reloaded_conv = conv_helper.get_conversation() + self.assertEqual(reloaded_conv.config, { + 'http_api_nostream': { + 'push_event_url': 'http://events/', + 'push_message_url': 'http://messages/', + 'api_tokens': ['token'], + 'metric_store': 'foo_metric_store', + 'ignore_events': False, + 'ignore_messages': False, + 'content_length_limit': 160, + } + }) + + # Now unset the limit + response = self.client.get(conv_helper.get_view_url('edit')) + self.assertContains(response, '160') + self.assertEqual(response.status_code, 200) + response = self.client.post(conv_helper.get_view_url('edit'), { + 'http_api_nostream-api_tokens': 'token', + 'http_api_nostream-push_message_url': 'http://messages/', + 'http_api_nostream-push_event_url': 'http://events/', + 'http_api_nostream-metric_store': 'foo_metric_store', + 'http_api_nostream-content_length_limit': '', + }) + self.assertRedirects(response, conv_helper.get_view_url('show')) + + reloaded_conv = conv_helper.get_conversation() + self.assertEqual(reloaded_conv.config, { + 'http_api_nostream': { + 'push_event_url': 'http://events/', + 'push_message_url': 'http://messages/', + 'api_tokens': ['token'], + 'metric_store': 'foo_metric_store', + 'ignore_events': False, + 'ignore_messages': False, + 'content_length_limit': None, + } + }) + def test_get_edit_view_no_config(self): conv_helper = self.app_helper.create_conversation_helper() conversation = conv_helper.get_conversation() diff --git a/go/apps/http_api_nostream/view_definition.py b/go/apps/http_api_nostream/view_definition.py index 6c3cffd3c..2ba188dcf 100644 --- a/go/apps/http_api_nostream/view_definition.py +++ b/go/apps/http_api_nostream/view_definition.py @@ -25,6 +25,10 @@ class TokenForm(forms.Form): metric_store = forms.CharField( help_text='Which store to publish metrics to.', required=False) + content_length_limit = forms.IntegerField( + help_text=('Optional content length limit. If set, messages with' + ' content longer than this will be rejected.'), + required=False) def clean(self): cleaned_data = super(TokenForm, self).clean() @@ -54,6 +58,7 @@ def initial_from_config(data): 'metric_store': data.get('metric_store', DEFAULT_METRIC_STORE), 'ignore_events': data.get('ignore_events', False), 'ignore_messages': data.get('ignore_messages', False), + 'content_length_limit': data.get('content_length_limit', None), } def to_config(self): @@ -65,6 +70,7 @@ def to_config(self): 'metric_store': data.get('metric_store') or DEFAULT_METRIC_STORE, 'ignore_events': data.get('ignore_events', False), 'ignore_messages': data.get('ignore_messages', False), + 'content_length_limit': data.get('content_length_limit', None), }