http: Remove static file serving from the Router

This commit is contained in:
Stein Magnus Jodal 2014-06-04 20:55:28 +02:00
parent eea6138b3d
commit d13194dfa4
2 changed files with 12 additions and 62 deletions

View File

@ -62,58 +62,28 @@ class Router(object):
Must be overridden by all subclasses.
This should be the same as the ``ext_name`` of the Mopidy extension
implementing an HTTP router. The :attr:`~Router.name` will be used to
namespace all URLs handled by this router.
This should be the same as the :attr:`~mopidy.ext.Extension.ext_name` of
the Mopidy extension implementing an HTTP router. The :attr:`~Router.name`
will be used to namespace all URLs handled by this router.
For example, if :attr:`~Router.name` is ``soundspot``, then the router will
manage all requests starting with ``http://localhost:6680/soundspot``.
"""
static_file_path = None
"""Path to location of static files to be served.
If you only need to serve static files, set this attribute and use the
default implementation of :meth:`~Router.get_request_handlers`.
If you override :meth:`~Router.get_request_handlers` this attribute is not
used.
"""
def __init__(self, config, core):
self.config = config
self.core = core
self.hostname = config['http']['hostname']
self.port = config['http']['port']
if not self.name:
raise ValueError('Undefined router name in %s' % self)
def get_root_url(self):
"""Get the absolute URL to the root of this router."""
return 'http://%s:%s/%s/' % (self.hostname, self.port, self.name)
raise ValueError('Router name must be set')
def get_request_handlers(self):
"""
Get request handlers for the URL namespace owned by this router.
The default implementation of this method serves static files from
:attr:`static_file_path`. To extend the HTTP server with more
server side functionality, this method must be overridden.
Must be overridden by all subclasses.
Must return a list of request handlers compatible with
Returns a list of request handlers compatible with
: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)
from mopidy.http.handlers import StaticFileHandler
logger.info(
'Serving HTTP extension %s at %s', type(self), self.get_root_url())
return [
(r'/(.*)', StaticFileHandler, {
'path': self.static_file_path,
'default_filename': 'index.html'
}),
]
raise NotImplementedError

View File

@ -6,7 +6,6 @@ import unittest
import mock
from mopidy import http
from mopidy.http import handlers
class TestRouter(http.Router):
@ -14,12 +13,8 @@ class TestRouter(http.Router):
static_file_path = os.path.join(os.path.dirname(__file__), 'static')
class TestRouterMissingPath(http.Router):
name = 'test'
class TestRouterMissingName(http.Router):
static_file_path = os.path.join(os.path.dirname(__file__), 'static')
pass
class HttpRouterTest(unittest.TestCase):
@ -40,27 +35,12 @@ class HttpRouterTest(unittest.TestCase):
self.assertIs(router.config, self.config)
self.assertIs(router.core, self.core)
def test_default_request_handlers(self):
router = TestRouter(self.config, self.core)
(pattern, handler_class, kwargs) = router.get_request_handlers()[0]
self.assertEqual(pattern, r'/(.*)')
self.assertIs(handler_class, handlers.StaticFileHandler)
self.assertEqual(
kwargs['path'], os.path.join(os.path.dirname(__file__), 'static'))
def test_default_router_missing_name(self):
def test_undefined_name_raises_error(self):
with self.assertRaises(ValueError):
TestRouterMissingName(self.config, self.core)
def test_default_router_missing_path(self):
router = TestRouterMissingPath(self.config, self.core)
with self.assertRaises(ValueError):
router.get_request_handlers()
def test_get_root_url(self):
def test_undefined_request_handlers_raises_error(self):
router = TestRouter(self.config, self.core)
self.assertEqual('http://127.0.0.1:6680/test/', router.get_root_url())
with self.assertRaises(NotImplementedError):
router.get_request_handlers()