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