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