From 8609b0a1db5464c57d5abd038293d8af5df6f7cb Mon Sep 17 00:00:00 2001 From: Felix Palta Date: Sun, 4 Dec 2016 23:08:52 +0300 Subject: [PATCH 1/3] Fix divide by zero error in drip It occured when 'numbytes' parameter was set to 0. In this case 'drip' should return 400('Bad request'). --- httpbin/core.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/httpbin/core.py b/httpbin/core.py index e3ca094..0e9a85d 100644 --- a/httpbin/core.py +++ b/httpbin/core.py @@ -468,12 +468,16 @@ def drip(): duration = float(args.get('duration', 2)) numbytes = min(int(args.get('numbytes', 10)),(10 * 1024 * 1024)) # set 10MB limit code = int(args.get('code', 200)) - pause = duration / numbytes delay = float(args.get('delay', 0)) if delay > 0: time.sleep(delay) + if numbytes <= 0: + response = Response('number of bytes must be positive', status=400) + return response + + pause = duration / numbytes def generate_bytes(): for i in xrange(numbytes): yield u"*".encode('utf-8') From bba7dd8ee43a0315f11f6d4dd1e6dfe84efeae46 Mon Sep 17 00:00:00 2001 From: Felix Palta Date: Sun, 4 Dec 2016 23:43:07 +0300 Subject: [PATCH 2/3] Add test for drip with invalid numbytes parameter --- test_httpbin.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test_httpbin.py b/test_httpbin.py index 4f6a322..a567e54 100755 --- a/test_httpbin.py +++ b/test_httpbin.py @@ -231,6 +231,12 @@ class HttpbinTestCase(unittest.TestCase): self.assertEqual(len(response.get_data()), 400) self.assertEqual(response.status_code, 200) + def test_drip_with_invalid_numbytes(self): + for bad_num in -1, 0: + uri = '/drip?numbytes={0}&duration=2&delay=1'.format(bad_num) + response = self.app.get(uri) + self.assertEqual(response.status_code, 400) + def test_drip_with_custom_code(self): response = self.app.get('/drip?numbytes=400&duration=2&code=500') self.assertEqual(response.content_length, 400) From 62fbdd8c11974c4d5df6309117070bdfc04331c2 Mon Sep 17 00:00:00 2001 From: Felix Palta Date: Sun, 4 Dec 2016 23:54:05 +0300 Subject: [PATCH 3/3] Check numbytes parameter before initial delay --- httpbin/core.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/httpbin/core.py b/httpbin/core.py index 0e9a85d..6b0f50d 100644 --- a/httpbin/core.py +++ b/httpbin/core.py @@ -469,14 +469,14 @@ def drip(): numbytes = min(int(args.get('numbytes', 10)),(10 * 1024 * 1024)) # set 10MB limit code = int(args.get('code', 200)) - delay = float(args.get('delay', 0)) - if delay > 0: - time.sleep(delay) - if numbytes <= 0: response = Response('number of bytes must be positive', status=400) return response + delay = float(args.get('delay', 0)) + if delay > 0: + time.sleep(delay) + pause = duration / numbytes def generate_bytes(): for i in xrange(numbytes):