| #!/usr/bin/env python |
| # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """This is a simple HTTP server for manually testing exponential |
| back-off functionality in Chrome. |
| """ |
| |
| |
| import BaseHTTPServer |
| import sys |
| import urlparse |
| |
| |
| AJAX_TEST_PAGE = ''' |
| <html> |
| <head> |
| <script> |
| |
| function reportResult(txt) { |
| var element = document.createElement('p'); |
| element.innerHTML = txt; |
| document.body.appendChild(element); |
| } |
| |
| function fetch() { |
| var response_code = document.getElementById('response_code'); |
| |
| xmlhttp = new XMLHttpRequest(); |
| xmlhttp.open("GET", |
| "http://%s:%d/%s?code=" + response_code.value, |
| true); |
| xmlhttp.onreadystatechange = function() { |
| reportResult( |
| 'readyState=' + xmlhttp.readyState + ', status=' + xmlhttp.status); |
| } |
| try { |
| xmlhttp.send(null); |
| } catch (e) { |
| reportResult('Exception: ' + e); |
| } |
| } |
| |
| </script> |
| </head> |
| <body> |
| <form action="javascript:fetch()"> |
| Response code to get: <input id="response_code" type="text" value="503"> |
| <input type="submit"> |
| </form> |
| </body> |
| </html>''' |
| |
| |
| class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): |
| keep_running = True |
| local_ip = '' |
| port = 0 |
| |
| def do_GET(self): |
| if self.path == '/quitquitquit': |
| self.send_response(200) |
| self.send_header('Content-Type', 'text/plain') |
| self.end_headers() |
| self.wfile.write('QUITTING') |
| RequestHandler.keep_running = False |
| return |
| |
| if self.path.startswith('/ajax/'): |
| self.send_response(200) |
| self.send_header('Content-Type', 'text/html') |
| self.end_headers() |
| self.wfile.write(AJAX_TEST_PAGE % (self.local_ip, |
| self.port, |
| self.path[6:])) |
| return |
| |
| params = urlparse.parse_qs(urlparse.urlparse(self.path).query) |
| |
| if not params or not 'code' in params or params['code'][0] == '200': |
| self.send_response(200) |
| self.send_header('Content-Type', 'text/plain') |
| self.end_headers() |
| self.wfile.write('OK') |
| else: |
| status_code = int(params['code'][0]) |
| self.send_response(status_code) |
| self.end_headers() |
| self.wfile.write('Error %d' % int(status_code)) |
| |
| |
| def main(): |
| if len(sys.argv) != 3: |
| print "Usage: %s LOCAL_IP PORT" % sys.argv[0] |
| sys.exit(1) |
| RequestHandler.local_ip = sys.argv[1] |
| port = int(sys.argv[2]) |
| RequestHandler.port = port |
| print "To stop the server, go to http://localhost:%d/quitquitquit" % port |
| httpd = BaseHTTPServer.HTTPServer(('', port), RequestHandler) |
| while RequestHandler.keep_running: |
| httpd.handle_request() |
| |
| |
| if __name__ == '__main__': |
| main() |