Merge "Fix for unicode issues in staticweb"
This commit is contained in:
commit
37e96663ec
@ -280,7 +280,10 @@ class _StaticWebContext(WSGIContext):
|
||||
' </tr>\n'
|
||||
for item in listing:
|
||||
if 'subdir' in item:
|
||||
subdir = item['subdir']
|
||||
if isinstance(item['subdir'], unicode):
|
||||
subdir = item['subdir'].encode('utf-8')
|
||||
else:
|
||||
subdir = item['subdir']
|
||||
if prefix:
|
||||
subdir = subdir[len(prefix):]
|
||||
body += ' <tr class="item subdir">\n' \
|
||||
@ -291,7 +294,10 @@ class _StaticWebContext(WSGIContext):
|
||||
(quote(subdir), cgi.escape(subdir))
|
||||
for item in listing:
|
||||
if 'name' in item:
|
||||
name = item['name']
|
||||
if isinstance(item['name'], unicode):
|
||||
name = item['name'].encode('utf-8')
|
||||
else:
|
||||
name = item['name']
|
||||
if prefix:
|
||||
name = name[len(prefix):]
|
||||
body += ' <tr class="item %s">\n' \
|
||||
|
@ -209,6 +209,14 @@ class FakeApp(object):
|
||||
'/absolute/listing.css'})
|
||||
elif env['PATH_INFO'] == '/v1/a/c9/subdir/':
|
||||
return Response(status='404 Not Found')(env, start_response)
|
||||
elif env['PATH_INFO'] in ('/v1/a/c10', '/v1/a/c10/'):
|
||||
return self.listing(env, start_response,
|
||||
{'x-container-read': '.r:*',
|
||||
'x-container-meta-web-listings': 't'})
|
||||
elif env['PATH_INFO'] == '/v1/a/c10/\xe2\x98\x83/':
|
||||
return Response(status='404 Not Found')(env, start_response)
|
||||
elif env['PATH_INFO'] == '/v1/a/c10/\xe2\x98\x83/\xe2\x98\x83/':
|
||||
return Response(status='404 Not Found')(env, start_response)
|
||||
else:
|
||||
raise Exception('Unknown path %r' % env['PATH_INFO'])
|
||||
|
||||
@ -216,8 +224,8 @@ class FakeApp(object):
|
||||
if env['PATH_INFO'] in ('/v1/a/c3', '/v1/a/c4', '/v1/a/c8', \
|
||||
'/v1/a/c9') and \
|
||||
env['QUERY_STRING'] == 'delimiter=/&format=json&prefix=subdir/':
|
||||
headers.update({'X-Container-Object-Count': '11',
|
||||
'X-Container-Bytes-Used': '73741',
|
||||
headers.update({'X-Container-Object-Count': '12',
|
||||
'X-Container-Bytes-Used': '73763',
|
||||
'X-Container-Read': '.r:*',
|
||||
'Content-Type': 'application/json; charset=utf-8'})
|
||||
body = '''
|
||||
@ -233,15 +241,15 @@ class FakeApp(object):
|
||||
'''.strip()
|
||||
elif env['PATH_INFO'] == '/v1/a/c3' and env['QUERY_STRING'] == \
|
||||
'delimiter=/&format=json&prefix=subdiry/':
|
||||
headers.update({'X-Container-Object-Count': '11',
|
||||
'X-Container-Bytes-Used': '73741',
|
||||
headers.update({'X-Container-Object-Count': '12',
|
||||
'X-Container-Bytes-Used': '73763',
|
||||
'X-Container-Read': '.r:*',
|
||||
'Content-Type': 'application/json; charset=utf-8'})
|
||||
body = '[]'
|
||||
elif env['PATH_INFO'] == '/v1/a/c3' and env['QUERY_STRING'] == \
|
||||
'limit=1&format=json&delimiter=/&limit=1&prefix=subdirz/':
|
||||
headers.update({'X-Container-Object-Count': '11',
|
||||
'X-Container-Bytes-Used': '73741',
|
||||
headers.update({'X-Container-Object-Count': '12',
|
||||
'X-Container-Bytes-Used': '73763',
|
||||
'X-Container-Read': '.r:*',
|
||||
'Content-Type': 'application/json; charset=utf-8'})
|
||||
body = '''
|
||||
@ -252,8 +260,8 @@ class FakeApp(object):
|
||||
'''.strip()
|
||||
elif env['PATH_INFO'] == '/v1/a/c6' and env['QUERY_STRING'] == \
|
||||
'limit=1&format=json&delimiter=/&limit=1&prefix=subdir/':
|
||||
headers.update({'X-Container-Object-Count': '11',
|
||||
'X-Container-Bytes-Used': '73741',
|
||||
headers.update({'X-Container-Object-Count': '12',
|
||||
'X-Container-Bytes-Used': '73763',
|
||||
'X-Container-Read': '.r:*',
|
||||
'X-Container-Web-Listings': 't',
|
||||
'Content-Type': 'application/json; charset=utf-8'})
|
||||
@ -263,11 +271,27 @@ class FakeApp(object):
|
||||
"content_type":"text/plain",
|
||||
"last_modified":"2011-03-24T04:27:52.709100"}]
|
||||
'''.strip()
|
||||
elif env['PATH_INFO'] == '/v1/a/c10' and (env['QUERY_STRING'] == \
|
||||
'delimiter=/&format=json&prefix=%E2%98%83/' or
|
||||
env['QUERY_STRING'] == \
|
||||
'delimiter=/&format=json&prefix=%E2%98%83/%E2%98%83/'):
|
||||
headers.update({'X-Container-Object-Count': '12',
|
||||
'X-Container-Bytes-Used': '73763',
|
||||
'X-Container-Read': '.r:*',
|
||||
'X-Container-Web-Listings': 't',
|
||||
'Content-Type': 'application/json; charset=utf-8'})
|
||||
body = '''
|
||||
[{"name":"\u2603/\u2603/one.txt",
|
||||
"hash":"73f1dd69bacbf0847cc9cffa3c6b23a1", "bytes":22,
|
||||
"content_type":"text/plain",
|
||||
"last_modified":"2011-03-24T04:27:52.709100"},
|
||||
{"subdir":"\u2603/\u2603/"}]
|
||||
'''.strip()
|
||||
elif 'prefix=' in env['QUERY_STRING']:
|
||||
return Response(status='204 No Content')(env, start_response)
|
||||
elif 'format=json' in env['QUERY_STRING']:
|
||||
headers.update({'X-Container-Object-Count': '11',
|
||||
'X-Container-Bytes-Used': '73741',
|
||||
headers.update({'X-Container-Object-Count': '12',
|
||||
'X-Container-Bytes-Used': '73763',
|
||||
'Content-Type': 'application/json; charset=utf-8'})
|
||||
body = '''
|
||||
[{"name":"401error.html",
|
||||
@ -310,16 +334,21 @@ class FakeApp(object):
|
||||
"last_modified":"2011-03-24T04:27:52.751260"},
|
||||
{"name":"two.txt", "hash":"10abb84c63a5cff379fdfd6385918833",
|
||||
"bytes":22, "content_type":"text/plain",
|
||||
"last_modified":"2011-03-24T04:27:52.825110"}]
|
||||
"last_modified":"2011-03-24T04:27:52.825110"},
|
||||
{"name":"\u2603/\u2603/one.txt",
|
||||
"hash":"73f1dd69bacbf0847cc9cffa3c6b23a1", "bytes":22,
|
||||
"content_type":"text/plain",
|
||||
"last_modified":"2011-03-24T04:27:52.935560"}]
|
||||
'''.strip()
|
||||
else:
|
||||
headers.update({'X-Container-Object-Count': '11',
|
||||
'X-Container-Bytes-Used': '73741',
|
||||
headers.update({'X-Container-Object-Count': '12',
|
||||
'X-Container-Bytes-Used': '73763',
|
||||
'Content-Type': 'text/plain; charset=utf-8'})
|
||||
body = '\n'.join(['401error.html', '404error.html', 'index.html',
|
||||
'listing.css', 'one.txt', 'subdir/1.txt',
|
||||
'subdir/2.txt', u'subdir/\u2603.txt', 'subdir2',
|
||||
'subdir3/subsubdir/index.html', 'two.txt'])
|
||||
'subdir3/subsubdir/index.html', 'two.txt',
|
||||
u'\u2603/\u2603/one.txt'])
|
||||
return Response(status='200 Ok', headers=headers,
|
||||
body=body)(env, start_response)
|
||||
|
||||
@ -616,6 +645,22 @@ class TestStaticWeb(unittest.TestCase):
|
||||
self.assert_('<link' in resp.body)
|
||||
self.assert_('href="/absolute/listing.css"' in resp.body)
|
||||
|
||||
def test_container10unicodesubdirlisting(self):
|
||||
resp = Request.blank(
|
||||
'/v1/a/c10/').get_response(self.test_staticweb)
|
||||
self.assertEquals(resp.status_int, 200)
|
||||
self.assert_('Listing of /v1/a/c10/' in resp.body)
|
||||
resp = Request.blank(
|
||||
'/v1/a/c10/\xe2\x98\x83/').get_response(self.test_staticweb)
|
||||
self.assertEquals(resp.status_int, 200)
|
||||
self.assert_('Listing of /v1/a/c10/\xe2\x98\x83/' in resp.body)
|
||||
resp = Request.blank(
|
||||
'/v1/a/c10/\xe2\x98\x83/\xe2\x98\x83/'
|
||||
).get_response(self.test_staticweb)
|
||||
self.assertEquals(resp.status_int, 200)
|
||||
self.assert_(
|
||||
'Listing of /v1/a/c10/\xe2\x98\x83/\xe2\x98\x83/' in resp.body)
|
||||
|
||||
def test_subrequest_once_if_possible(self):
|
||||
resp = Request.blank(
|
||||
'/v1/a/c4/one.txt').get_response(self.test_staticweb)
|
||||
|
Loading…
x
Reference in New Issue
Block a user