rebaseline_server: properly handle unexpected GETs
BUG=skia:2147
NOTRY=True
R=rmistry@google.com
Author: epoger@google.com
Review URL: https://codereview.chromium.org/157773002
git-svn-id: http://skia.googlecode.com/svn/trunk@13366 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gm/rebaseline_server/server.py b/gm/rebaseline_server/server.py
index 5865f59..0906c4e 100755
--- a/gm/rebaseline_server/server.py
+++ b/gm/rebaseline_server/server.py
@@ -260,27 +260,36 @@
how to handle (static HTML and Javascript, expected/actual results, etc.)
"""
def do_GET(self):
- """ Handles all GET requests, forwarding them to the appropriate
- do_GET_* dispatcher. """
- if self.path == '' or self.path == '/' or self.path == '/index.html' :
- self.redirect_to('/static/index.html')
- return
- if self.path == '/favicon.ico' :
- self.redirect_to('/static/favicon.ico')
- return
+ """
+ Handles all GET requests, forwarding them to the appropriate
+ do_GET_* dispatcher.
- # All requests must be of this form:
- # /dispatcher/remainder
- # where 'dispatcher' indicates which do_GET_* dispatcher to run
- # and 'remainder' is the remaining path sent to that dispatcher.
- normpath = posixpath.normpath(self.path)
- (dispatcher_name, remainder) = PATHSPLIT_RE.match(normpath).groups()
- dispatchers = {
- 'results': self.do_GET_results,
- 'static': self.do_GET_static,
- }
- dispatcher = dispatchers[dispatcher_name]
- dispatcher(remainder)
+ If we see any Exceptions, return a 404. This fixes http://skbug.com/2147
+ """
+ try:
+ logging.debug('do_GET: path="%s"' % self.path)
+ if self.path == '' or self.path == '/' or self.path == '/index.html' :
+ self.redirect_to('/static/index.html')
+ return
+ if self.path == '/favicon.ico' :
+ self.redirect_to('/static/favicon.ico')
+ return
+
+ # All requests must be of this form:
+ # /dispatcher/remainder
+ # where 'dispatcher' indicates which do_GET_* dispatcher to run
+ # and 'remainder' is the remaining path sent to that dispatcher.
+ normpath = posixpath.normpath(self.path)
+ (dispatcher_name, remainder) = PATHSPLIT_RE.match(normpath).groups()
+ dispatchers = {
+ 'results': self.do_GET_results,
+ 'static': self.do_GET_static,
+ }
+ dispatcher = dispatchers[dispatcher_name]
+ dispatcher(remainder)
+ except:
+ self.send_error(404)
+ raise
def do_GET_results(self, type):
""" Handle a GET request for GM results.
@@ -290,31 +299,27 @@
must be one of the results.RESULTS_* constants
"""
logging.debug('do_GET_results: sending results of type "%s"' % type)
- try:
- # Since we must make multiple calls to the Results object, grab a
- # reference to it in case it is updated to point at a new Results
- # object within another thread.
- #
- # TODO(epoger): Rather than using a global variable for the handler
- # to refer to the Server object, make Server a subclass of
- # HTTPServer, and then it could be available to the handler via
- # the handler's .server instance variable.
- results_obj = _SERVER.results
- if results_obj:
- response_dict = self.package_results(results_obj, type)
- else:
- now = int(time.time())
- response_dict = {
- 'header': {
- 'resultsStillLoading': True,
- 'timeUpdated': now,
- 'timeNextUpdateAvailable': now + RELOAD_INTERVAL_UNTIL_READY,
- },
- }
- self.send_json_dict(response_dict)
- except:
- self.send_error(404)
- raise
+ # Since we must make multiple calls to the Results object, grab a
+ # reference to it in case it is updated to point at a new Results
+ # object within another thread.
+ #
+ # TODO(epoger): Rather than using a global variable for the handler
+ # to refer to the Server object, make Server a subclass of
+ # HTTPServer, and then it could be available to the handler via
+ # the handler's .server instance variable.
+ results_obj = _SERVER.results
+ if results_obj:
+ response_dict = self.package_results(results_obj, type)
+ else:
+ now = int(time.time())
+ response_dict = {
+ 'header': {
+ 'resultsStillLoading': True,
+ 'timeUpdated': now,
+ 'timeNextUpdateAvailable': now + RELOAD_INTERVAL_UNTIL_READY,
+ },
+ }
+ self.send_json_dict(response_dict)
def package_results(self, results_obj, type):
""" Given a nonempty "results" object, package it as a response_dict
@@ -383,6 +388,7 @@
# All requests must be of this form:
# /dispatcher
# where 'dispatcher' indicates which do_POST_* dispatcher to run.
+ logging.debug('do_POST: path="%s"' % self.path)
normpath = posixpath.normpath(self.path)
dispatchers = {
'/edits': self.do_POST_edits,