1*6777b538SAndroid Build Coastguard Worker#!/usr/bin/env python 2*6777b538SAndroid Build Coastguard Worker# Copyright 2012 The Chromium Authors 3*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 4*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file. 5*6777b538SAndroid Build Coastguard Worker 6*6777b538SAndroid Build Coastguard Worker"""This is a simple HTTP server for manually testing exponential 7*6777b538SAndroid Build Coastguard Workerback-off functionality in Chrome. 8*6777b538SAndroid Build Coastguard Worker""" 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Workerimport BaseHTTPServer 12*6777b538SAndroid Build Coastguard Workerimport sys 13*6777b538SAndroid Build Coastguard Workerimport urlparse 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard WorkerAJAX_TEST_PAGE = ''' 17*6777b538SAndroid Build Coastguard Worker<html> 18*6777b538SAndroid Build Coastguard Worker<head> 19*6777b538SAndroid Build Coastguard Worker<script> 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Workerfunction reportResult(txt) { 22*6777b538SAndroid Build Coastguard Worker var element = document.createElement('p'); 23*6777b538SAndroid Build Coastguard Worker element.innerHTML = txt; 24*6777b538SAndroid Build Coastguard Worker document.body.appendChild(element); 25*6777b538SAndroid Build Coastguard Worker} 26*6777b538SAndroid Build Coastguard Worker 27*6777b538SAndroid Build Coastguard Workerfunction fetch() { 28*6777b538SAndroid Build Coastguard Worker var response_code = document.getElementById('response_code'); 29*6777b538SAndroid Build Coastguard Worker 30*6777b538SAndroid Build Coastguard Worker xmlhttp = new XMLHttpRequest(); 31*6777b538SAndroid Build Coastguard Worker xmlhttp.open("GET", 32*6777b538SAndroid Build Coastguard Worker "http://%s:%d/%s?code=" + response_code.value, 33*6777b538SAndroid Build Coastguard Worker true); 34*6777b538SAndroid Build Coastguard Worker xmlhttp.onreadystatechange = function() { 35*6777b538SAndroid Build Coastguard Worker reportResult( 36*6777b538SAndroid Build Coastguard Worker 'readyState=' + xmlhttp.readyState + ', status=' + xmlhttp.status); 37*6777b538SAndroid Build Coastguard Worker } 38*6777b538SAndroid Build Coastguard Worker try { 39*6777b538SAndroid Build Coastguard Worker xmlhttp.send(null); 40*6777b538SAndroid Build Coastguard Worker } catch (e) { 41*6777b538SAndroid Build Coastguard Worker reportResult('Exception: ' + e); 42*6777b538SAndroid Build Coastguard Worker } 43*6777b538SAndroid Build Coastguard Worker} 44*6777b538SAndroid Build Coastguard Worker 45*6777b538SAndroid Build Coastguard Worker</script> 46*6777b538SAndroid Build Coastguard Worker</head> 47*6777b538SAndroid Build Coastguard Worker<body> 48*6777b538SAndroid Build Coastguard Worker<form action="javascript:fetch()"> 49*6777b538SAndroid Build Coastguard Worker Response code to get: <input id="response_code" type="text" value="503"> 50*6777b538SAndroid Build Coastguard Worker <input type="submit"> 51*6777b538SAndroid Build Coastguard Worker</form> 52*6777b538SAndroid Build Coastguard Worker</body> 53*6777b538SAndroid Build Coastguard Worker</html>''' 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Worker 56*6777b538SAndroid Build Coastguard Workerclass RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): 57*6777b538SAndroid Build Coastguard Worker keep_running = True 58*6777b538SAndroid Build Coastguard Worker local_ip = '' 59*6777b538SAndroid Build Coastguard Worker port = 0 60*6777b538SAndroid Build Coastguard Worker 61*6777b538SAndroid Build Coastguard Worker def do_GET(self): 62*6777b538SAndroid Build Coastguard Worker if self.path == '/quitquitquit': 63*6777b538SAndroid Build Coastguard Worker self.send_response(200) 64*6777b538SAndroid Build Coastguard Worker self.send_header('Content-Type', 'text/plain') 65*6777b538SAndroid Build Coastguard Worker self.end_headers() 66*6777b538SAndroid Build Coastguard Worker self.wfile.write('QUITTING') 67*6777b538SAndroid Build Coastguard Worker RequestHandler.keep_running = False 68*6777b538SAndroid Build Coastguard Worker return 69*6777b538SAndroid Build Coastguard Worker 70*6777b538SAndroid Build Coastguard Worker if self.path.startswith('/ajax/'): 71*6777b538SAndroid Build Coastguard Worker self.send_response(200) 72*6777b538SAndroid Build Coastguard Worker self.send_header('Content-Type', 'text/html') 73*6777b538SAndroid Build Coastguard Worker self.end_headers() 74*6777b538SAndroid Build Coastguard Worker self.wfile.write(AJAX_TEST_PAGE % (self.local_ip, 75*6777b538SAndroid Build Coastguard Worker self.port, 76*6777b538SAndroid Build Coastguard Worker self.path[6:])) 77*6777b538SAndroid Build Coastguard Worker return 78*6777b538SAndroid Build Coastguard Worker 79*6777b538SAndroid Build Coastguard Worker params = urlparse.parse_qs(urlparse.urlparse(self.path).query) 80*6777b538SAndroid Build Coastguard Worker 81*6777b538SAndroid Build Coastguard Worker if not params or not 'code' in params or params['code'][0] == '200': 82*6777b538SAndroid Build Coastguard Worker self.send_response(200) 83*6777b538SAndroid Build Coastguard Worker self.send_header('Content-Type', 'text/plain') 84*6777b538SAndroid Build Coastguard Worker self.end_headers() 85*6777b538SAndroid Build Coastguard Worker self.wfile.write('OK') 86*6777b538SAndroid Build Coastguard Worker else: 87*6777b538SAndroid Build Coastguard Worker status_code = int(params['code'][0]) 88*6777b538SAndroid Build Coastguard Worker self.send_response(status_code) 89*6777b538SAndroid Build Coastguard Worker self.end_headers() 90*6777b538SAndroid Build Coastguard Worker self.wfile.write('Error %d' % int(status_code)) 91*6777b538SAndroid Build Coastguard Worker 92*6777b538SAndroid Build Coastguard Worker 93*6777b538SAndroid Build Coastguard Workerdef main(): 94*6777b538SAndroid Build Coastguard Worker if len(sys.argv) != 3: 95*6777b538SAndroid Build Coastguard Worker print "Usage: %s LOCAL_IP PORT" % sys.argv[0] 96*6777b538SAndroid Build Coastguard Worker sys.exit(1) 97*6777b538SAndroid Build Coastguard Worker RequestHandler.local_ip = sys.argv[1] 98*6777b538SAndroid Build Coastguard Worker port = int(sys.argv[2]) 99*6777b538SAndroid Build Coastguard Worker RequestHandler.port = port 100*6777b538SAndroid Build Coastguard Worker print "To stop the server, go to http://localhost:%d/quitquitquit" % port 101*6777b538SAndroid Build Coastguard Worker httpd = BaseHTTPServer.HTTPServer(('', port), RequestHandler) 102*6777b538SAndroid Build Coastguard Worker while RequestHandler.keep_running: 103*6777b538SAndroid Build Coastguard Worker httpd.handle_request() 104*6777b538SAndroid Build Coastguard Worker 105*6777b538SAndroid Build Coastguard Worker 106*6777b538SAndroid Build Coastguard Workerif __name__ == '__main__': 107*6777b538SAndroid Build Coastguard Worker main() 108