Fix handling of bad paths in Swift middleware

The path //v1/account does not denote any Swift resource. More
importantly, if you call swift.common.utils.split_path() on it (as the
Swift middleware does), then you get a ValueError.

Since it's a bad path, it doesn't refer to any Swift resource, so
there's no stats to publish, so we can just catch and ignore
ValueError.

Change-Id: I9908beef8478c5407985435c1526a9c72edb1d3a
This commit is contained in:
Samuel Merritt 2013-09-10 17:30:14 -07:00
parent f505ae11b7
commit 288a9d77c5
2 changed files with 12 additions and 1 deletions

View File

@ -114,7 +114,10 @@ class CeilometerMiddleware(object):
def publish_sample(self, env, bytes_received, bytes_sent):
req = REQUEST.Request(env)
version, account, container, obj = split_path(req.path, 1, 4, True)
try:
version, account, container, obj = split_path(req.path, 1, 4, True)
except ValueError:
return
now = timeutils.utcnow().isoformat()
resource_metadata = {

View File

@ -240,3 +240,11 @@ class TestSwiftMiddleware(base.TestCase):
self.assertEqual(data.resource_metadata['version'], '1.0')
self.assertEqual(data.resource_metadata['container'], 'container')
self.assertEqual(data.resource_metadata['object'], None)
def test_bogus_path(self):
app = swift_middleware.CeilometerMiddleware(FakeApp(), {})
req = Request.blank('//v1/account/container',
environ={'REQUEST_METHOD': 'GET'})
list(app(req.environ, self.start_response))
samples = self.pipeline_manager.pipelines[0].samples
self.assertEqual(len(samples), 0)