From fe9a126a2af1b4256040752aaf7feeeab6ebe7fc Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Tue, 20 May 2014 23:53:20 +0200 Subject: [PATCH] http: Enforce router's URL namespace --- mopidy/http/__init__.py | 5 +++-- mopidy/http/actor.py | 19 +++++++++++-------- tests/http/test_router.py | 2 +- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/mopidy/http/__init__.py b/mopidy/http/__init__.py index d9d873d8..2aabdd60 100644 --- a/mopidy/http/__init__.py +++ b/mopidy/http/__init__.py @@ -98,7 +98,8 @@ class Router(object): server side functionality, this method must be overridden. Must return a list of request handlers compatible with - :class:`tornado.web.Application`. + :class:`tornado.web.Application`. The URL patterns should not include + the :attr:`name` prefix, as that will be prepended by the web server. """ if self.static_file_path is None: raise ValueError('Undefined static file path in %s' % self) @@ -108,7 +109,7 @@ class Router(object): logger.info( 'Serving HTTP extension %s at %s', type(self), self.get_root_url()) return [ - (r'/%s/(.*)' % self.name, StaticFileHandler, { + (r'/(.*)', StaticFileHandler, { 'path': self.static_file_path, 'default_filename': 'index.html' }), diff --git a/mopidy/http/actor.py b/mopidy/http/actor.py index 56f815e8..ee5b7fe7 100644 --- a/mopidy/http/actor.py +++ b/mopidy/http/actor.py @@ -79,13 +79,16 @@ class HttpFrontend(pykka.ThreadingActor, CoreListener): return request_handlers def _get_extension_request_handlers(self): - request_handlers = [] + result = [] for router_class in self.routers: router = router_class(self.config, self.core) - request_handlers.extend(router.get_request_handlers()) - logger.info( - 'Loaded HTTP extension: %s', router_class.__name__) - return request_handlers + request_handlers = router.get_request_handlers() + for handler in request_handlers: + handler = list(handler) + handler[0] = '/%s%s' % (router.name, handler[0]) + result.append(tuple(handler)) + logger.info('Loaded HTTP extension: %s', router_class.__name__) + return result def _publish_zeroconf(self): if not self.zeroconf_name: @@ -126,9 +129,9 @@ class MopidyHttpRouter(http.Router): def get_request_handlers(self): return [ - (r'/mopidy/ws/?', handlers.WebSocketHandler, {'core': self.core}), - (r'/mopidy/rpc', handlers.JsonRpcHandler, {'core': self.core}), - (r'/mopidy/(.*)', handlers.StaticFileHandler, { + (r'/ws/?', handlers.WebSocketHandler, {'core': self.core}), + (r'/rpc', handlers.JsonRpcHandler, {'core': self.core}), + (r'/(.*)', handlers.StaticFileHandler, { 'path': mopidy_data_dir, 'default_filename': 'mopidy.html' }), ] diff --git a/tests/http/test_router.py b/tests/http/test_router.py index 2e24c1bf..759dde9b 100644 --- a/tests/http/test_router.py +++ b/tests/http/test_router.py @@ -45,7 +45,7 @@ class HttpRouterTest(unittest.TestCase): (pattern, handler_class, kwargs) = router.get_request_handlers()[0] - self.assertEqual(pattern, r'/test/(.*)') + self.assertEqual(pattern, r'/(.*)') self.assertIs(handler_class, handlers.StaticFileHandler) self.assertEqual( kwargs['path'], os.path.join(os.path.dirname(__file__), 'static'))