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