Add support for URLs and absolute paths in staticweb CSS listings.
Fixes bug 939267. Return the quoted web-listings-css value if it starts with '/', 'http://', or 'https://.' All other values are treated as relative paths. Change-Id: I55ee4ec77cf8db99aa48c9a398e29767b200e1eb
This commit is contained in:
parent
48f7af6195
commit
f73cf2b3eb
@ -307,8 +307,7 @@ class StaticWeb(object):
|
||||
cgi.escape(env['PATH_INFO'])
|
||||
if self._listings_css:
|
||||
body += ' <link rel="stylesheet" type="text/css" ' \
|
||||
'href="%s%s" />\n' % \
|
||||
('../' * prefix.count('/'), quote(self._listings_css))
|
||||
'href="%s" />\n' % (self._build_css_path(prefix))
|
||||
else:
|
||||
body += ' <style type="text/css">\n' \
|
||||
' h1 {font-size: 1em; font-weight: bold;}\n' \
|
||||
@ -366,6 +365,19 @@ class StaticWeb(object):
|
||||
self._log_response(env, resp.status_int)
|
||||
return resp(env, start_response)
|
||||
|
||||
def _build_css_path(self, prefix=''):
|
||||
"""
|
||||
Constructs a relative path from a given prefix within the container.
|
||||
URLs and paths starting with '/' are not modified.
|
||||
|
||||
:param prefix: The prefix for the container listing.
|
||||
"""
|
||||
if self._listings_css.startswith(('/', 'http://', 'https://')):
|
||||
css_path = quote(self._listings_css, ':/')
|
||||
else:
|
||||
css_path = '../' * prefix.count('/') + quote(self._listings_css)
|
||||
return css_path
|
||||
|
||||
def _handle_container(self, env, start_response):
|
||||
"""
|
||||
Handles a possible static web request for a container.
|
||||
|
@ -182,11 +182,30 @@ class FakeApp(object):
|
||||
return self.listing(env, start_response,
|
||||
{'x-container-read': '.r:*',
|
||||
'x-container-meta-web-listings': 'f'})
|
||||
elif env['PATH_INFO'] in ('/v1/a/c8', '/v1/a/c8/'):
|
||||
return self.listing(env, start_response,
|
||||
{'x-container-read': '.r:*',
|
||||
'x-container-meta-web-error': 'error.html',
|
||||
'x-container-meta-web-listings': 't',
|
||||
'x-container-meta-web-listings-css': \
|
||||
'http://localhost/stylesheets/listing.css'})
|
||||
elif env['PATH_INFO'] == '/v1/a/c8/subdir/':
|
||||
return Response(status='404 Not Found')(env, start_response)
|
||||
elif env['PATH_INFO'] in ('/v1/a/c9', '/v1/a/c9/'):
|
||||
return self.listing(env, start_response,
|
||||
{'x-container-read': '.r:*',
|
||||
'x-container-meta-web-error': 'error.html',
|
||||
'x-container-meta-web-listings': 't',
|
||||
'x-container-meta-web-listings-css': \
|
||||
'/absolute/listing.css'})
|
||||
elif env['PATH_INFO'] == '/v1/a/c9/subdir/':
|
||||
return Response(status='404 Not Found')(env, start_response)
|
||||
else:
|
||||
raise Exception('Unknown path %r' % env['PATH_INFO'])
|
||||
|
||||
def listing(self, env, start_response, headers):
|
||||
if env['PATH_INFO'] in ('/v1/a/c3', '/v1/a/c4') and \
|
||||
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',
|
||||
@ -417,6 +436,7 @@ class TestStaticWeb(unittest.TestCase):
|
||||
resp = Request.blank('/v1/a/c4/').get_response(self.test_staticweb)
|
||||
self.assertEquals(resp.status_int, 200)
|
||||
self.assert_('Listing of /v1/a/c4/' in resp.body)
|
||||
self.assert_('href="listing.css"' in resp.body)
|
||||
|
||||
def test_container4indexhtmlauthed(self):
|
||||
resp = Request.blank('/v1/a/c4').get_response(self.test_staticweb)
|
||||
@ -479,7 +499,7 @@ class TestStaticWeb(unittest.TestCase):
|
||||
self.assert_('Listing of /v1/a/c4/subdir/' in resp.body)
|
||||
self.assert_('</style>' not in resp.body)
|
||||
self.assert_('<link' in resp.body)
|
||||
self.assert_('listing.css' in resp.body)
|
||||
self.assert_('href="../listing.css"' in resp.body)
|
||||
self.assertEquals(resp.headers['content-type'],
|
||||
'text/html; charset=UTF-8')
|
||||
|
||||
@ -512,6 +532,40 @@ class TestStaticWeb(unittest.TestCase):
|
||||
resp = Request.blank('/v1/a/c7/').get_response(self.test_staticweb)
|
||||
self.assertEquals(resp.status_int, 404)
|
||||
|
||||
def test_container8listingcss(self):
|
||||
resp = Request.blank(
|
||||
'/v1/a/c8/').get_response(self.test_staticweb)
|
||||
self.assertEquals(resp.status_int, 200)
|
||||
self.assert_('Listing of /v1/a/c8/' in resp.body)
|
||||
self.assert_('<link' in resp.body)
|
||||
self.assert_(
|
||||
'href="http://localhost/stylesheets/listing.css"' in resp.body)
|
||||
|
||||
def test_container8subdirlistingcss(self):
|
||||
resp = Request.blank(
|
||||
'/v1/a/c8/subdir/').get_response(self.test_staticweb)
|
||||
self.assertEquals(resp.status_int, 200)
|
||||
self.assert_('Listing of /v1/a/c8/subdir/' in resp.body)
|
||||
self.assert_('<link' in resp.body)
|
||||
self.assert_(
|
||||
'href="http://localhost/stylesheets/listing.css"' in resp.body)
|
||||
|
||||
def test_container9listingcss(self):
|
||||
resp = Request.blank(
|
||||
'/v1/a/c9/').get_response(self.test_staticweb)
|
||||
self.assertEquals(resp.status_int, 200)
|
||||
self.assert_('Listing of /v1/a/c9/' in resp.body)
|
||||
self.assert_('<link' in resp.body)
|
||||
self.assert_('href="/absolute/listing.css"' in resp.body)
|
||||
|
||||
def test_container9subdirlistingcss(self):
|
||||
resp = Request.blank(
|
||||
'/v1/a/c9/subdir/').get_response(self.test_staticweb)
|
||||
self.assertEquals(resp.status_int, 200)
|
||||
self.assert_('Listing of /v1/a/c9/subdir/' in resp.body)
|
||||
self.assert_('<link' in resp.body)
|
||||
self.assert_('href="/absolute/listing.css"' in resp.body)
|
||||
|
||||
def test_subrequest_once_if_possible(self):
|
||||
resp = Request.blank(
|
||||
'/v1/a/c4/one.txt').get_response(self.test_staticweb)
|
||||
@ -519,8 +573,6 @@ class TestStaticWeb(unittest.TestCase):
|
||||
self.assertEquals(resp.headers['x-object-meta-test'], 'value')
|
||||
self.assertEquals(resp.body, '1')
|
||||
self.assertEquals(self.app.calls, 1)
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
Loading…
Reference in New Issue
Block a user