Replace StringIO with BytesIO for WSGI input

wsgi.input is a binary stream (bytes), not a text stream (unicode).

* Replace StringIO with BytesIO for WSGI input
* Replace StringIO('') with StringIO() and replace WsgiStringIO('') with
  WsgiStringIO(): an empty string is already the default value

Change-Id: I09c9527be2265a6847189aeeb74a17261ddc781a
This commit is contained in:
Victor Stinner 2015-05-27 18:01:37 +02:00
parent 6e70f3fa32
commit 8753e452b0
13 changed files with 158 additions and 121 deletions

View File

@ -147,11 +147,12 @@ metadata which can be used for stats purposes.
""" """
from six.moves import range from six.moves import range
from six.moves import cStringIO as StringIO
from datetime import datetime from datetime import datetime
import mimetypes import mimetypes
import re import re
import six
from six import BytesIO
from hashlib import md5 from hashlib import md5
from swift.common.exceptions import ListingIterError, SegmentError from swift.common.exceptions import ListingIterError, SegmentError
from swift.common.swob import Request, HTTPBadRequest, HTTPServerError, \ from swift.common.swob import Request, HTTPBadRequest, HTTPServerError, \
@ -681,8 +682,10 @@ class StaticLargeObject(object):
env['CONTENT_TYPE'] += ";swift_bytes=%d" % total_size env['CONTENT_TYPE'] += ";swift_bytes=%d" % total_size
env['HTTP_X_STATIC_LARGE_OBJECT'] = 'True' env['HTTP_X_STATIC_LARGE_OBJECT'] = 'True'
json_data = json.dumps(data_for_storage) json_data = json.dumps(data_for_storage)
if six.PY3:
json_data = json_data.encode('utf-8')
env['CONTENT_LENGTH'] = str(len(json_data)) env['CONTENT_LENGTH'] = str(len(json_data))
env['wsgi.input'] = StringIO(json_data) env['wsgi.input'] = BytesIO(json_data)
slo_put_context = SloPutContext(self, slo_etag) slo_put_context = SloPutContext(self, slo_etag)
return slo_put_context.handle_slo_put(req, start_response) return slo_put_context.handle_slo_put(req, start_response)

View File

@ -48,6 +48,7 @@ import random
import functools import functools
import inspect import inspect
from six import BytesIO
from six import StringIO from six import StringIO
from swift.common.utils import reiterate, split_path, Timestamp, pairs, \ from swift.common.utils import reiterate, split_path, Timestamp, pairs, \
@ -130,10 +131,10 @@ class _UTC(tzinfo):
UTC = _UTC() UTC = _UTC()
class WsgiStringIO(StringIO): class WsgiStringIO(BytesIO):
""" """
This class adds support for the additional wsgi.input methods defined on This class adds support for the additional wsgi.input methods defined on
eventlet.wsgi.Input to the StringIO class which would otherwise be a fine eventlet.wsgi.Input to the BytesIO class which would otherwise be a fine
stand-in for the file-like object in the WSGI environment. stand-in for the file-like object in the WSGI environment.
""" """
@ -865,7 +866,7 @@ class Request(object):
'SERVER_PROTOCOL': 'HTTP/1.0', 'SERVER_PROTOCOL': 'HTTP/1.0',
'wsgi.version': (1, 0), 'wsgi.version': (1, 0),
'wsgi.url_scheme': parsed_path.scheme or 'http', 'wsgi.url_scheme': parsed_path.scheme or 'http',
'wsgi.errors': StringIO(''), 'wsgi.errors': StringIO(),
'wsgi.multithread': False, 'wsgi.multithread': False,
'wsgi.multiprocess': False 'wsgi.multiprocess': False
} }
@ -874,7 +875,7 @@ class Request(object):
env['wsgi.input'] = WsgiStringIO(body) env['wsgi.input'] = WsgiStringIO(body)
env['CONTENT_LENGTH'] = str(len(body)) env['CONTENT_LENGTH'] = str(len(body))
elif 'wsgi.input' not in env: elif 'wsgi.input' not in env:
env['wsgi.input'] = WsgiStringIO('') env['wsgi.input'] = WsgiStringIO()
req = Request(env) req = Request(env)
for key, val in headers.items(): for key, val in headers.items():
req.headers[key] = val req.headers[key] = val
@ -981,7 +982,7 @@ class Request(object):
env.update({ env.update({
'REQUEST_METHOD': 'GET', 'REQUEST_METHOD': 'GET',
'CONTENT_LENGTH': '0', 'CONTENT_LENGTH': '0',
'wsgi.input': WsgiStringIO(''), 'wsgi.input': WsgiStringIO(),
}) })
return Request(env) return Request(env)

View File

@ -31,6 +31,7 @@ import eventlet.debug
from eventlet import greenio, GreenPool, sleep, wsgi, listen, Timeout from eventlet import greenio, GreenPool, sleep, wsgi, listen, Timeout
from paste.deploy import loadwsgi from paste.deploy import loadwsgi
from eventlet.green import socket, ssl, os as green_os from eventlet.green import socket, ssl, os as green_os
from six import BytesIO
from six import StringIO from six import StringIO
from urllib import unquote from urllib import unquote
@ -1102,7 +1103,7 @@ def make_env(env, method=None, path=None, agent='Swift', query_string=None,
del newenv['HTTP_USER_AGENT'] del newenv['HTTP_USER_AGENT']
if swift_source: if swift_source:
newenv['swift.source'] = swift_source newenv['swift.source'] = swift_source
newenv['wsgi.input'] = StringIO('') newenv['wsgi.input'] = BytesIO()
if 'SCRIPT_NAME' not in newenv: if 'SCRIPT_NAME' not in newenv:
newenv['SCRIPT_NAME'] = '' newenv['SCRIPT_NAME'] = ''
return newenv return newenv

View File

@ -25,6 +25,7 @@ import itertools
import random import random
import simplejson import simplejson
from six import BytesIO
from six import StringIO from six import StringIO
import xml.dom.minidom import xml.dom.minidom
@ -1358,7 +1359,7 @@ class TestAccountController(unittest.TestCase):
self.assertEqual(resp.status_int, 507) self.assertEqual(resp.status_int, 507)
def test_through_call(self): def test_through_call(self):
inbuf = StringIO() inbuf = BytesIO()
errbuf = StringIO() errbuf = StringIO()
outbuf = StringIO() outbuf = StringIO()
@ -1384,7 +1385,7 @@ class TestAccountController(unittest.TestCase):
self.assertEqual(outbuf.getvalue()[:4], '404 ') self.assertEqual(outbuf.getvalue()[:4], '404 ')
def test_through_call_invalid_path(self): def test_through_call_invalid_path(self):
inbuf = StringIO() inbuf = BytesIO()
errbuf = StringIO() errbuf = StringIO()
outbuf = StringIO() outbuf = StringIO()
@ -1410,7 +1411,7 @@ class TestAccountController(unittest.TestCase):
self.assertEqual(outbuf.getvalue()[:4], '400 ') self.assertEqual(outbuf.getvalue()[:4], '400 ')
def test_through_call_invalid_path_utf8(self): def test_through_call_invalid_path_utf8(self):
inbuf = StringIO() inbuf = BytesIO()
errbuf = StringIO() errbuf = StringIO()
outbuf = StringIO() outbuf = StringIO()
@ -1582,7 +1583,7 @@ class TestAccountController(unittest.TestCase):
def test_correct_allowed_method(self): def test_correct_allowed_method(self):
# Test correct work for allowed method using # Test correct work for allowed method using
# swift.account.server.AccountController.__call__ # swift.account.server.AccountController.__call__
inbuf = StringIO() inbuf = BytesIO()
errbuf = StringIO() errbuf = StringIO()
outbuf = StringIO() outbuf = StringIO()
self.controller = AccountController( self.controller = AccountController(
@ -1621,7 +1622,7 @@ class TestAccountController(unittest.TestCase):
def test_not_allowed_method(self): def test_not_allowed_method(self):
# Test correct work for NOT allowed method using # Test correct work for NOT allowed method using
# swift.account.server.AccountController.__call__ # swift.account.server.AccountController.__call__
inbuf = StringIO() inbuf = BytesIO()
errbuf = StringIO() errbuf = StringIO()
outbuf = StringIO() outbuf = StringIO()
self.controller = AccountController( self.controller = AccountController(
@ -1658,7 +1659,7 @@ class TestAccountController(unittest.TestCase):
self.assertEqual(response, answer) self.assertEqual(response, answer)
def test_call_incorrect_replication_method(self): def test_call_incorrect_replication_method(self):
inbuf = StringIO() inbuf = BytesIO()
errbuf = StringIO() errbuf = StringIO()
outbuf = StringIO() outbuf = StringIO()
self.controller = AccountController( self.controller = AccountController(

View File

@ -15,13 +15,13 @@
# limitations under the License. # limitations under the License.
import numbers import numbers
from six import StringIO
import unittest import unittest
import os import os
import tarfile import tarfile
import urllib import urllib
import zlib import zlib
import mock import mock
from six import BytesIO
from shutil import rmtree from shutil import rmtree
from tempfile import mkdtemp from tempfile import mkdtemp
from eventlet import sleep from eventlet import sleep
@ -155,7 +155,7 @@ class TestUntarMetadata(unittest.TestCase):
with open(os.path.join(self.testdir, "obj2"), "w") as fh2: with open(os.path.join(self.testdir, "obj2"), "w") as fh2:
fh2.write("obj2 contents\n") fh2.write("obj2 contents\n")
tar_ball = StringIO() tar_ball = BytesIO()
tar_file = tarfile.TarFile.open(fileobj=tar_ball, mode="w", tar_file = tarfile.TarFile.open(fileobj=tar_ball, mode="w",
format=tarfile.PAX_FORMAT) format=tarfile.PAX_FORMAT)
@ -678,7 +678,7 @@ class TestDelete(unittest.TestCase):
headers={'Accept': 'application/json', headers={'Accept': 'application/json',
'Content-Type': 'text/xml'}) 'Content-Type': 'text/xml'})
req.method = 'POST' req.method = 'POST'
req.environ['wsgi.input'] = StringIO('/c/f\n/c/f404') req.environ['wsgi.input'] = BytesIO(b'/c/f\n/c/f404')
resp_body = self.handle_delete_and_iter(req) resp_body = self.handle_delete_and_iter(req)
resp_data = utils.json.loads(resp_body) resp_data = utils.json.loads(resp_body)
self.assertEquals(resp_data['Response Status'], '406 Not Acceptable') self.assertEquals(resp_data['Response Status'], '406 Not Acceptable')
@ -691,7 +691,7 @@ class TestDelete(unittest.TestCase):
req.method = 'POST' req.method = 'POST'
req.headers['Transfer-Encoding'] = 'chunked' req.headers['Transfer-Encoding'] = 'chunked'
req.headers['Accept'] = 'application/json' req.headers['Accept'] = 'application/json'
req.environ['wsgi.input'] = StringIO('/c/f%20') req.environ['wsgi.input'] = BytesIO(b'/c/f%20')
list(self.bulk(req.environ, fake_start_response)) # iterate over resp list(self.bulk(req.environ, fake_start_response)) # iterate over resp
self.assertEquals( self.assertEquals(
self.app.delete_paths, ['/delete_works/AUTH_Acc/c/f ']) self.app.delete_paths, ['/delete_works/AUTH_Acc/c/f '])
@ -706,7 +706,7 @@ class TestDelete(unittest.TestCase):
with patch.object(self.bulk, 'max_path_length', 2): with patch.object(self.bulk, 'max_path_length', 2):
results = [] results = []
req.environ['wsgi.input'] = StringIO('1\n2\n3') req.environ['wsgi.input'] = BytesIO(b'1\n2\n3')
results = self.bulk.get_objs_to_delete(req) results = self.bulk.get_objs_to_delete(req)
self.assertEquals(results, self.assertEquals(results,
[{'name': '1'}, {'name': '2'}, {'name': '3'}]) [{'name': '1'}, {'name': '2'}, {'name': '3'}])
@ -737,8 +737,8 @@ class TestDelete(unittest.TestCase):
def test_bulk_delete_too_many_newlines(self): def test_bulk_delete_too_many_newlines(self):
req = Request.blank('/delete_works/AUTH_Acc') req = Request.blank('/delete_works/AUTH_Acc')
req.method = 'POST' req.method = 'POST'
data = '\n\n' * self.bulk.max_deletes_per_request data = b'\n\n' * self.bulk.max_deletes_per_request
req.environ['wsgi.input'] = StringIO(data) req.environ['wsgi.input'] = BytesIO(data)
req.content_length = len(data) req.content_length = len(data)
resp_body = self.handle_delete_and_iter(req) resp_body = self.handle_delete_and_iter(req)
self.assertTrue('413 Request Entity Too Large' in resp_body) self.assertTrue('413 Request Entity Too Large' in resp_body)
@ -857,8 +857,8 @@ class TestDelete(unittest.TestCase):
headers={'Accept': 'application/json'}) headers={'Accept': 'application/json'})
req.method = 'POST' req.method = 'POST'
bad_file = 'c/' + ('1' * self.bulk.max_path_length) bad_file = 'c/' + ('1' * self.bulk.max_path_length)
data = '/c/f\n' + bad_file + '\n/c/f' data = b'/c/f\n' + bad_file.encode('ascii') + b'\n/c/f'
req.environ['wsgi.input'] = StringIO(data) req.environ['wsgi.input'] = BytesIO(data)
req.headers['Transfer-Encoding'] = 'chunked' req.headers['Transfer-Encoding'] = 'chunked'
resp_body = self.handle_delete_and_iter(req) resp_body = self.handle_delete_and_iter(req)
resp_data = utils.json.loads(resp_body) resp_data = utils.json.loads(resp_body)

View File

@ -18,7 +18,8 @@ import unittest
from hashlib import sha1 from hashlib import sha1
from time import time from time import time
from six import StringIO import six
from six import BytesIO
from swift.common.swob import Request, Response from swift.common.swob import Request, Response
from swift.common.middleware import tempauth, formpost from swift.common.middleware import tempauth, formpost
@ -43,13 +44,13 @@ class FakeApp(object):
if self.check_no_query_string and env.get('QUERY_STRING'): if self.check_no_query_string and env.get('QUERY_STRING'):
raise Exception('Query string %s should have been discarded!' % raise Exception('Query string %s should have been discarded!' %
env['QUERY_STRING']) env['QUERY_STRING'])
body = '' body = b''
while True: while True:
chunk = env['wsgi.input'].read() chunk = env['wsgi.input'].read()
if not chunk: if not chunk:
break break
body += chunk body += chunk
env['wsgi.input'] = StringIO(body) env['wsgi.input'] = BytesIO(body)
self.requests.append(Request.blank('', environ=env)) self.requests.append(Request.blank('', environ=env))
if env.get('swift.authorize_override') and \ if env.get('swift.authorize_override') and \
env.get('REMOTE_USER') != '.wsgi.pre_authed': env.get('REMOTE_USER') != '.wsgi.pre_authed':
@ -73,39 +74,40 @@ class TestCappedFileLikeObject(unittest.TestCase):
def test_whole(self): def test_whole(self):
self.assertEquals( self.assertEquals(
formpost._CappedFileLikeObject(StringIO('abc'), 10).read(), 'abc') formpost._CappedFileLikeObject(BytesIO(b'abc'), 10).read(),
b'abc')
def test_exceeded(self): def test_exceeded(self):
exc = None exc = None
try: try:
formpost._CappedFileLikeObject(StringIO('abc'), 2).read() formpost._CappedFileLikeObject(BytesIO(b'abc'), 2).read()
except EOFError as err: except EOFError as err:
exc = err exc = err
self.assertEquals(str(exc), 'max_file_size exceeded') self.assertEquals(str(exc), 'max_file_size exceeded')
def test_whole_readline(self): def test_whole_readline(self):
fp = formpost._CappedFileLikeObject(StringIO('abc\ndef'), 10) fp = formpost._CappedFileLikeObject(BytesIO(b'abc\ndef'), 10)
self.assertEquals(fp.readline(), 'abc\n') self.assertEquals(fp.readline(), b'abc\n')
self.assertEquals(fp.readline(), 'def') self.assertEquals(fp.readline(), b'def')
self.assertEquals(fp.readline(), '') self.assertEquals(fp.readline(), b'')
def test_exceeded_readline(self): def test_exceeded_readline(self):
fp = formpost._CappedFileLikeObject(StringIO('abc\ndef'), 5) fp = formpost._CappedFileLikeObject(BytesIO(b'abc\ndef'), 5)
self.assertEquals(fp.readline(), 'abc\n') self.assertEquals(fp.readline(), b'abc\n')
exc = None exc = None
try: try:
self.assertEquals(fp.readline(), 'def') self.assertEquals(fp.readline(), b'def')
except EOFError as err: except EOFError as err:
exc = err exc = err
self.assertEquals(str(exc), 'max_file_size exceeded') self.assertEquals(str(exc), 'max_file_size exceeded')
def test_read_sized(self): def test_read_sized(self):
fp = formpost._CappedFileLikeObject(StringIO('abcdefg'), 10) fp = formpost._CappedFileLikeObject(BytesIO(b'abcdefg'), 10)
self.assertEquals(fp.read(2), 'ab') self.assertEquals(fp.read(2), b'ab')
self.assertEquals(fp.read(2), 'cd') self.assertEquals(fp.read(2), b'cd')
self.assertEquals(fp.read(2), 'ef') self.assertEquals(fp.read(2), b'ef')
self.assertEquals(fp.read(2), 'g') self.assertEquals(fp.read(2), b'g')
self.assertEquals(fp.read(2), '') self.assertEquals(fp.read(2), b'')
class TestFormPost(unittest.TestCase): class TestFormPost(unittest.TestCase):
@ -196,7 +198,9 @@ class TestFormPost(unittest.TestCase):
'------WebKitFormBoundaryNcxTqxSlX7t4TDkR--', '------WebKitFormBoundaryNcxTqxSlX7t4TDkR--',
'', '',
] ]
wsgi_errors = StringIO() if six.PY3:
body = [line.encode('utf-8') for line in body]
wsgi_errors = six.StringIO()
env = { env = {
'CONTENT_TYPE': 'multipart/form-data; ' 'CONTENT_TYPE': 'multipart/form-data; '
'boundary=----WebKitFormBoundaryNcxTqxSlX7t4TDkR', 'boundary=----WebKitFormBoundaryNcxTqxSlX7t4TDkR',
@ -242,7 +246,7 @@ class TestFormPost(unittest.TestCase):
key = 'abc' key = 'abc'
sig, env, body = self._make_sig_env_body( sig, env, body = self._make_sig_env_body(
'/v1/AUTH_test/container', '', 1024, 10, int(time() - 10), key) '/v1/AUTH_test/container', '', 1024, 10, int(time() - 10), key)
env['wsgi.input'] = StringIO('\r\n'.join(body)) env['wsgi.input'] = BytesIO(b'\r\n'.join(body))
env['swift.account/AUTH_test'] = self._fake_cache_env( env['swift.account/AUTH_test'] = self._fake_cache_env(
'AUTH_test', [key]) 'AUTH_test', [key])
self.app = FakeApp(iter([('201 Created', {}, ''), self.app = FakeApp(iter([('201 Created', {}, ''),
@ -282,7 +286,7 @@ class TestFormPost(unittest.TestCase):
'%s\n%s\n%s\n%s\n%s' % ( '%s\n%s\n%s\n%s\n%s' % (
path, redirect, max_file_size, max_file_count, expires), path, redirect, max_file_size, max_file_count, expires),
sha1).hexdigest() sha1).hexdigest()
wsgi_input = StringIO('\r\n'.join([ wsgi_input = '\r\n'.join([
'------WebKitFormBoundaryNcxTqxSlX7t4TDkR', '------WebKitFormBoundaryNcxTqxSlX7t4TDkR',
'Content-Disposition: form-data; name="redirect"', 'Content-Disposition: form-data; name="redirect"',
'', '',
@ -322,8 +326,11 @@ class TestFormPost(unittest.TestCase):
'', '',
'------WebKitFormBoundaryNcxTqxSlX7t4TDkR--', '------WebKitFormBoundaryNcxTqxSlX7t4TDkR--',
'', '',
])) ])
wsgi_errors = StringIO() if six.PY3:
wsgi_input = wsgi_input.encode('utf-8')
wsgi_input = BytesIO(wsgi_input)
wsgi_errors = six.StringIO()
env = { env = {
'CONTENT_TYPE': 'multipart/form-data; ' 'CONTENT_TYPE': 'multipart/form-data; '
'boundary=----WebKitFormBoundaryNcxTqxSlX7t4TDkR', 'boundary=----WebKitFormBoundaryNcxTqxSlX7t4TDkR',
@ -396,7 +403,7 @@ class TestFormPost(unittest.TestCase):
'%s\n%s\n%s\n%s\n%s' % ( '%s\n%s\n%s\n%s\n%s' % (
path, redirect, max_file_size, max_file_count, expires), path, redirect, max_file_size, max_file_count, expires),
sha1).hexdigest() sha1).hexdigest()
wsgi_input = StringIO('\r\n'.join([ wsgi_input = '\r\n'.join([
'-----------------------------168072824752491622650073', '-----------------------------168072824752491622650073',
'Content-Disposition: form-data; name="redirect"', 'Content-Disposition: form-data; name="redirect"',
'', '',
@ -436,8 +443,11 @@ class TestFormPost(unittest.TestCase):
'', '',
'-----------------------------168072824752491622650073--', '-----------------------------168072824752491622650073--',
'' ''
])) ])
wsgi_errors = StringIO() if six.PY3:
wsgi_input = wsgi_input.encode('utf-8')
wsgi_input = BytesIO(wsgi_input)
wsgi_errors = six.StringIO()
env = { env = {
'CONTENT_TYPE': 'multipart/form-data; ' 'CONTENT_TYPE': 'multipart/form-data; '
'boundary=---------------------------168072824752491622650073', 'boundary=---------------------------168072824752491622650073',
@ -509,7 +519,7 @@ class TestFormPost(unittest.TestCase):
'%s\n%s\n%s\n%s\n%s' % ( '%s\n%s\n%s\n%s\n%s' % (
path, redirect, max_file_size, max_file_count, expires), path, redirect, max_file_size, max_file_count, expires),
sha1).hexdigest() sha1).hexdigest()
wsgi_input = StringIO('\r\n'.join([ wsgi_input = '\r\n'.join([
'------WebKitFormBoundaryq3CFxUjfsDMu8XsA', '------WebKitFormBoundaryq3CFxUjfsDMu8XsA',
'Content-Disposition: form-data; name="redirect"', 'Content-Disposition: form-data; name="redirect"',
'', '',
@ -549,8 +559,11 @@ class TestFormPost(unittest.TestCase):
'', '',
'------WebKitFormBoundaryq3CFxUjfsDMu8XsA--', '------WebKitFormBoundaryq3CFxUjfsDMu8XsA--',
'' ''
])) ])
wsgi_errors = StringIO() if six.PY3:
wsgi_input = wsgi_input.encode('utf-8')
wsgi_input = BytesIO(wsgi_input)
wsgi_errors = six.StringIO()
env = { env = {
'CONTENT_TYPE': 'multipart/form-data; ' 'CONTENT_TYPE': 'multipart/form-data; '
'boundary=----WebKitFormBoundaryq3CFxUjfsDMu8XsA', 'boundary=----WebKitFormBoundaryq3CFxUjfsDMu8XsA',
@ -625,7 +638,7 @@ class TestFormPost(unittest.TestCase):
'%s\n%s\n%s\n%s\n%s' % ( '%s\n%s\n%s\n%s\n%s' % (
path, redirect, max_file_size, max_file_count, expires), path, redirect, max_file_size, max_file_count, expires),
sha1).hexdigest() sha1).hexdigest()
wsgi_input = StringIO('\r\n'.join([ wsgi_input = '\r\n'.join([
'-----------------------------7db20d93017c', '-----------------------------7db20d93017c',
'Content-Disposition: form-data; name="redirect"', 'Content-Disposition: form-data; name="redirect"',
'', '',
@ -665,8 +678,11 @@ class TestFormPost(unittest.TestCase):
'', '',
'-----------------------------7db20d93017c--', '-----------------------------7db20d93017c--',
'' ''
])) ])
wsgi_errors = StringIO() if six.PY3:
wsgi_input = wsgi_input.encode('utf-8')
wsgi_input = BytesIO(wsgi_input)
wsgi_errors = six.StringIO()
env = { env = {
'CONTENT_TYPE': 'multipart/form-data; ' 'CONTENT_TYPE': 'multipart/form-data; '
'boundary=---------------------------7db20d93017c', 'boundary=---------------------------7db20d93017c',
@ -730,7 +746,7 @@ class TestFormPost(unittest.TestCase):
sig, env, body = self._make_sig_env_body( sig, env, body = self._make_sig_env_body(
'/v1/AUTH_test/container', 'http://brim.net', 5, 10, '/v1/AUTH_test/container', 'http://brim.net', 5, 10,
int(time() + 86400), key) int(time() + 86400), key)
env['wsgi.input'] = StringIO('XX' + '\r\n'.join(body)) env['wsgi.input'] = BytesIO(b'XX' + b'\r\n'.join(body))
env['swift.account/AUTH_test'] = self._fake_cache_env( env['swift.account/AUTH_test'] = self._fake_cache_env(
'AUTH_test', [key]) 'AUTH_test', [key])
env['swift.container/AUTH_test/container'] = {'meta': {}} env['swift.container/AUTH_test/container'] = {'meta': {}}
@ -766,7 +782,7 @@ class TestFormPost(unittest.TestCase):
sig, env, body = self._make_sig_env_body( sig, env, body = self._make_sig_env_body(
'/v1/AUTH_test/container', 'http://brim.net', 5, 10, '/v1/AUTH_test/container', 'http://brim.net', 5, 10,
int(time() + 86400), key) int(time() + 86400), key)
env['wsgi.input'] = StringIO('\r\n'.join(body)) env['wsgi.input'] = BytesIO(b'\r\n'.join(body))
env['swift.account/AUTH_test'] = self._fake_cache_env( env['swift.account/AUTH_test'] = self._fake_cache_env(
'AUTH_test', [key]) 'AUTH_test', [key])
env['swift.container/AUTH_test/container'] = {'meta': {}} env['swift.container/AUTH_test/container'] = {'meta': {}}
@ -797,7 +813,7 @@ class TestFormPost(unittest.TestCase):
sig, env, body = self._make_sig_env_body( sig, env, body = self._make_sig_env_body(
'/v1/AUTH_test/container', 'http://brim.net', 1024, 1, '/v1/AUTH_test/container', 'http://brim.net', 1024, 1,
int(time() + 86400), key) int(time() + 86400), key)
env['wsgi.input'] = StringIO('\r\n'.join(body)) env['wsgi.input'] = BytesIO(b'\r\n'.join(body))
env['swift.account/AUTH_test'] = self._fake_cache_env( env['swift.account/AUTH_test'] = self._fake_cache_env(
'AUTH_test', [key]) 'AUTH_test', [key])
env['swift.container/AUTH_test/container'] = {'meta': {}} env['swift.container/AUTH_test/container'] = {'meta': {}}
@ -838,7 +854,7 @@ class TestFormPost(unittest.TestCase):
sig, env, body = self._make_sig_env_body( sig, env, body = self._make_sig_env_body(
'/v1/AUTH_test/container', '', 1024, 10, int(time() + 86400), key) '/v1/AUTH_test/container', '', 1024, 10, int(time() + 86400), key)
env['QUERY_STRING'] = 'this=should&not=get&passed' env['QUERY_STRING'] = 'this=should&not=get&passed'
env['wsgi.input'] = StringIO('\r\n'.join(body)) env['wsgi.input'] = BytesIO(b'\r\n'.join(body))
env['swift.account/AUTH_test'] = self._fake_cache_env( env['swift.account/AUTH_test'] = self._fake_cache_env(
'AUTH_test', [key]) 'AUTH_test', [key])
env['swift.container/AUTH_test/container'] = {'meta': {}} env['swift.container/AUTH_test/container'] = {'meta': {}}
@ -873,7 +889,7 @@ class TestFormPost(unittest.TestCase):
sig, env, body = self._make_sig_env_body( sig, env, body = self._make_sig_env_body(
'/v1/AUTH_test/container', 'http://brim.net', 1024, 10, '/v1/AUTH_test/container', 'http://brim.net', 1024, 10,
int(time() + 86400), key) int(time() + 86400), key)
env['wsgi.input'] = StringIO('\r\n'.join(body)) env['wsgi.input'] = BytesIO(b'\r\n'.join(body))
env['swift.account/AUTH_test'] = self._fake_cache_env( env['swift.account/AUTH_test'] = self._fake_cache_env(
'AUTH_test', [key]) 'AUTH_test', [key])
env['swift.container/AUTH_test/container'] = {'meta': {}} env['swift.container/AUTH_test/container'] = {'meta': {}}
@ -916,7 +932,7 @@ class TestFormPost(unittest.TestCase):
# Tack on an extra char to redirect, but shouldn't matter since it # Tack on an extra char to redirect, but shouldn't matter since it
# should get truncated off on read. # should get truncated off on read.
redirect += 'b' redirect += 'b'
env['wsgi.input'] = StringIO('\r\n'.join([ wsgi_input = '\r\n'.join([
'------WebKitFormBoundaryNcxTqxSlX7t4TDkR', '------WebKitFormBoundaryNcxTqxSlX7t4TDkR',
'Content-Disposition: form-data; name="redirect"', 'Content-Disposition: form-data; name="redirect"',
'', '',
@ -956,7 +972,10 @@ class TestFormPost(unittest.TestCase):
'', '',
'------WebKitFormBoundaryNcxTqxSlX7t4TDkR--', '------WebKitFormBoundaryNcxTqxSlX7t4TDkR--',
'', '',
])) ])
if six.PY3:
wsgi_input = wsgi_input.encode('utf-8')
env['wsgi.input'] = BytesIO(wsgi_input)
env['swift.account/AUTH_test'] = self._fake_cache_env( env['swift.account/AUTH_test'] = self._fake_cache_env(
'AUTH_test', [key]) 'AUTH_test', [key])
env['swift.container/AUTH_test/container'] = {'meta': {}} env['swift.container/AUTH_test/container'] = {'meta': {}}
@ -1001,7 +1020,7 @@ class TestFormPost(unittest.TestCase):
sig, env, body = self._make_sig_env_body( sig, env, body = self._make_sig_env_body(
'/v1/AUTH_test/container', redirect, max_file_size, max_file_count, '/v1/AUTH_test/container', redirect, max_file_size, max_file_count,
expires, key) expires, key)
env['wsgi.input'] = StringIO('\r\n'.join([ wsgi_input = '\r\n'.join([
'------WebKitFormBoundaryNcxTqxSlX7t4TDkR', '------WebKitFormBoundaryNcxTqxSlX7t4TDkR',
'Content-Disposition: form-data; name="redirect"', 'Content-Disposition: form-data; name="redirect"',
'', '',
@ -1024,7 +1043,10 @@ class TestFormPost(unittest.TestCase):
sig, sig,
'------WebKitFormBoundaryNcxTqxSlX7t4TDkR--', '------WebKitFormBoundaryNcxTqxSlX7t4TDkR--',
'', '',
])) ])
if six.PY3:
wsgi_input = wsgi_input.encode('utf-8')
env['wsgi.input'] = BytesIO(wsgi_input)
env['swift.account/AUTH_test'] = self._fake_cache_env( env['swift.account/AUTH_test'] = self._fake_cache_env(
'AUTH_test', [key]) 'AUTH_test', [key])
env['swift.container/AUTH_test/container'] = {'meta': {}} env['swift.container/AUTH_test/container'] = {'meta': {}}
@ -1064,7 +1086,7 @@ class TestFormPost(unittest.TestCase):
sig, env, body = self._make_sig_env_body( sig, env, body = self._make_sig_env_body(
'/v1/AUTH_test/container', 'http://redirect', 1024, 10, '/v1/AUTH_test/container', 'http://redirect', 1024, 10,
int(time() + 86400), key, user_agent=False) int(time() + 86400), key, user_agent=False)
env['wsgi.input'] = StringIO('\r\n'.join(body)) env['wsgi.input'] = BytesIO(b'\r\n'.join(body))
env['swift.account/AUTH_test'] = self._fake_cache_env( env['swift.account/AUTH_test'] = self._fake_cache_env(
'AUTH_test', [key]) 'AUTH_test', [key])
env['swift.container/AUTH_test/container'] = {'meta': {}} env['swift.container/AUTH_test/container'] = {'meta': {}}
@ -1085,7 +1107,7 @@ class TestFormPost(unittest.TestCase):
sig, env, body = self._make_sig_env_body( sig, env, body = self._make_sig_env_body(
'/v1/AUTH_test/container', 'http://redirect', 1024, 10, '/v1/AUTH_test/container', 'http://redirect', 1024, 10,
int(time() + 86400), key, user_agent=False) int(time() + 86400), key, user_agent=False)
env['wsgi.input'] = StringIO('\r\n'.join(body)) env['wsgi.input'] = BytesIO(b'\r\n'.join(body))
env['swift.account/AUTH_test'] = self._fake_cache_env( env['swift.account/AUTH_test'] = self._fake_cache_env(
'AUTH_test', [key]) 'AUTH_test', [key])
env['swift.container/AUTH_test/container'] = {'meta': {}} env['swift.container/AUTH_test/container'] = {'meta': {}}
@ -1113,7 +1135,7 @@ class TestFormPost(unittest.TestCase):
sig, env, body = self._make_sig_env_body( sig, env, body = self._make_sig_env_body(
'/v1/AUTH_test/container', 'http://redirect', 1024, 10, '/v1/AUTH_test/container', 'http://redirect', 1024, 10,
int(time() + 86400), key) int(time() + 86400), key)
env['wsgi.input'] = StringIO('\r\n'.join(body)) env['wsgi.input'] = BytesIO(b'\r\n'.join(body))
# Stick it in X-Account-Meta-Temp-URL-Key-2 and make sure we get it # Stick it in X-Account-Meta-Temp-URL-Key-2 and make sure we get it
env['swift.account/AUTH_test'] = self._fake_cache_env( env['swift.account/AUTH_test'] = self._fake_cache_env(
'AUTH_test', ['bert', key]) 'AUTH_test', ['bert', key])
@ -1150,7 +1172,7 @@ class TestFormPost(unittest.TestCase):
sig, env, body = self._make_sig_env_body( sig, env, body = self._make_sig_env_body(
'/v1/AUTH_test/container', 'http://redirect', 1024, 10, '/v1/AUTH_test/container', 'http://redirect', 1024, 10,
int(time() + 86400), key) int(time() + 86400), key)
env['wsgi.input'] = StringIO('\r\n'.join(body)) env['wsgi.input'] = BytesIO(b'\r\n'.join(body))
env['swift.account/AUTH_test'] = self._fake_cache_env('AUTH_test') env['swift.account/AUTH_test'] = self._fake_cache_env('AUTH_test')
# Stick it in X-Container-Meta-Temp-URL-Key-2 and ensure we get it # Stick it in X-Container-Meta-Temp-URL-Key-2 and ensure we get it
env['swift.container/AUTH_test/container'] = {'meta': meta} env['swift.container/AUTH_test/container'] = {'meta': meta}
@ -1176,7 +1198,7 @@ class TestFormPost(unittest.TestCase):
sig, env, body = self._make_sig_env_body( sig, env, body = self._make_sig_env_body(
'/v1/AUTH_test/container', 'http://redirect', 1024, 10, '/v1/AUTH_test/container', 'http://redirect', 1024, 10,
int(time() + 86400), key) int(time() + 86400), key)
env['wsgi.input'] = StringIO('\r\n'.join(body)) env['wsgi.input'] = BytesIO(b'\r\n'.join(body))
env['swift.account/AUTH_test'] = self._fake_cache_env( env['swift.account/AUTH_test'] = self._fake_cache_env(
'AUTH_test', [key]) 'AUTH_test', [key])
env['swift.container/AUTH_test/container'] = {'meta': {}} env['swift.container/AUTH_test/container'] = {'meta': {}}
@ -1214,7 +1236,7 @@ class TestFormPost(unittest.TestCase):
sig, env, body = self._make_sig_env_body( sig, env, body = self._make_sig_env_body(
'/v1/AUTH_test/container', 'http://redirect?one=two', 1024, 10, '/v1/AUTH_test/container', 'http://redirect?one=two', 1024, 10,
int(time() + 86400), key) int(time() + 86400), key)
env['wsgi.input'] = StringIO('\r\n'.join(body)) env['wsgi.input'] = BytesIO(b'\r\n'.join(body))
env['swift.account/AUTH_test'] = self._fake_cache_env( env['swift.account/AUTH_test'] = self._fake_cache_env(
'AUTH_test', [key]) 'AUTH_test', [key])
env['swift.container/AUTH_test/container'] = {'meta': {}} env['swift.container/AUTH_test/container'] = {'meta': {}}
@ -1252,7 +1274,7 @@ class TestFormPost(unittest.TestCase):
key = 'abc' key = 'abc'
sig, env, body = self._make_sig_env_body( sig, env, body = self._make_sig_env_body(
'/v1/AUTH_test/container', '', 1024, 10, int(time() + 86400), key) '/v1/AUTH_test/container', '', 1024, 10, int(time() + 86400), key)
env['wsgi.input'] = StringIO('\r\n'.join(body)) env['wsgi.input'] = BytesIO(b'\r\n'.join(body))
env['swift.account/AUTH_test'] = self._fake_cache_env( env['swift.account/AUTH_test'] = self._fake_cache_env(
'AUTH_test', [key]) 'AUTH_test', [key])
env['swift.container/AUTH_test/container'] = {'meta': {}} env['swift.container/AUTH_test/container'] = {'meta': {}}
@ -1289,7 +1311,7 @@ class TestFormPost(unittest.TestCase):
key = 'abc' key = 'abc'
sig, env, body = self._make_sig_env_body( sig, env, body = self._make_sig_env_body(
'/v1/AUTH_test/container', '', 1024, 10, int(time() - 10), key) '/v1/AUTH_test/container', '', 1024, 10, int(time() - 10), key)
env['wsgi.input'] = StringIO('\r\n'.join(body)) env['wsgi.input'] = BytesIO(b'\r\n'.join(body))
env['swift.account/AUTH_test'] = self._fake_cache_env( env['swift.account/AUTH_test'] = self._fake_cache_env(
'AUTH_test', [key]) 'AUTH_test', [key])
self.app = FakeApp(iter([('201 Created', {}, ''), self.app = FakeApp(iter([('201 Created', {}, ''),
@ -1322,7 +1344,7 @@ class TestFormPost(unittest.TestCase):
key = 'abc' key = 'abc'
sig, env, body = self._make_sig_env_body( sig, env, body = self._make_sig_env_body(
'/v1/AUTH_test/container', '', 1024, 10, int(time() + 86400), key) '/v1/AUTH_test/container', '', 1024, 10, int(time() + 86400), key)
env['wsgi.input'] = StringIO('\r\n'.join(body)) env['wsgi.input'] = BytesIO(b'\r\n'.join(body))
# Change key to invalidate sig # Change key to invalidate sig
env['swift.account/AUTH_test'] = self._fake_cache_env( env['swift.account/AUTH_test'] = self._fake_cache_env(
'AUTH_test', [key + ' is bogus now']) 'AUTH_test', [key + ' is bogus now'])
@ -1356,7 +1378,7 @@ class TestFormPost(unittest.TestCase):
key = 'abc' key = 'abc'
sig, env, body = self._make_sig_env_body( sig, env, body = self._make_sig_env_body(
'/v1/AUTH_test/container', '', 1024, 10, int(time() + 86400), key) '/v1/AUTH_test/container', '', 1024, 10, int(time() + 86400), key)
env['wsgi.input'] = StringIO('XX' + '\r\n'.join(body)) env['wsgi.input'] = BytesIO(b'XX' + b'\r\n'.join(body))
env['swift.account/AUTH_test'] = self._fake_cache_env( env['swift.account/AUTH_test'] = self._fake_cache_env(
'AUTH_test', [key]) 'AUTH_test', [key])
self.app = FakeApp(iter([('201 Created', {}, ''), self.app = FakeApp(iter([('201 Created', {}, ''),
@ -1389,7 +1411,7 @@ class TestFormPost(unittest.TestCase):
key = 'abc' key = 'abc'
sig, env, body = self._make_sig_env_body( sig, env, body = self._make_sig_env_body(
'/v2/AUTH_test/container', '', 1024, 10, int(time() + 86400), key) '/v2/AUTH_test/container', '', 1024, 10, int(time() + 86400), key)
env['wsgi.input'] = StringIO('\r\n'.join(body)) env['wsgi.input'] = BytesIO(b'\r\n'.join(body))
env['swift.account/AUTH_test'] = self._fake_cache_env( env['swift.account/AUTH_test'] = self._fake_cache_env(
'AUTH_test', [key]) 'AUTH_test', [key])
self.app = FakeApp(iter([('201 Created', {}, ''), self.app = FakeApp(iter([('201 Created', {}, ''),
@ -1422,7 +1444,7 @@ class TestFormPost(unittest.TestCase):
key = 'abc' key = 'abc'
sig, env, body = self._make_sig_env_body( sig, env, body = self._make_sig_env_body(
'//AUTH_test/container', '', 1024, 10, int(time() + 86400), key) '//AUTH_test/container', '', 1024, 10, int(time() + 86400), key)
env['wsgi.input'] = StringIO('\r\n'.join(body)) env['wsgi.input'] = BytesIO(b'\r\n'.join(body))
env['swift.account/AUTH_test'] = self._fake_cache_env( env['swift.account/AUTH_test'] = self._fake_cache_env(
'AUTH_test', [key]) 'AUTH_test', [key])
self.app = FakeApp(iter([('201 Created', {}, ''), self.app = FakeApp(iter([('201 Created', {}, ''),
@ -1455,7 +1477,7 @@ class TestFormPost(unittest.TestCase):
key = 'abc' key = 'abc'
sig, env, body = self._make_sig_env_body( sig, env, body = self._make_sig_env_body(
'/v1//container', '', 1024, 10, int(time() + 86400), key) '/v1//container', '', 1024, 10, int(time() + 86400), key)
env['wsgi.input'] = StringIO('\r\n'.join(body)) env['wsgi.input'] = BytesIO(b'\r\n'.join(body))
env['swift.account/AUTH_test'] = self._fake_cache_env( env['swift.account/AUTH_test'] = self._fake_cache_env(
'AUTH_test', [key]) 'AUTH_test', [key])
self.app = FakeApp(iter([('201 Created', {}, ''), self.app = FakeApp(iter([('201 Created', {}, ''),
@ -1488,7 +1510,7 @@ class TestFormPost(unittest.TestCase):
key = 'abc' key = 'abc'
sig, env, body = self._make_sig_env_body( sig, env, body = self._make_sig_env_body(
'/v1/AUTH_tst/container', '', 1024, 10, int(time() + 86400), key) '/v1/AUTH_tst/container', '', 1024, 10, int(time() + 86400), key)
env['wsgi.input'] = StringIO('\r\n'.join(body)) env['wsgi.input'] = BytesIO(b'\r\n'.join(body))
env['swift.account/AUTH_test'] = self._fake_cache_env( env['swift.account/AUTH_test'] = self._fake_cache_env(
'AUTH_test', [key]) 'AUTH_test', [key])
self.app = FakeApp(iter([ self.app = FakeApp(iter([
@ -1523,7 +1545,7 @@ class TestFormPost(unittest.TestCase):
key = 'abc' key = 'abc'
sig, env, body = self._make_sig_env_body( sig, env, body = self._make_sig_env_body(
'/v1/AUTH_test', '', 1024, 10, int(time() + 86400), key) '/v1/AUTH_test', '', 1024, 10, int(time() + 86400), key)
env['wsgi.input'] = StringIO('\r\n'.join(body)) env['wsgi.input'] = BytesIO(b'\r\n'.join(body))
env['swift.account/AUTH_test'] = self._fake_cache_env( env['swift.account/AUTH_test'] = self._fake_cache_env(
'AUTH_test', [key]) 'AUTH_test', [key])
self.app = FakeApp(iter([('201 Created', {}, ''), self.app = FakeApp(iter([('201 Created', {}, ''),
@ -1561,7 +1583,7 @@ class TestFormPost(unittest.TestCase):
if v == str(expires): if v == str(expires):
body[i] = 'badvalue' body[i] = 'badvalue'
break break
env['wsgi.input'] = StringIO('\r\n'.join(body)) env['wsgi.input'] = BytesIO(b'\r\n'.join(body))
env['swift.account/AUTH_test'] = self._fake_cache_env( env['swift.account/AUTH_test'] = self._fake_cache_env(
'AUTH_test', [key]) 'AUTH_test', [key])
self.app = FakeApp(iter([('201 Created', {}, ''), self.app = FakeApp(iter([('201 Created', {}, ''),
@ -1601,7 +1623,8 @@ class TestFormPost(unittest.TestCase):
key = 'abc' key = 'abc'
sig, env, body = self._make_sig_env_body( sig, env, body = self._make_sig_env_body(
'/v1/AUTH_test/container', '', 1024, 10, int(time() + 86400), key) '/v1/AUTH_test/container', '', 1024, 10, int(time() + 86400), key)
env['wsgi.input'] = StringIO('\r\n'.join(x_delete_body_part + body)) wsgi_input = b'\r\n'.join(x_delete_body_part + body)
env['wsgi.input'] = BytesIO(wsgi_input)
env['swift.account/AUTH_test'] = self._fake_cache_env( env['swift.account/AUTH_test'] = self._fake_cache_env(
'AUTH_test', [key]) 'AUTH_test', [key])
env['swift.container/AUTH_test/container'] = {'meta': {}} env['swift.container/AUTH_test/container'] = {'meta': {}}
@ -1643,7 +1666,8 @@ class TestFormPost(unittest.TestCase):
key = 'abc' key = 'abc'
sig, env, body = self._make_sig_env_body( sig, env, body = self._make_sig_env_body(
'/v1/AUTH_test/container', '', 1024, 10, int(time() + 86400), key) '/v1/AUTH_test/container', '', 1024, 10, int(time() + 86400), key)
env['wsgi.input'] = StringIO('\r\n'.join(x_delete_body_part + body)) wsgi_input = b'\r\n'.join(x_delete_body_part + body)
env['wsgi.input'] = BytesIO(wsgi_input)
env['swift.account/AUTH_test'] = self._fake_cache_env( env['swift.account/AUTH_test'] = self._fake_cache_env(
'AUTH_test', [key]) 'AUTH_test', [key])
self.app = FakeApp(iter([('201 Created', {}, ''), self.app = FakeApp(iter([('201 Created', {}, ''),
@ -1677,7 +1701,8 @@ class TestFormPost(unittest.TestCase):
key = 'abc' key = 'abc'
sig, env, body = self._make_sig_env_body( sig, env, body = self._make_sig_env_body(
'/v1/AUTH_test/container', '', 1024, 10, int(time() + 86400), key) '/v1/AUTH_test/container', '', 1024, 10, int(time() + 86400), key)
env['wsgi.input'] = StringIO('\r\n'.join(x_delete_body_part + body)) wsgi_input = b'\r\n'.join(x_delete_body_part + body)
env['wsgi.input'] = BytesIO(wsgi_input)
env['swift.account/AUTH_test'] = self._fake_cache_env( env['swift.account/AUTH_test'] = self._fake_cache_env(
'AUTH_test', [key]) 'AUTH_test', [key])
env['swift.container/AUTH_test/container'] = {'meta': {}} env['swift.container/AUTH_test/container'] = {'meta': {}}
@ -1719,7 +1744,8 @@ class TestFormPost(unittest.TestCase):
key = 'abc' key = 'abc'
sig, env, body = self._make_sig_env_body( sig, env, body = self._make_sig_env_body(
'/v1/AUTH_test/container', '', 1024, 10, int(time() + 86400), key) '/v1/AUTH_test/container', '', 1024, 10, int(time() + 86400), key)
env['wsgi.input'] = StringIO('\r\n'.join(x_delete_body_part + body)) wsgi_input = b'\r\n'.join(x_delete_body_part + body)
env['wsgi.input'] = BytesIO(wsgi_input)
env['swift.account/AUTH_test'] = self._fake_cache_env( env['swift.account/AUTH_test'] = self._fake_cache_env(
'AUTH_test', [key]) 'AUTH_test', [key])
self.app = FakeApp(iter([('201 Created', {}, ''), self.app = FakeApp(iter([('201 Created', {}, ''),

View File

@ -13,11 +13,12 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
from six import moves
import unittest import unittest
from urllib import unquote from urllib import unquote
from logging.handlers import SysLogHandler from logging.handlers import SysLogHandler
import mock import mock
from six import BytesIO
from test.unit import FakeLogger from test.unit import FakeLogger
from swift.common.utils import get_logger from swift.common.utils import get_logger
@ -194,7 +195,7 @@ class TestProxyLogging(unittest.TestCase):
app.access_logger = FakeLogger() app.access_logger = FakeLogger()
req = Request.blank(path, environ={ req = Request.blank(path, environ={
'REQUEST_METHOD': 'GET', 'REQUEST_METHOD': 'GET',
'wsgi.input': moves.cStringIO('4321')}) 'wsgi.input': BytesIO(b'4321')})
stub_times = [18.0, 20.71828182846] stub_times = [18.0, 20.71828182846]
iter_response = app(req.environ, lambda *_: None) iter_response = app(req.environ, lambda *_: None)
self.assertEqual('7654321', ''.join(iter_response)) self.assertEqual('7654321', ''.join(iter_response))
@ -213,7 +214,7 @@ class TestProxyLogging(unittest.TestCase):
req = Request.blank(path, environ={ req = Request.blank(path, environ={
'REQUEST_METHOD': 'GET', 'REQUEST_METHOD': 'GET',
'swift.proxy_access_log_made': True, 'swift.proxy_access_log_made': True,
'wsgi.input': moves.cStringIO('4321')}) 'wsgi.input': BytesIO(b'4321')})
stub_times = [18.0, 20.71828182846] stub_times = [18.0, 20.71828182846]
iter_response = app(req.environ, lambda *_: None) iter_response = app(req.environ, lambda *_: None)
self.assertEqual('7654321', ''.join(iter_response)) self.assertEqual('7654321', ''.join(iter_response))
@ -229,7 +230,7 @@ class TestProxyLogging(unittest.TestCase):
app.access_logger = FakeLogger() app.access_logger = FakeLogger()
req = Request.blank(path, environ={ req = Request.blank(path, environ={
'REQUEST_METHOD': 'PUT', 'REQUEST_METHOD': 'PUT',
'wsgi.input': moves.cStringIO('654321')}) 'wsgi.input': BytesIO(b'654321')})
# (it's not a GET, so time() doesn't have a 2nd call) # (it's not a GET, so time() doesn't have a 2nd call)
stub_times = [58.2, 58.2 + 7.3321] stub_times = [58.2, 58.2 + 7.3321]
iter_response = app(req.environ, lambda *_: None) iter_response = app(req.environ, lambda *_: None)
@ -377,7 +378,7 @@ class TestProxyLogging(unittest.TestCase):
req = Request.blank( req = Request.blank(
'/v1/a/c/o/foo', '/v1/a/c/o/foo',
environ={'REQUEST_METHOD': 'PUT', environ={'REQUEST_METHOD': 'PUT',
'wsgi.input': moves.cStringIO('some stuff')}) 'wsgi.input': BytesIO(b'some stuff')})
resp = app(req.environ, start_response) resp = app(req.environ, start_response)
# exhaust generator # exhaust generator
[x for x in resp] [x for x in resp]
@ -395,8 +396,7 @@ class TestProxyLogging(unittest.TestCase):
req = Request.blank( req = Request.blank(
'/v1/a/c', '/v1/a/c',
environ={'REQUEST_METHOD': 'POST', environ={'REQUEST_METHOD': 'POST',
'wsgi.input': moves.cStringIO( 'wsgi.input': BytesIO(b'some stuff\nsome other stuff\n')})
'some stuff\nsome other stuff\n')})
resp = app(req.environ, start_response) resp = app(req.environ, start_response)
# exhaust generator # exhaust generator
[x for x in resp] [x for x in resp]

View File

@ -20,7 +20,7 @@ import tempfile
import unittest import unittest
from nose import SkipTest from nose import SkipTest
import six from six import BytesIO
from swift import gettext_ as _ from swift import gettext_ as _
from swift.common.swob import Request, Response from swift.common.swob import Request, Response
@ -110,9 +110,9 @@ class TestProfileMiddleware(unittest.TestCase):
self.headers = headers self.headers = headers
def test_combine_body_qs(self): def test_combine_body_qs(self):
body = "profile=all&sort=time&limit=-1&fulldirs=1&nfl_filter=__call__"\ body = (b"profile=all&sort=time&limit=-1&fulldirs=1"
+ "&query=query&metric=nc&format=default" b"&nfl_filter=__call__&query=query&metric=nc&format=default")
wsgi_input = six.StringIO(body) wsgi_input = BytesIO(body)
environ = {'REQUEST_METHOD': 'GET', environ = {'REQUEST_METHOD': 'GET',
'QUERY_STRING': 'profile=all&format=json', 'QUERY_STRING': 'profile=all&format=json',
'wsgi.input': wsgi_input} 'wsgi.input': wsgi_input}
@ -128,9 +128,8 @@ class TestProfileMiddleware(unittest.TestCase):
self.assertEqual(query_dict['format'], ['default']) self.assertEqual(query_dict['format'], ['default'])
def test_call(self): def test_call(self):
body = "sort=time&limit=-1&fulldirs=1&nfl_filter="\ body = b"sort=time&limit=-1&fulldirs=1&nfl_filter=&metric=nc"
+ "&metric=nc" wsgi_input = BytesIO(body + b'&query=query')
wsgi_input = six.StringIO(body + '&query=query')
environ = {'HTTP_HOST': 'localhost:8080', environ = {'HTTP_HOST': 'localhost:8080',
'PATH_INFO': '/__profile__', 'PATH_INFO': '/__profile__',
'REQUEST_METHOD': 'GET', 'REQUEST_METHOD': 'GET',
@ -140,7 +139,7 @@ class TestProfileMiddleware(unittest.TestCase):
self.assert_(resp[0].find('<html>') > 0, resp) self.assert_(resp[0].find('<html>') > 0, resp)
self.assertEqual(self.got_statuses, ['200 OK']) self.assertEqual(self.got_statuses, ['200 OK'])
self.assertEqual(self.headers, [('content-type', 'text/html')]) self.assertEqual(self.headers, [('content-type', 'text/html')])
wsgi_input = six.StringIO(body + '&plot=plot') wsgi_input = BytesIO(body + b'&plot=plot')
environ['wsgi.input'] = wsgi_input environ['wsgi.input'] = wsgi_input
if PLOTLIB_INSTALLED: if PLOTLIB_INSTALLED:
resp = self.app(environ, self.start_response) resp = self.app(environ, self.start_response)
@ -149,12 +148,12 @@ class TestProfileMiddleware(unittest.TestCase):
else: else:
resp = self.app(environ, self.start_response) resp = self.app(environ, self.start_response)
self.assertEqual(self.got_statuses, ['500 Internal Server Error']) self.assertEqual(self.got_statuses, ['500 Internal Server Error'])
wsgi_input = six.StringIO(body + '&download=download&format=default') wsgi_input = BytesIO(body + '&download=download&format=default')
environ['wsgi.input'] = wsgi_input environ['wsgi.input'] = wsgi_input
resp = self.app(environ, self.start_response) resp = self.app(environ, self.start_response)
self.assertEqual(self.headers, [('content-type', self.assertEqual(self.headers, [('content-type',
HTMLViewer.format_dict['default'])]) HTMLViewer.format_dict['default'])])
wsgi_input = six.StringIO(body + '&download=download&format=json') wsgi_input = BytesIO(body + '&download=download&format=json')
environ['wsgi.input'] = wsgi_input environ['wsgi.input'] = wsgi_input
resp = self.app(environ, self.start_response) resp = self.app(environ, self.start_response)
self.assert_(self.headers == [('content-type', self.assert_(self.headers == [('content-type',
@ -165,12 +164,12 @@ class TestProfileMiddleware(unittest.TestCase):
self.assertEqual(self.got_statuses, ['405 Method Not Allowed'], resp) self.assertEqual(self.got_statuses, ['405 Method Not Allowed'], resp)
# use a totally bogus profile identifier # use a totally bogus profile identifier
wsgi_input = six.StringIO(body + '&profile=ABC&download=download') wsgi_input = BytesIO(body + b'&profile=ABC&download=download')
environ['wsgi.input'] = wsgi_input environ['wsgi.input'] = wsgi_input
resp = self.app(environ, self.start_response) resp = self.app(environ, self.start_response)
self.assertEqual(self.got_statuses, ['404 Not Found'], resp) self.assertEqual(self.got_statuses, ['404 Not Found'], resp)
wsgi_input = six.StringIO(body + '&download=download&format=ods') wsgi_input = BytesIO(body + b'&download=download&format=ods')
environ['wsgi.input'] = wsgi_input environ['wsgi.input'] = wsgi_input
resp = self.app(environ, self.start_response) resp = self.app(environ, self.start_response)
if ODFLIB_INSTALLED: if ODFLIB_INSTALLED:
@ -298,9 +297,9 @@ class Test_html_viewer(unittest.TestCase):
self.log_files.append(self.profile_log.dump_profile(profiler, pid)) self.log_files.append(self.profile_log.dump_profile(profiler, pid))
self.viewer = HTMLViewer('__profile__', 'eventlet.green.profile', self.viewer = HTMLViewer('__profile__', 'eventlet.green.profile',
self.profile_log) self.profile_log)
body = "profile=123&profile=456&sort=time&sort=nc&limit=10"\ body = (b"profile=123&profile=456&sort=time&sort=nc&limit=10"
+ "&fulldirs=1&nfl_filter=getcwd&query=query&metric=nc" b"&fulldirs=1&nfl_filter=getcwd&query=query&metric=nc")
wsgi_input = six.StringIO(body) wsgi_input = BytesIO(body)
environ = {'REQUEST_METHOD': 'GET', environ = {'REQUEST_METHOD': 'GET',
'QUERY_STRING': 'profile=all', 'QUERY_STRING': 'profile=all',
'wsgi.input': wsgi_input} 'wsgi.input': wsgi_input}

View File

@ -21,7 +21,7 @@ import re
import time import time
from urllib import quote from urllib import quote
from six import StringIO from six import BytesIO
import swift.common.swob import swift.common.swob
from swift.common import utils, exceptions from swift.common import utils, exceptions
@ -476,22 +476,22 @@ class TestRequest(unittest.TestCase):
def test_blank_body_precedence(self): def test_blank_body_precedence(self):
req = swift.common.swob.Request.blank( req = swift.common.swob.Request.blank(
'/', environ={'REQUEST_METHOD': 'POST', '/', environ={'REQUEST_METHOD': 'POST',
'wsgi.input': StringIO('')}, 'wsgi.input': BytesIO(b'')},
headers={'Content-Type': 'text/plain'}, body='hi') headers={'Content-Type': 'text/plain'}, body='hi')
self.assertEquals(req.path_info, '/') self.assertEquals(req.path_info, '/')
self.assertEquals(req.body, 'hi') self.assertEquals(req.body, 'hi')
self.assertEquals(req.headers['Content-Type'], 'text/plain') self.assertEquals(req.headers['Content-Type'], 'text/plain')
self.assertEquals(req.method, 'POST') self.assertEquals(req.method, 'POST')
body_file = StringIO('asdf') body_file = BytesIO(b'asdf')
req = swift.common.swob.Request.blank( req = swift.common.swob.Request.blank(
'/', environ={'REQUEST_METHOD': 'POST', '/', environ={'REQUEST_METHOD': 'POST',
'wsgi.input': StringIO('')}, 'wsgi.input': BytesIO(b'')},
headers={'Content-Type': 'text/plain'}, body='hi', headers={'Content-Type': 'text/plain'}, body='hi',
body_file=body_file) body_file=body_file)
self.assert_(req.body_file is body_file) self.assert_(req.body_file is body_file)
req = swift.common.swob.Request.blank( req = swift.common.swob.Request.blank(
'/', environ={'REQUEST_METHOD': 'POST', '/', environ={'REQUEST_METHOD': 'POST',
'wsgi.input': StringIO('')}, 'wsgi.input': BytesIO(b'')},
headers={'Content-Type': 'text/plain'}, body='hi', headers={'Content-Type': 'text/plain'}, body='hi',
content_length=3) content_length=3)
self.assertEquals(req.content_length, 3) self.assertEquals(req.content_length, 3)

View File

@ -27,6 +27,7 @@ from collections import defaultdict
from urllib import quote from urllib import quote
from eventlet import listen from eventlet import listen
from six import BytesIO
from six import StringIO from six import StringIO
import mock import mock
@ -556,7 +557,7 @@ class TestWSGI(unittest.TestCase):
self.assertTrue('wsgi.input' in newenv) self.assertTrue('wsgi.input' in newenv)
self.assertEquals(newenv['wsgi.input'].read(), '') self.assertEquals(newenv['wsgi.input'].read(), '')
oldenv = {'wsgi.input': StringIO('original wsgi.input')} oldenv = {'wsgi.input': BytesIO(b'original wsgi.input')}
newenv = wsgi.make_pre_authed_env(oldenv) newenv = wsgi.make_pre_authed_env(oldenv)
self.assertTrue('wsgi.input' in newenv) self.assertTrue('wsgi.input' in newenv)
self.assertEquals(newenv['wsgi.input'].read(), '') self.assertEquals(newenv['wsgi.input'].read(), '')

View File

@ -16,7 +16,6 @@
import operator import operator
import os import os
import mock import mock
from six import StringIO
import unittest import unittest
import itertools import itertools
from contextlib import contextmanager from contextlib import contextmanager
@ -30,6 +29,8 @@ import random
from eventlet import spawn, Timeout, listen from eventlet import spawn, Timeout, listen
import simplejson import simplejson
from six import BytesIO
from six import StringIO
from swift import __version__ as swift_version from swift import __version__ as swift_version
from swift.common.swob import Request, HeaderKeyDict from swift.common.swob import Request, HeaderKeyDict
@ -2126,7 +2127,7 @@ class TestContainerController(unittest.TestCase):
self.assertEquals(resp.status_int, 507) self.assertEquals(resp.status_int, 507)
def test_through_call(self): def test_through_call(self):
inbuf = StringIO() inbuf = BytesIO()
errbuf = StringIO() errbuf = StringIO()
outbuf = StringIO() outbuf = StringIO()
@ -2152,7 +2153,7 @@ class TestContainerController(unittest.TestCase):
self.assertEquals(outbuf.getvalue()[:4], '404 ') self.assertEquals(outbuf.getvalue()[:4], '404 ')
def test_through_call_invalid_path(self): def test_through_call_invalid_path(self):
inbuf = StringIO() inbuf = BytesIO()
errbuf = StringIO() errbuf = StringIO()
outbuf = StringIO() outbuf = StringIO()
@ -2178,7 +2179,7 @@ class TestContainerController(unittest.TestCase):
self.assertEquals(outbuf.getvalue()[:4], '400 ') self.assertEquals(outbuf.getvalue()[:4], '400 ')
def test_through_call_invalid_path_utf8(self): def test_through_call_invalid_path_utf8(self):
inbuf = StringIO() inbuf = BytesIO()
errbuf = StringIO() errbuf = StringIO()
outbuf = StringIO() outbuf = StringIO()
@ -2466,7 +2467,7 @@ class TestContainerController(unittest.TestCase):
def test_correct_allowed_method(self): def test_correct_allowed_method(self):
# Test correct work for allowed method using # Test correct work for allowed method using
# swift.container.server.ContainerController.__call__ # swift.container.server.ContainerController.__call__
inbuf = StringIO() inbuf = BytesIO()
errbuf = StringIO() errbuf = StringIO()
outbuf = StringIO() outbuf = StringIO()
self.controller = container_server.ContainerController( self.controller = container_server.ContainerController(
@ -2503,7 +2504,7 @@ class TestContainerController(unittest.TestCase):
def test_not_allowed_method(self): def test_not_allowed_method(self):
# Test correct work for NOT allowed method using # Test correct work for NOT allowed method using
# swift.container.server.ContainerController.__call__ # swift.container.server.ContainerController.__call__
inbuf = StringIO() inbuf = BytesIO()
errbuf = StringIO() errbuf = StringIO()
outbuf = StringIO() outbuf = StringIO()
self.controller = container_server.ContainerController( self.controller = container_server.ContainerController(
@ -2539,7 +2540,7 @@ class TestContainerController(unittest.TestCase):
self.assertEqual(response, answer) self.assertEqual(response, answer)
def test_call_incorrect_replication_method(self): def test_call_incorrect_replication_method(self):
inbuf = StringIO() inbuf = BytesIO()
errbuf = StringIO() errbuf = StringIO()
outbuf = StringIO() outbuf = StringIO()
self.controller = container_server.ContainerController( self.controller = container_server.ContainerController(

View File

@ -23,6 +23,7 @@ import errno
import operator import operator
import os import os
import mock import mock
import six
from six import StringIO from six import StringIO
import unittest import unittest
import math import math
@ -1017,7 +1018,7 @@ class TestObjectController(unittest.TestCase):
headers={'X-Timestamp': timestamp, headers={'X-Timestamp': timestamp,
'Content-Type': 'text/plain', 'Content-Type': 'text/plain',
'Content-Length': '6'}) 'Content-Length': '6'})
req.environ['wsgi.input'] = WsgiStringIO('VERIFY') req.environ['wsgi.input'] = WsgiStringIO(b'VERIFY')
resp = req.get_response(self.object_controller) resp = req.get_response(self.object_controller)
self.assertEquals(resp.status_int, 408) self.assertEquals(resp.status_int, 408)
@ -5326,6 +5327,8 @@ class TestObjectServer(unittest.TestCase):
"potato potato potato potato potato potato potato", "potato potato potato potato potato potato potato",
"--boundary123--" "--boundary123--"
)) ))
if six.PY3:
test_doc = test_doc.encode('utf-8')
# phase1 - PUT request with object metadata in footer and # phase1 - PUT request with object metadata in footer and
# multiphase commit conversation # multiphase commit conversation

View File

@ -41,6 +41,7 @@ import random
import mock import mock
from eventlet import sleep, spawn, wsgi, listen, Timeout from eventlet import sleep, spawn, wsgi, listen, Timeout
from six import BytesIO
from six import StringIO from six import StringIO
from six.moves import range from six.moves import range
from swift.common.utils import hash_path, json, storage_directory, \ from swift.common.utils import hash_path, json, storage_directory, \
@ -1300,7 +1301,7 @@ class TestObjectController(unittest.TestCase):
req = Request.blank( req = Request.blank(
'/v1/a/c1/wrong-o', '/v1/a/c1/wrong-o',
environ={'REQUEST_METHOD': 'PUT', environ={'REQUEST_METHOD': 'PUT',
'wsgi.input': StringIO("hello")}, 'wsgi.input': BytesIO(b"hello")},
headers={'Content-Type': 'text/plain', headers={'Content-Type': 'text/plain',
'Content-Length': '5', 'Content-Length': '5',
'X-Backend-Storage-Policy-Index': '2'}) 'X-Backend-Storage-Policy-Index': '2'})