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
5import time
6
7from appengine_wrappers import taskqueue
8from cron_servlet import CronServlet
9from instance_servlet import InstanceServlet
10from patch_servlet import PatchServlet
11from refresh_servlet import RefreshServlet
12from servlet import Servlet, Request, Response
13from test_servlet import TestServlet
14
15
16_DEFAULT_SERVLET = InstanceServlet.GetConstructor()
17
18
19_FORCE_CRON_TARGET = 'force_cron'
20
21
22_SERVLETS = {
23  'cron': CronServlet,
24  'patch': PatchServlet,
25  'refresh': RefreshServlet,
26  'test': TestServlet,
27}
28
29
30class Handler(Servlet):
31  def Get(self):
32    path = self._request.path
33
34    if path.startswith('_'):
35      servlet_path = path[1:]
36      if not '/' in servlet_path:
37        servlet_path += '/'
38      servlet_name, servlet_path = servlet_path.split('/', 1)
39      if servlet_name == _FORCE_CRON_TARGET:
40        queue = taskqueue.Queue()
41        queue.purge()
42        time.sleep(2)
43        queue.add(taskqueue.Task(url='/_cron'))
44        return Response.Ok('Cron job started.')
45      if servlet_name == 'enqueue':
46        queue = taskqueue.Queue()
47        queue.add(taskqueue.Task(url='/%s'%servlet_path))
48        return Response.Ok('Task enqueued.')
49      servlet = _SERVLETS.get(servlet_name)
50      if servlet is None:
51        return Response.NotFound('"%s" servlet not found' %  servlet_path)
52    else:
53      servlet_path = path
54      servlet = _DEFAULT_SERVLET
55
56    return servlet(Request(servlet_path,
57                           self._request.host,
58                           self._request.headers,
59                           self._request.arguments)).Get()
60