maruel@chromium.org | f2343f5 | 2011-11-23 16:45:46 +0000 | [diff] [blame] | 1 | #!/usr/bin/env python |
joi@chromium.org | 4148465 | 2012-04-23 23:09:50 +0000 | [diff] [blame] | 2 | # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
maruel@chromium.org | f2343f5 | 2011-11-23 16:45:46 +0000 | [diff] [blame] | 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 | |
| 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 | |
| 56 | class 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 | |
maruel@chromium.org | f2343f5 | 2011-11-23 16:45:46 +0000 | [diff] [blame] | 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') |
maruel@chromium.org | f2343f5 | 2011-11-23 16:45:46 +0000 | [diff] [blame] | 84 | self.end_headers() |
| 85 | self.wfile.write('OK') |
| 86 | else: |
| 87 | status_code = int(params['code'][0]) |
| 88 | self.send_response(status_code) |
maruel@chromium.org | f2343f5 | 2011-11-23 16:45:46 +0000 | [diff] [blame] | 89 | self.end_headers() |
| 90 | self.wfile.write('Error %d' % int(status_code)) |
| 91 | |
| 92 | |
| 93 | def 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 | |
| 106 | if __name__ == '__main__': |
| 107 | main() |