xref: /aosp_15_r20/external/cronet/net/tools/testserver/backoff_server.py (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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