handler.py revision b2df76ea8fec9e32f6f3718986dba0d95315b29c
1# Copyright (c) 2012 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5from branch_utility import BranchUtility
6from cron_servlet import CronServlet
7from instance_servlet import InstanceServlet
8from servlet import Servlet, Request, Response
9
10_SERVLETS = {
11  'cron': CronServlet,
12}
13_DEFAULT_SERVLET = InstanceServlet.GetConstructor()
14
15class Handler(Servlet):
16  def Get(self):
17    path = self._request.path
18
19    if path in ['favicon.ico', 'robots.txt']:
20      return Response.NotFound('')
21
22    redirect = self._RedirectSpecialCases()
23    if redirect is None:
24      redirect = self._RedirectFromCodeDotGoogleDotCom()
25    if redirect is not None:
26      return redirect
27
28    if path.startswith('_'):
29      servlet_path = path[1:]
30      if servlet_path.find('/') == -1:
31        servlet_path += '/'
32      servlet_name, servlet_path = servlet_path.split('/', 1)
33      servlet = _SERVLETS.get(servlet_name)
34      if servlet is None:
35        return Response.NotFound('"%s" servlet not found' %  servlet_path)
36    else:
37      servlet_path = path
38      servlet = _DEFAULT_SERVLET
39
40    return servlet(Request(servlet_path,
41                           self._request.host,
42                           self._request.headers)).Get()
43
44  def _RedirectSpecialCases(self):
45    path = self._request.path
46    if not path or path == 'index.html':
47      return Response.Redirect('http://developer.google.com/chrome')
48    if path == 'apps.html':
49      return Response.Redirect('/apps/about_apps.html')
50    return None
51
52  def _RedirectFromCodeDotGoogleDotCom(self):
53    host, path = (self._request.host, self._request.path)
54
55    if not host in ('http://code.google.com', 'https://code.google.com'):
56      return None
57
58    new_host = 'http://developer.chrome.com'
59
60    # switch to https if necessary
61    if host.startswith('https'):
62      new_host = new_host.replace('http', 'https', 1)
63
64    new_path = path.split('/')
65    if len(new_path) > 0 and new_path[0] == 'chrome':
66      new_path.pop(0)
67    for channel in BranchUtility.GetAllChannelNames():
68      if channel in new_path:
69        position = new_path.index(channel)
70        new_path.pop(position)
71        new_path.insert(0, channel)
72    return Response.Redirect('/'.join([new_host] + new_path))
73