Merge "Port swob to Python 3"

This commit is contained in:
Jenkins 2015-10-08 06:05:17 +00:00 committed by Gerrit Code Review
commit 2b521dfbaa
2 changed files with 40 additions and 11 deletions

View File

@ -35,14 +35,11 @@ place to keep Swift working every time webob decides some interface
needs to change.
"""
from collections import defaultdict
import UserDict
from collections import defaultdict, MutableMapping
import time
from functools import partial
from datetime import datetime, timedelta, tzinfo
from email.utils import parsedate
import urlparse
import urllib2
import re
import random
import functools
@ -50,6 +47,7 @@ import inspect
from six import BytesIO
from six import StringIO
from six.moves import urllib
from swift.common.utils import reiterate, split_path, Timestamp, pairs, \
close_if_possible
@ -218,7 +216,7 @@ def _header_int_property(header):
doc="Retrieve and set the %s header as an int" % header)
class HeaderEnvironProxy(UserDict.DictMixin):
class HeaderEnvironProxy(MutableMapping):
"""
A dict-like object that proxies requests to a wsgi environ,
rewriting header keys to environ keys.
@ -229,6 +227,13 @@ class HeaderEnvironProxy(UserDict.DictMixin):
def __init__(self, environ):
self.environ = environ
def __iter__(self):
for k in self.keys():
yield k
def __len__(self):
return len(self.keys())
def _normalize(self, key):
key = 'HTTP_' + key.replace('-', '_').upper()
if key == 'HTTP_CONTENT_LENGTH':
@ -844,7 +849,7 @@ class Request(object):
environ = environ or {}
if isinstance(path, unicode):
path = path.encode('utf-8')
parsed_path = urlparse.urlparse(path)
parsed_path = urllib.parse.urlparse(path)
server_name = 'localhost'
if parsed_path.netloc:
server_name = parsed_path.netloc.split(':', 1)[0]
@ -859,7 +864,7 @@ class Request(object):
'REQUEST_METHOD': 'GET',
'SCRIPT_NAME': '',
'QUERY_STRING': parsed_path.query,
'PATH_INFO': urllib2.unquote(parsed_path.path),
'PATH_INFO': urllib.parse.unquote(parsed_path.path),
'SERVER_NAME': server_name,
'SERVER_PORT': str(server_port),
'HTTP_HOST': '%s:%d' % (server_name, server_port),
@ -897,7 +902,7 @@ class Request(object):
if self._params_cache is None:
if 'QUERY_STRING' in self.environ:
self._params_cache = dict(
urlparse.parse_qsl(self.environ['QUERY_STRING'], True))
urllib.parse.parse_qsl(self.environ['QUERY_STRING'], True))
else:
self._params_cache = {}
return self._params_cache
@ -930,8 +935,8 @@ class Request(object):
@property
def path(self):
"Provides the full path of the request, excluding the QUERY_STRING"
return urllib2.quote(self.environ.get('SCRIPT_NAME', '') +
self.environ['PATH_INFO'])
return urllib.parse.quote(self.environ.get('SCRIPT_NAME', '') +
self.environ['PATH_INFO'])
@property
def swift_entity_path(self):
@ -1357,7 +1362,7 @@ class Response(object):
realm = 'unknown'
except (AttributeError, ValueError):
realm = 'unknown'
return 'Swift realm="%s"' % urllib2.quote(realm)
return 'Swift realm="%s"' % urllib.parse.quote(realm)
@property
def is_success(self):

View File

@ -41,6 +41,29 @@ class TestHeaderEnvironProxy(unittest.TestCase):
self.assertEquals(proxy['content-length'], '20')
self.assertEquals(proxy['content-type'], 'text/plain')
self.assertEquals(proxy['something-else'], 'somevalue')
self.assertEqual(set(['Something-Else',
'Content-Length', 'Content-Type']),
set(proxy.keys()))
self.assertEqual(list(iter(proxy)), proxy.keys())
self.assertEqual(3, len(proxy))
def test_ignored_keys(self):
# Constructor doesn't normalize keys
key = 'wsgi.input'
environ = {key: ''}
proxy = swift.common.swob.HeaderEnvironProxy(environ)
self.assertEqual([], list(iter(proxy)))
self.assertEqual([], proxy.keys())
self.assertEqual(0, len(proxy))
self.assertRaises(KeyError, proxy.__getitem__, key)
self.assertNotIn(key, proxy)
proxy['Content-Type'] = 'text/plain'
self.assertEqual(['Content-Type'], list(iter(proxy)))
self.assertEqual(['Content-Type'], proxy.keys())
self.assertEqual(1, len(proxy))
self.assertEqual('text/plain', proxy['Content-Type'])
self.assertIn('Content-Type', proxy)
def test_del(self):
environ = {}
@ -52,6 +75,7 @@ class TestHeaderEnvironProxy(unittest.TestCase):
del proxy['Content-Type']
del proxy['Something-Else']
self.assertEquals(proxy.environ, {})
self.assertEqual(0, len(proxy))
def test_contains(self):
environ = {}