|  | #!/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() |