joi@chromium.org | 66a61db | 2011-03-25 22:30:21 +0000 | [diff] [blame] | 1 | #!/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
|
| 7 | back-off functionality in Chrome.
|
| 8 | """
|
| 9 |
|
| 10 |
|
| 11 | import BaseHTTPServer
|
| 12 | import sys
|
| 13 | import urlparse
|
| 14 |
|
| 15 |
|
joi@chromium.org | f896dde | 2011-05-27 18:51:53 +0000 | [diff] [blame] | 16 | AJAX_TEST_PAGE = '''
|
| 17 | <html>
|
| 18 | <head>
|
| 19 | <script>
|
| 20 |
|
| 21 | function reportResult(txt) {
|
| 22 | var element = document.createElement('p');
|
| 23 | element.innerHTML = txt;
|
| 24 | document.body.appendChild(element);
|
| 25 | }
|
| 26 |
|
| 27 | function 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.org | 66a61db | 2011-03-25 22:30:21 +0000 | [diff] [blame] | 56 | class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
| 57 | keep_running = True
|
joi@chromium.org | f896dde | 2011-05-27 18:51:53 +0000 | [diff] [blame] | 58 | local_ip = ''
|
| 59 | port = 0
|
joi@chromium.org | 66a61db | 2011-03-25 22:30:21 +0000 | [diff] [blame] | 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 |
|
joi@chromium.org | f896dde | 2011-05-27 18:51:53 +0000 | [diff] [blame] | 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 |
|
joi@chromium.org | 66a61db | 2011-03-25 22:30:21 +0000 | [diff] [blame] | 79 | params = urlparse.parse_qs(urlparse.urlparse(self.path).query)
|
| 80 |
|
joi@chromium.org | f896dde | 2011-05-27 18:51:53 +0000 | [diff] [blame] | 81 | 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.org | 66a61db | 2011-03-25 22:30:21 +0000 | [diff] [blame] | 86 | 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.org | f896dde | 2011-05-27 18:51:53 +0000 | [diff] [blame] | 89 | SendCustomRetryIfRequested()
|
joi@chromium.org | 66a61db | 2011-03-25 22:30:21 +0000 | [diff] [blame] | 90 | self.end_headers()
|
| 91 | self.wfile.write('OK')
|
| 92 | else:
|
joi@chromium.org | f896dde | 2011-05-27 18:51:53 +0000 | [diff] [blame] | 93 | 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.org | 66a61db | 2011-03-25 22:30:21 +0000 | [diff] [blame] | 98 |
|
| 99 |
|
| 100 | def main():
|
joi@chromium.org | f896dde | 2011-05-27 18:51:53 +0000 | [diff] [blame] | 101 | if len(sys.argv) != 3:
|
| 102 | print "Usage: %s LOCAL_IP PORT" % sys.argv[0]
|
joi@chromium.org | 66a61db | 2011-03-25 22:30:21 +0000 | [diff] [blame] | 103 | sys.exit(1)
|
joi@chromium.org | f896dde | 2011-05-27 18:51:53 +0000 | [diff] [blame] | 104 | RequestHandler.local_ip = sys.argv[1]
|
| 105 | port = int(sys.argv[2])
|
| 106 | RequestHandler.port = port
|
joi@chromium.org | 66a61db | 2011-03-25 22:30:21 +0000 | [diff] [blame] | 107 | 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 |
|
| 113 | if __name__ == '__main__':
|
| 114 | main()
|