15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/env python 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file. 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""This is a simple HTTP server for manually testing exponential 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)back-off functionality in Chrome. 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)""" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import BaseHTTPServer 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import sys 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import urlparse 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AJAX_TEST_PAGE = ''' 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<html> 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<head> 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<script> 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function reportResult(txt) { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var element = document.createElement('p'); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element.innerHTML = txt; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document.body.appendChild(element); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function fetch() { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var response_code = document.getElementById('response_code'); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlhttp = new XMLHttpRequest(); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlhttp.open("GET", 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://%s:%d/%s?code=" + response_code.value, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlhttp.onreadystatechange = function() { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reportResult( 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'readyState=' + xmlhttp.readyState + ', status=' + xmlhttp.status); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlhttp.send(null); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } catch (e) { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reportResult('Exception: ' + e); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</script> 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</head> 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<body> 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<form action="javascript:fetch()"> 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Response code to get: <input id="response_code" type="text" value="503"> 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) <input type="submit"> 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</form> 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</body> 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</html>''' 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keep_running = True 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local_ip = '' 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) port = 0 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def do_GET(self): 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if self.path == '/quitquitquit': 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.send_response(200) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.send_header('Content-Type', 'text/plain') 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.end_headers() 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.wfile.write('QUITTING') 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestHandler.keep_running = False 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if self.path.startswith('/ajax/'): 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.send_response(200) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.send_header('Content-Type', 'text/html') 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.end_headers() 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.wfile.write(AJAX_TEST_PAGE % (self.local_ip, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.port, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.path[6:])) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params = urlparse.parse_qs(urlparse.urlparse(self.path).query) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if not params or not 'code' in params or params['code'][0] == '200': 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.send_response(200) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.send_header('Content-Type', 'text/plain') 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.end_headers() 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.wfile.write('OK') 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status_code = int(params['code'][0]) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.send_response(status_code) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.end_headers() 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.wfile.write('Error %d' % int(status_code)) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def main(): 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if len(sys.argv) != 3: 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print "Usage: %s LOCAL_IP PORT" % sys.argv[0] 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sys.exit(1) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestHandler.local_ip = sys.argv[1] 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) port = int(sys.argv[2]) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestHandler.port = port 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print "To stop the server, go to http://localhost:%d/quitquitquit" % port 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) httpd = BaseHTTPServer.HTTPServer(('', port), RequestHandler) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while RequestHandler.keep_running: 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) httpd.handle_request() 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == '__main__': 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main() 108