Merge "Port swob to Python 3"
This commit is contained in:
commit
2b521dfbaa
@ -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):
|
||||
|
@ -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 = {}
|
||||
|
Loading…
x
Reference in New Issue
Block a user