blob: feaa08bf5e747d5621e649ef492f6dcf4bab5b94 [file] [log] [blame]
# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Handler used directly by the server.
This handler routes the request to the correct subhandler based on the first
value in the URL path. For example, the MessageHandler has been added to the
class's _HANDLERS object and handles all requests destined for URL/messages/...
To extend this functionality implement a handler and add it to the _HANDLERS
object with the correct category. The category is defined as the first part of
the URL path (i.e. URL/<CATEGORY>). The handler will then be called any time a
request comes in with that category.
"""
import re
import SimpleHTTPServer
# Import all communications handlers
from legion.lib.comm_server import message_handler
class ServerHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
"""Server handler class."""
_HANDLERS = {
'messages': message_handler.MessageHandler,
}
_REGEX = '/(?P<category>[a-zA-Z0-9_.-~]+)/'
def log_message(self, *args, **kwargs):
"""Silence those pesky server-side print statements."""
pass
def _GetCategoryName(self):
"""Extracts and returns the category name."""
match = re.match(self._REGEX, self.path)
if not match:
return
return match.group('category')
def _GetHandler(self):
"""Returns the category handler object if it exists."""
category = self._GetCategoryName()
if not category:
return self.send_error(403, 'Category must be supplied in the form of '
'/category_name/...')
handler = self._HANDLERS.get(category)
if not handler:
return self.send_error(405, 'No handler found for /%s/' % category)
return handler()
def do_GET(self):
"""Dispatches GET requests."""
handler = self._GetHandler()
if handler:
handler.do_GET(self)
def do_POST(self):
"""Dispatches POST requests."""
handler = self._GetHandler()
if handler:
handler.do_POST(self)
def do_PUT(self):
"""Dispatches PUT requests."""
handler = self._GetHandler()
if handler:
handler.do_PUT(self)
def do_DELETE(self):
"""Dispatches DELETE requests."""
handler = self._GetHandler()
if handler:
handler.do_DELETE(self)