summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--server/src/leap/soledad/server/_resource.py42
-rw-r--r--testing/tests/server/test__resource.py27
2 files changed, 28 insertions, 41 deletions
diff --git a/server/src/leap/soledad/server/_resource.py b/server/src/leap/soledad/server/_resource.py
index 046e20d1..fec290a2 100644
--- a/server/src/leap/soledad/server/_resource.py
+++ b/server/src/leap/soledad/server/_resource.py
@@ -17,11 +17,9 @@
"""
A twisted resource that serves the Soledad Server.
"""
-from twisted.web.error import Error
from twisted.web.resource import Resource
from ._blobs import blobs_resource
-from ._config import get_config
from ._server_info import ServerInfo
from ._wsgi import get_sync_resource
@@ -35,33 +33,25 @@ class SoledadResource(Resource):
for the Soledad Server.
"""
- def __init__(self, sync_pool=None):
- conf = get_config()
- self._blobs_enabled = conf['soledad-server']['blobs']
- server_info = ServerInfo(self._blobs_enabled)
- sync_resource = get_sync_resource(sync_pool)
- self.children = {
- '': server_info,
- 'sync': sync_resource,
- 'blobs': blobs_resource,
- 'sync': sync_resource,
- }
+ def __init__(self, conf, sync_pool=None):
+ Resource.__init__(self)
+
+ blobs_enabled = conf['soledad-server']['blobs']
- def getChild(self, path, request):
- """
- Decide which child resource to serve based on the given path.
- """
# requests to / return server information
- if path == '':
- return self.children['']
+ server_info = ServerInfo(blobs_enabled)
+ self.putChild('', server_info)
# requests to /blobs will serve blobs if enabled
- if path == 'blobs':
- if not self._blobs_enabled:
- msg = 'Blobs feature is disabled in this server.'
- raise Error(403, message=msg)
- return self.children['blobs']
+ if blobs_enabled:
+ self.putChild('blobs', blobs_resource)
- # other requesta are routed to legacy sync resource
+ # other requests are routed to legacy sync resource
+ self._sync_resource = get_sync_resource(sync_pool)
+
+ def getChild(self, path, request):
+ """
+ Route requests to legacy WSGI sync resource dynamically.
+ """
request.postpath.insert(0, request.prepath.pop())
- return self.children['sync']
+ return self._sync_resource
diff --git a/testing/tests/server/test__resource.py b/testing/tests/server/test__resource.py
index 2a387416..30ef782d 100644
--- a/testing/tests/server/test__resource.py
+++ b/testing/tests/server/test__resource.py
@@ -19,8 +19,8 @@ Tests for Soledad server main resource.
"""
from twisted.trial import unittest
from twisted.web.test.test_web import DummyRequest
-from twisted.web.error import Error
from twisted.web.wsgi import WSGIResource
+from twisted.web.resource import getChildForRequest
from twisted.internet import reactor
from leap.soledad.server._resource import SoledadResource
@@ -37,33 +37,30 @@ class SoledadResourceTestCase(unittest.TestCase):
def test_get_root(self):
conf = {'soledad-server': {'blobs': None}} # doesn't matter
resource = SoledadResource(conf, sync_pool=_pool)
- path = ''
- request = DummyRequest([])
- child = resource.getChild(path, request)
+ request = DummyRequest([''])
+ child = getChildForRequest(resource, request)
self.assertIsInstance(child, ServerInfo)
def test_get_blobs_enabled(self):
conf = {'soledad-server': {'blobs': True}}
resource = SoledadResource(conf, sync_pool=_pool)
- path = 'blobs'
- request = DummyRequest([])
- child = resource.getChild(path, request)
+ request = DummyRequest(['blobs'])
+ child = getChildForRequest(resource, request)
self.assertIsInstance(child, BlobsResource)
def test_get_blobs_disabled(self):
conf = {'soledad-server': {'blobs': False}}
resource = SoledadResource(conf, sync_pool=_pool)
- path = 'blobs'
- request = DummyRequest([])
- with self.assertRaises(Error):
- resource.getChild(path, request)
+ request = DummyRequest(['blobs'])
+ child = getChildForRequest(resource, request)
+ # if blobs is disabled, the request should be routed to sync
+ self.assertIsInstance(child, WSGIResource)
+ self.assertIsInstance(child._application, GzipMiddleware)
def test_get_sync(self):
conf = {'soledad-server': {'blobs': None}} # doesn't matter
resource = SoledadResource(conf, sync_pool=_pool)
- path = 'sync' # if not 'blobs' or '', should be routed to sync
- request = DummyRequest([])
- request.prepath = ['user-db']
- child = resource.getChild(path, request)
+ request = DummyRequest(['user-db', 'sync-from', 'source-id'])
+ child = getChildForRequest(resource, request)
self.assertIsInstance(child, WSGIResource)
self.assertIsInstance(child._application, GzipMiddleware)