blob: 783fd83ec8431704eb26bb167edb5200b5281bb3 [file] [log] [blame]
joi@chromium.org66a61db2011-03-25 22:30:21 +00001#!/usr/bin/python2.4
2# Copyright (c) 2011 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
joi@chromium.orgf896dde2011-05-27 18:51:53 +000016AJAX_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
joi@chromium.org66a61db2011-03-25 22:30:21 +000056class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
57 keep_running = True
joi@chromium.orgf896dde2011-05-27 18:51:53 +000058 local_ip = ''
59 port = 0
joi@chromium.org66a61db2011-03-25 22:30:21 +000060
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
joi@chromium.orgf896dde2011-05-27 18:51:53 +000070 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
joi@chromium.org66a61db2011-03-25 22:30:21 +000079 params = urlparse.parse_qs(urlparse.urlparse(self.path).query)
80
joi@chromium.orgf896dde2011-05-27 18:51:53 +000081 def SendCustomRetryIfRequested():
82 if params and 'custom-retry-after' in params:
83 custom_retry = params['custom-retry-after'][0]
84 self.send_header('X-Retry-After', custom_retry)
85
joi@chromium.org66a61db2011-03-25 22:30:21 +000086 if not params or not 'code' in params or params['code'][0] == '200':
87 self.send_response(200)
88 self.send_header('Content-Type', 'text/plain')
joi@chromium.orgf896dde2011-05-27 18:51:53 +000089 SendCustomRetryIfRequested()
joi@chromium.org66a61db2011-03-25 22:30:21 +000090 self.end_headers()
91 self.wfile.write('OK')
92 else:
joi@chromium.orgf896dde2011-05-27 18:51:53 +000093 status_code = int(params['code'][0])
94 self.send_response(status_code)
95 SendCustomRetryIfRequested()
96 self.end_headers()
97 self.wfile.write('Error %d' % int(status_code))
joi@chromium.org66a61db2011-03-25 22:30:21 +000098
99
100def main():
joi@chromium.orgf896dde2011-05-27 18:51:53 +0000101 if len(sys.argv) != 3:
102 print "Usage: %s LOCAL_IP PORT" % sys.argv[0]
joi@chromium.org66a61db2011-03-25 22:30:21 +0000103 sys.exit(1)
joi@chromium.orgf896dde2011-05-27 18:51:53 +0000104 RequestHandler.local_ip = sys.argv[1]
105 port = int(sys.argv[2])
106 RequestHandler.port = port
joi@chromium.org66a61db2011-03-25 22:30:21 +0000107 print "To stop the server, go to http://localhost:%d/quitquitquit" % port
108 httpd = BaseHTTPServer.HTTPServer(('', port), RequestHandler)
109 while RequestHandler.keep_running:
110 httpd.handle_request()
111
112
113if __name__ == '__main__':
114 main()