diff --git a/swift/common/middleware/formpost.py b/swift/common/middleware/formpost.py index 4680cf8f6f..9dee49c902 100644 --- a/swift/common/middleware/formpost.py +++ b/swift/common/middleware/formpost.py @@ -107,7 +107,6 @@ import rfc822 from hashlib import sha1 from StringIO import StringIO from time import gmtime, strftime, time -from time import time from urllib import quote, unquote from swift.common.utils import get_logger, streq_const_time @@ -315,32 +314,29 @@ class FormPost(object): _parse_attrs(env.get('CONTENT_TYPE') or '') if content_type == 'multipart/form-data' and \ 'boundary' in attrs: - resp_status = [0] - - def _start_response(status, headers, exc_info=None): - resp_status[0] = int(status.split(' ', 1)[0]) - start_response(status, headers, exc_info) - - self._log_request(env, resp_status) - return self._translate_form(env, start_response, - attrs['boundary']) + status, headers, body = self._translate_form( + env, attrs['boundary']) + self._log_request(env, int(status.split(' ', 1)[0])) + start_response(status, headers) + return body except (FormInvalid, EOFError), err: self._log_request(env, HTTP_BAD_REQUEST) body = 'FormPost: %s' % err - start_response('400 Bad Request', + start_response( + '400 Bad Request', (('Content-Type', 'text/plain'), ('Content-Length', str(len(body))))) return [body] return self.app(env, start_response) - def _translate_form(self, env, start_response, boundary): + def _translate_form(self, env, boundary): """ Translates the form data into subrequests and issues a response. :param env: The WSGI environment dict. - :param start_response: The WSGI start_response hook. - :returns: Response as per WSGI. + :param boundary: The MIME type boundary to look for. + :returns: status_line, headers_list, body """ key = self._get_key(env) status = message = '' @@ -363,8 +359,8 @@ class FormPost(object): if 'content-type' not in attributes and 'content-type' in hdrs: attributes['content-type'] = \ hdrs['Content-Type'] or 'application/octet-stream' - status, message = self._perform_subrequest(env, start_response, - attributes, fp, key) + status, message = self._perform_subrequest(env, attributes, fp, + key) if status[:1] != '2': break else: @@ -387,29 +383,29 @@ class FormPost(object): body = status if message: body = status + '\r\nFormPost: ' + message.title() - start_response(status, [('Content-Type', 'text/plain'), - ('Content-Length', len(body))]) - return [body] + headers = [('Content-Type', 'text/plain'), + ('Content-Length', len(body))] + return status, headers, body status = status.split(' ', 1)[0] body = '

Click to ' \ 'continue...

' % \ (attributes['redirect'], quote(status), quote(message)) - start_response('303 See Other', - [('Location', '%s?status=%s&message=%s' % - (attributes['redirect'], quote(status), quote(message))), - ('Content-Length', str(len(body)))]) - return [body] + headers = [ + ('Location', '%s?status=%s&message=%s' % ( + attributes['redirect'], quote(status), quote(message))), + ('Content-Length', str(len(body)))] + return '303 See Other', headers, body - def _perform_subrequest(self, env, start_response, attributes, fp, key): + def _perform_subrequest(self, orig_env, attributes, fp, key): """ - Performs the subrequest and returns a new response. + Performs the subrequest and returns the response. - :param env: The WSGI environment dict. - :param start_response: The WSGI start_response hook. + :param orig_env: The WSGI environment dict; will only be used + to form a new env for the subrequest. :param attributes: dict of the attributes of the form so far. :param fp: The file-like object containing the request body. :param key: The account key to validate the signature with. - :returns: Response as per WSGI. + :returns: (status_line, message) """ if not key: return '401 Unauthorized', 'invalid signature' @@ -417,7 +413,7 @@ class FormPost(object): max_file_size = int(attributes.get('max_file_size') or 0) except ValueError: raise FormInvalid('max_file_size not an integer') - subenv = make_pre_authed_env(env, 'PUT', agent=self.agent) + subenv = make_pre_authed_env(orig_env, 'PUT', agent=self.agent) subenv['HTTP_TRANSFER_ENCODING'] = 'chunked' subenv['wsgi.input'] = _CappedFileLikeObject(fp, max_file_size) if subenv['PATH_INFO'][-1] != '/' and \ @@ -435,12 +431,11 @@ class FormPost(object): except ValueError: raise FormInvalid('expired not an integer') hmac_body = '%s\n%s\n%s\n%s\n%s' % ( - env['PATH_INFO'], - attributes.get('redirect') or '', - attributes.get('max_file_size') or '0', - attributes.get('max_file_count') or '0', - attributes.get('expires') or '0' - ) + orig_env['PATH_INFO'], + attributes.get('redirect') or '', + attributes.get('max_file_size') or '0', + attributes.get('max_file_count') or '0', + attributes.get('expires') or '0') sig = hmac.new(key, hmac_body, sha1).hexdigest() if not streq_const_time(sig, (attributes.get('signature') or 'invalid')): diff --git a/test/unit/common/middleware/test_formpost.py b/test/unit/common/middleware/test_formpost.py index cb77dcf871..3c849a0b65 100644 --- a/test/unit/common/middleware/test_formpost.py +++ b/test/unit/common/middleware/test_formpost.py @@ -75,8 +75,9 @@ class FakeApp(object): self.requests.append(Request.blank('', environ=env)) if env.get('swift.authorize_override') and \ env.get('REMOTE_USER') != '.wsgi.pre_authed': - raise Exception('Invalid REMOTE_USER %r with ' - 'swift.authorize_override' % (env.get('REMOTE_USER'),)) + raise Exception( + 'Invalid REMOTE_USER %r with swift.authorize_override' % ( + env.get('REMOTE_USER'),)) if 'swift.authorize' in env: resp = env['swift.authorize'](self.requests[-1]) if resp: @@ -204,8 +205,9 @@ class TestIterRequests(unittest.TestCase): self.assertTrue(exc is not None) def test_readline(self): - it = formpost._iter_requests(StringIO('--unique\r\nab\r\ncd\ref\ng\r\n' - '--unique\r\nhi\r\n\r\njkl\r\n\r\n--unique--'), 'unique') + it = formpost._iter_requests( + StringIO('--unique\r\nab\r\ncd\ref\ng\r\n--unique\r\nhi\r\n\r\n' + 'jkl\r\n\r\n--unique--'), 'unique') fp = it.next() self.assertEquals(fp.readline(), 'ab\r\n') self.assertEquals(fp.readline(), 'cd\ref\ng') @@ -225,8 +227,9 @@ class TestIterRequests(unittest.TestCase): orig_read_chunk_size = formpost.READ_CHUNK_SIZE try: formpost.READ_CHUNK_SIZE = 2 - it = formpost._iter_requests(StringIO('--unique\r\nab\r\ncd\ref\ng' - '\r\n--unique\r\nhi\r\n\r\njkl\r\n\r\n--unique--'), 'unique') + it = formpost._iter_requests( + StringIO('--unique\r\nab\r\ncd\ref\ng\r\n--unique\r\nhi\r\n' + '\r\njkl\r\n\r\n--unique--'), 'unique') fp = it.next() self.assertEquals(fp.readline(), 'ab\r\n') self.assertEquals(fp.readline(), 'cd\ref\ng') @@ -298,8 +301,11 @@ class TestFormPost(unittest.TestCase): def _make_sig_env_body(self, path, redirect, max_file_size, max_file_count, expires, key): - sig = hmac.new(key, '%s\n%s\n%s\n%s\n%s' % (path, redirect, - max_file_size, max_file_count, expires), sha1).hexdigest() + sig = hmac.new( + key, + '%s\n%s\n%s\n%s\n%s' % ( + path, redirect, max_file_size, max_file_count, expires), + sha1).hexdigest() body = [ '------WebKitFormBoundaryNcxTqxSlX7t4TDkR', 'Content-Disposition: form-data; name="redirect"', @@ -323,13 +329,13 @@ class TestFormPost(unittest.TestCase): sig, '------WebKitFormBoundaryNcxTqxSlX7t4TDkR', 'Content-Disposition: form-data; name="file1"; ' - 'filename="testfile1.txt"', + 'filename="testfile1.txt"', 'Content-Type: text/plain', '', 'Test File\nOne\n', '------WebKitFormBoundaryNcxTqxSlX7t4TDkR', 'Content-Disposition: form-data; name="file2"; ' - 'filename="testfile2.txt"', + 'filename="testfile2.txt"', 'Content-Type: text/plain', '', 'Test\nFile\nTwo\n', @@ -344,17 +350,17 @@ class TestFormPost(unittest.TestCase): wsgi_errors = StringIO() env = { 'CONTENT_TYPE': 'multipart/form-data; ' - 'boundary=----WebKitFormBoundaryNcxTqxSlX7t4TDkR', + 'boundary=----WebKitFormBoundaryNcxTqxSlX7t4TDkR', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate', 'HTTP_ACCEPT_LANGUAGE': 'en-us', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;' - 'q=0.9,*/*;q=0.8', + 'q=0.9,*/*;q=0.8', 'HTTP_CONNECTION': 'keep-alive', 'HTTP_HOST': 'ubuntu:8080', 'HTTP_ORIGIN': 'file://', 'HTTP_USER_AGENT': 'Mozilla/5.0 (Macintosh; Intel Mac OS X ' - '10_7_2) AppleWebKit/534.52.7 (KHTML, like Gecko) ' - 'Version/5.1.2 Safari/534.52.7', + '10_7_2) AppleWebKit/534.52.7 (KHTML, like Gecko) ' + 'Version/5.1.2 Safari/534.52.7', 'PATH_INFO': path, 'REMOTE_ADDR': '172.16.83.1', 'REQUEST_METHOD': 'POST', @@ -373,7 +379,8 @@ class TestFormPost(unittest.TestCase): def test_passthrough(self): for method in ('HEAD', 'GET', 'PUT', 'POST', 'DELETE'): - resp = self._make_request('/v1/a/c/o', + resp = self._make_request( + '/v1/a/c/o', environ={'REQUEST_METHOD': method}).get_response(self.formpost) self.assertEquals(resp.status_int, 401) self.assertTrue('FormPost' not in resp.body) @@ -385,8 +392,11 @@ class TestFormPost(unittest.TestCase): max_file_size = 1024 max_file_count = 10 expires = int(time() + 86400) - sig = hmac.new(key, '%s\n%s\n%s\n%s\n%s' % (path, redirect, - max_file_size, max_file_count, expires), sha1).hexdigest() + sig = hmac.new( + key, + '%s\n%s\n%s\n%s\n%s' % ( + path, redirect, max_file_size, max_file_count, expires), + sha1).hexdigest() memcache = FakeMemcache() memcache.set('temp-url-key/AUTH_test', key) wsgi_input = StringIO('\r\n'.join([ @@ -412,13 +422,13 @@ class TestFormPost(unittest.TestCase): sig, '------WebKitFormBoundaryNcxTqxSlX7t4TDkR', 'Content-Disposition: form-data; name="file1"; ' - 'filename="testfile1.txt"', + 'filename="testfile1.txt"', 'Content-Type: text/plain', '', 'Test File\nOne\n', '------WebKitFormBoundaryNcxTqxSlX7t4TDkR', 'Content-Disposition: form-data; name="file2"; ' - 'filename="testfile2.txt"', + 'filename="testfile2.txt"', 'Content-Type: text/plain', '', 'Test\nFile\nTwo\n', @@ -433,17 +443,17 @@ class TestFormPost(unittest.TestCase): wsgi_errors = StringIO() env = { 'CONTENT_TYPE': 'multipart/form-data; ' - 'boundary=----WebKitFormBoundaryNcxTqxSlX7t4TDkR', + 'boundary=----WebKitFormBoundaryNcxTqxSlX7t4TDkR', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate', 'HTTP_ACCEPT_LANGUAGE': 'en-us', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;' - 'q=0.9,*/*;q=0.8', + 'q=0.9,*/*;q=0.8', 'HTTP_CONNECTION': 'keep-alive', 'HTTP_HOST': 'ubuntu:8080', 'HTTP_ORIGIN': 'file://', 'HTTP_USER_AGENT': 'Mozilla/5.0 (Macintosh; Intel Mac OS X ' - '10_7_2) AppleWebKit/534.52.7 (KHTML, like Gecko) ' - 'Version/5.1.2 Safari/534.52.7', + '10_7_2) AppleWebKit/534.52.7 (KHTML, like Gecko) ' + 'Version/5.1.2 Safari/534.52.7', 'PATH_INFO': path, 'REMOTE_ADDR': '172.16.83.1', 'REQUEST_METHOD': 'POST', @@ -496,8 +506,11 @@ class TestFormPost(unittest.TestCase): max_file_size = 1024 max_file_count = 10 expires = int(time() + 86400) - sig = hmac.new(key, '%s\n%s\n%s\n%s\n%s' % (path, redirect, - max_file_size, max_file_count, expires), sha1).hexdigest() + sig = hmac.new( + key, + '%s\n%s\n%s\n%s\n%s' % ( + path, redirect, max_file_size, max_file_count, expires), + sha1).hexdigest() memcache = FakeMemcache() memcache.set('temp-url-key/AUTH_test', key) wsgi_input = StringIO('\r\n'.join([ @@ -523,13 +536,13 @@ class TestFormPost(unittest.TestCase): sig, '-----------------------------168072824752491622650073', 'Content-Disposition: form-data; name="file1"; ' - 'filename="testfile1.txt"', + 'filename="testfile1.txt"', 'Content-Type: text/plain', '', 'Test File\nOne\n', '-----------------------------168072824752491622650073', 'Content-Disposition: form-data; name="file2"; ' - 'filename="testfile2.txt"', + 'filename="testfile2.txt"', 'Content-Type: text/plain', '', 'Test\nFile\nTwo\n', @@ -544,16 +557,16 @@ class TestFormPost(unittest.TestCase): wsgi_errors = StringIO() env = { 'CONTENT_TYPE': 'multipart/form-data; ' - 'boundary=---------------------------168072824752491622650073', + 'boundary=---------------------------168072824752491622650073', 'HTTP_ACCEPT_CHARSET': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate', 'HTTP_ACCEPT_LANGUAGE': 'en-us,en;q=0.5', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;' - 'q=0.9,*/*;q=0.8', + 'q=0.9,*/*;q=0.8', 'HTTP_CONNECTION': 'keep-alive', 'HTTP_HOST': 'ubuntu:8080', 'HTTP_USER_AGENT': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; ' - 'rv:8.0.1) Gecko/20100101 Firefox/8.0.1', + 'rv:8.0.1) Gecko/20100101 Firefox/8.0.1', 'PATH_INFO': '/v1/AUTH_test/container', 'REMOTE_ADDR': '172.16.83.1', 'REQUEST_METHOD': 'POST', @@ -606,8 +619,11 @@ class TestFormPost(unittest.TestCase): max_file_size = 1024 max_file_count = 10 expires = int(time() + 86400) - sig = hmac.new(key, '%s\n%s\n%s\n%s\n%s' % (path, redirect, - max_file_size, max_file_count, expires), sha1).hexdigest() + sig = hmac.new( + key, + '%s\n%s\n%s\n%s\n%s' % ( + path, redirect, max_file_size, max_file_count, expires), + sha1).hexdigest() memcache = FakeMemcache() memcache.set('temp-url-key/AUTH_test', key) wsgi_input = StringIO('\r\n'.join([ @@ -633,13 +649,13 @@ class TestFormPost(unittest.TestCase): sig, '------WebKitFormBoundaryq3CFxUjfsDMu8XsA', 'Content-Disposition: form-data; name="file1"; ' - 'filename="testfile1.txt"', + 'filename="testfile1.txt"', 'Content-Type: text/plain', '', 'Test File\nOne\n', '------WebKitFormBoundaryq3CFxUjfsDMu8XsA', 'Content-Disposition: form-data; name="file2"; ' - 'filename="testfile2.txt"', + 'filename="testfile2.txt"', 'Content-Type: text/plain', '', 'Test\nFile\nTwo\n', @@ -654,19 +670,19 @@ class TestFormPost(unittest.TestCase): wsgi_errors = StringIO() env = { 'CONTENT_TYPE': 'multipart/form-data; ' - 'boundary=----WebKitFormBoundaryq3CFxUjfsDMu8XsA', + 'boundary=----WebKitFormBoundaryq3CFxUjfsDMu8XsA', 'HTTP_ACCEPT_CHARSET': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3', 'HTTP_ACCEPT_ENCODING': 'gzip,deflate,sdch', 'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.8', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;' - 'q=0.9,*/*;q=0.8', + 'q=0.9,*/*;q=0.8', 'HTTP_CACHE_CONTROL': 'max-age=0', 'HTTP_CONNECTION': 'keep-alive', 'HTTP_HOST': 'ubuntu:8080', 'HTTP_ORIGIN': 'null', 'HTTP_USER_AGENT': 'Mozilla/5.0 (Macintosh; Intel Mac OS X ' - '10_7_2) AppleWebKit/535.7 (KHTML, like Gecko) ' - 'Chrome/16.0.912.63 Safari/535.7', + '10_7_2) AppleWebKit/535.7 (KHTML, like Gecko) ' + 'Chrome/16.0.912.63 Safari/535.7', 'PATH_INFO': '/v1/AUTH_test/container', 'REMOTE_ADDR': '172.16.83.1', 'REQUEST_METHOD': 'POST', @@ -719,8 +735,11 @@ class TestFormPost(unittest.TestCase): max_file_size = 1024 max_file_count = 10 expires = int(time() + 86400) - sig = hmac.new(key, '%s\n%s\n%s\n%s\n%s' % (path, redirect, - max_file_size, max_file_count, expires), sha1).hexdigest() + sig = hmac.new( + key, + '%s\n%s\n%s\n%s\n%s' % ( + path, redirect, max_file_size, max_file_count, expires), + sha1).hexdigest() memcache = FakeMemcache() memcache.set('temp-url-key/AUTH_test', key) wsgi_input = StringIO('\r\n'.join([ @@ -746,13 +765,13 @@ class TestFormPost(unittest.TestCase): sig, '-----------------------------7db20d93017c', 'Content-Disposition: form-data; name="file1"; ' - 'filename="C:\\testfile1.txt"', + 'filename="C:\\testfile1.txt"', 'Content-Type: text/plain', '', 'Test File\nOne\n', '-----------------------------7db20d93017c', 'Content-Disposition: form-data; name="file2"; ' - 'filename="C:\\testfile2.txt"', + 'filename="C:\\testfile2.txt"', 'Content-Type: text/plain', '', 'Test\nFile\nTwo\n', @@ -767,7 +786,7 @@ class TestFormPost(unittest.TestCase): wsgi_errors = StringIO() env = { 'CONTENT_TYPE': 'multipart/form-data; ' - 'boundary=---------------------------7db20d93017c', + 'boundary=---------------------------7db20d93017c', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate', 'HTTP_ACCEPT_LANGUAGE': 'en-US', 'HTTP_ACCEPT': 'text/html, application/xhtml+xml, */*', @@ -775,7 +794,7 @@ class TestFormPost(unittest.TestCase): 'HTTP_CONNECTION': 'Keep-Alive', 'HTTP_HOST': '172.16.83.128:8080', 'HTTP_USER_AGENT': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT ' - '6.1; WOW64; Trident/5.0)', + '6.1; WOW64; Trident/5.0)', 'PATH_INFO': '/v1/AUTH_test/container', 'REMOTE_ADDR': '172.16.83.129', 'REQUEST_METHOD': 'POST', @@ -823,8 +842,9 @@ class TestFormPost(unittest.TestCase): def test_messed_up_start(self): key = 'abc' - sig, env, body = self._make_sig_env_body('/v1/AUTH_test/container', - 'http://brim.net', 5, 10, int(time() + 86400), key) + sig, env, body = self._make_sig_env_body( + '/v1/AUTH_test/container', 'http://brim.net', 5, 10, + int(time() + 86400), key) env['wsgi.input'] = StringIO('XX' + '\r\n'.join(body)) env['swift.cache'] = FakeMemcache() env['swift.cache'].set('temp-url-key/AUTH_test', key) @@ -832,6 +852,11 @@ class TestFormPost(unittest.TestCase): ('201 Created', {}, '')])) self.auth = tempauth.filter_factory({})(self.app) self.formpost = formpost.filter_factory({})(self.auth) + + def log_assert_int_status(env, response_status_int): + self.assertTrue(isinstance(response_status_int, int)) + + self.formpost._log_request = log_assert_int_status status = [None] headers = [None] exc_info = [None] @@ -852,8 +877,9 @@ class TestFormPost(unittest.TestCase): def test_max_file_size_exceeded(self): key = 'abc' - sig, env, body = self._make_sig_env_body('/v1/AUTH_test/container', - 'http://brim.net', 5, 10, int(time() + 86400), key) + sig, env, body = self._make_sig_env_body( + '/v1/AUTH_test/container', 'http://brim.net', 5, 10, + int(time() + 86400), key) env['wsgi.input'] = StringIO('\r\n'.join(body)) env['swift.cache'] = FakeMemcache() env['swift.cache'].set('temp-url-key/AUTH_test', key) @@ -881,8 +907,9 @@ class TestFormPost(unittest.TestCase): def test_max_file_count_exceeded(self): key = 'abc' - sig, env, body = self._make_sig_env_body('/v1/AUTH_test/container', - 'http://brim.net', 1024, 1, int(time() + 86400), key) + sig, env, body = self._make_sig_env_body( + '/v1/AUTH_test/container', 'http://brim.net', 1024, 1, + int(time() + 86400), key) env['wsgi.input'] = StringIO('\r\n'.join(body)) env['swift.cache'] = FakeMemcache() env['swift.cache'].set('temp-url-key/AUTH_test', key) @@ -908,7 +935,8 @@ class TestFormPost(unittest.TestCase): for h, v in headers: if h.lower() == 'location': location = v - self.assertEquals(location, + self.assertEquals( + location, 'http://brim.net?status=400&message=max%20file%20count%20exceeded') self.assertEquals(exc_info, None) self.assertTrue( @@ -919,8 +947,9 @@ class TestFormPost(unittest.TestCase): def test_subrequest_fails(self): key = 'abc' - sig, env, body = self._make_sig_env_body('/v1/AUTH_test/container', - 'http://brim.net', 1024, 10, int(time() + 86400), key) + sig, env, body = self._make_sig_env_body( + '/v1/AUTH_test/container', 'http://brim.net', 1024, 10, + int(time() + 86400), key) env['wsgi.input'] = StringIO('\r\n'.join(body)) env['swift.cache'] = FakeMemcache() env['swift.cache'].set('temp-url-key/AUTH_test', key) @@ -957,8 +986,9 @@ class TestFormPost(unittest.TestCase): max_file_size = 1024 max_file_count = 10 expires = int(time() + 86400) - sig, env, body = self._make_sig_env_body('/v1/AUTH_test/container', - redirect, max_file_size, max_file_count, expires, key) + sig, env, body = self._make_sig_env_body( + '/v1/AUTH_test/container', redirect, max_file_size, max_file_count, + expires, key) # Tack on an extra char to redirect, but shouldn't matter since it # should get truncated off on read. redirect += 'b' @@ -985,13 +1015,13 @@ class TestFormPost(unittest.TestCase): sig, '------WebKitFormBoundaryNcxTqxSlX7t4TDkR', 'Content-Disposition: form-data; name="file1"; ' - 'filename="testfile1.txt"', + 'filename="testfile1.txt"', 'Content-Type: text/plain', '', 'Test File\nOne\n', '------WebKitFormBoundaryNcxTqxSlX7t4TDkR', 'Content-Disposition: form-data; name="file2"; ' - 'filename="testfile2.txt"', + 'filename="testfile2.txt"', 'Content-Type: text/plain', '', 'Test\nFile\nTwo\n', @@ -1027,7 +1057,8 @@ class TestFormPost(unittest.TestCase): for h, v in headers: if h.lower() == 'location': location = v - self.assertEquals(location, + self.assertEquals( + location, ('a' * formpost.MAX_VALUE_LENGTH) + '?status=201&message=') self.assertEquals(exc_info, None) self.assertTrue( @@ -1042,8 +1073,9 @@ class TestFormPost(unittest.TestCase): max_file_size = 1024 max_file_count = 10 expires = int(time() + 86400) - sig, env, body = self._make_sig_env_body('/v1/AUTH_test/container', - redirect, max_file_size, max_file_count, expires, key) + sig, env, body = self._make_sig_env_body( + '/v1/AUTH_test/container', redirect, max_file_size, max_file_count, + expires, key) env['wsgi.input'] = StringIO('\r\n'.join([ '------WebKitFormBoundaryNcxTqxSlX7t4TDkR', 'Content-Disposition: form-data; name="redirect"', @@ -1092,7 +1124,8 @@ class TestFormPost(unittest.TestCase): for h, v in headers: if h.lower() == 'location': location = v - self.assertEquals(location, + self.assertEquals( + location, 'http://brim.net?status=400&message=no%20files%20to%20process') self.assertEquals(exc_info, None) self.assertTrue(