1#!/usr/bin/env python
2# Copyright (c) 2012 The Chromium Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6"""This is a simple HTTP server for manually testing exponential
7back-off functionality in Chrome.
8"""
9
10
11import BaseHTTPServer
12import sys
13import urlparse
14
15
16AJAX_TEST_PAGE = '''
17<html>
18<head>
19<script>
20
21function reportResult(txt) {
22  var element = document.createElement('p');
23  element.innerHTML = txt;
24  document.body.appendChild(element);
25}
26
27function fetch() {
28  var response_code = document.getElementById('response_code');
29
30  xmlhttp = new XMLHttpRequest();
31  xmlhttp.open("GET",
32               "http://%s:%d/%s?code=" + response_code.value,
33               true);
34  xmlhttp.onreadystatechange = function() {
35    reportResult(
36        'readyState=' + xmlhttp.readyState + ', status=' + xmlhttp.status);
37  }
38  try {
39    xmlhttp.send(null);
40  } catch (e) {
41    reportResult('Exception: ' + e);
42  }
43}
44
45</script>
46</head>
47<body>
48<form action="javascript:fetch()">
49  Response code to get: <input id="response_code" type="text" value="503">
50  <input type="submit">
51</form>
52</body>
53</html>'''
54
55
56class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
57  keep_running = True
58  local_ip = ''
59  port = 0
60
61  def do_GET(self):
62    if self.path == '/quitquitquit':
63      self.send_response(200)
64      self.send_header('Content-Type', 'text/plain')
65      self.end_headers()
66      self.wfile.write('QUITTING')
67      RequestHandler.keep_running = False
68      return
69
70    if self.path.startswith('/ajax/'):
71      self.send_response(200)
72      self.send_header('Content-Type', 'text/html')
73      self.end_headers()
74      self.wfile.write(AJAX_TEST_PAGE % (self.local_ip,
75                                         self.port,
76                                         self.path[6:]))
77      return
78
79    params = urlparse.parse_qs(urlparse.urlparse(self.path).query)
80
81    if not params or not 'code' in params or params['code'][0] == '200':
82      self.send_response(200)
83      self.send_header('Content-Type', 'text/plain')
84      self.end_headers()
85      self.wfile.write('OK')
86    else:
87      status_code = int(params['code'][0])
88      self.send_response(status_code)
89      self.end_headers()
90      self.wfile.write('Error %d' % int(status_code))
91
92
93def main():
94  if len(sys.argv) != 3:
95    print "Usage: %s LOCAL_IP PORT" % sys.argv[0]
96    sys.exit(1)
97  RequestHandler.local_ip = sys.argv[1]
98  port = int(sys.argv[2])
99  RequestHandler.port = port
100  print "To stop the server, go to http://localhost:%d/quitquitquit" % port
101  httpd = BaseHTTPServer.HTTPServer(('', port), RequestHandler)
102  while RequestHandler.keep_running:
103    httpd.handle_request()
104
105
106if __name__ == '__main__':
107  main()
108