backoff_server.py 2.7 KB

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