Chromium Code Reviews| Index: tools/telemetry/telemetry/core/memory_cache_http_server.py |
| diff --git a/tools/telemetry/telemetry/core/memory_cache_http_server.py b/tools/telemetry/telemetry/core/memory_cache_http_server.py |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..49a9bd9795d3cf4c799a30f671e4cecbe5d927a0 |
| --- /dev/null |
| +++ b/tools/telemetry/telemetry/core/memory_cache_http_server.py |
| @@ -0,0 +1,82 @@ |
| +# 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. |
| +import BaseHTTPServer |
| +import os |
| +import SimpleHTTPServer |
| +import SocketServer |
| +import sys |
| + |
| + |
| +class MemoryCacheHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): |
| + |
| + def do_GET(self): |
| + """Serve a GET request.""" |
| + resource = self.SendHead() |
| + if resource: |
| + self.wfile.write(resource['response']) |
| + |
| + def do_HEAD(self): |
| + """Serve a HEAD request.""" |
| + self.SendHead() |
| + |
| + def SendHead(self): |
| + path = self.translate_path(self.path) |
| + ctype = self.guess_type(path) |
| + if path not in self.server.resource_map: |
| + self.send_error(404, 'File not found') |
| + return None |
| + resource = self.server.resource_map[path] |
| + self.send_response(200) |
| + self.send_header('Content-Type', ctype) |
| + self.send_header('Content-Length', resource['content-length']) |
| + self.send_header('Last-Modified', |
| + self.date_time_string(resource['last-modified'])) |
| + self.end_headers() |
| + return resource |
| + |
| + |
| +class MemoryCacheHTTPServer(SocketServer.ThreadingMixIn, |
| + BaseHTTPServer.HTTPServer): |
| + # Increase the request queue size. The default value, 5, is set in |
| + # SocketServer.TCPServer (the parent of BaseHTTPServer.HTTPServer). |
| + # Since we're intercepting many domains through this single server, |
| + # it is quite possible to get more than 5 concurrent requests. |
| + request_queue_size = 128 |
| + |
| + def __init__(self, host_port, handler): |
| + BaseHTTPServer.HTTPServer.__init__(self, host_port, handler) |
| + |
| + self.resource_map = {} |
| + |
| + if not sys.argv[2:]: |
| + print 'usage: %prog <port> [<path1>, <path2>, ...]' |
| + sys.exit(1) |
| + |
| + for path in sys.argv[2:]: |
| + self.LoadResourceMap(path) |
| + |
| + def LoadResourceMap(self, cwd): |
| + """Loads all files in cwd into the in-memory resource map.""" |
| + for root, _, files in os.walk(cwd): |
| + for f in files: |
| + file_path = os.path.join(root, f) |
| + if not os.path.exists(file_path): # Allow for '.#' files |
| + continue |
| + with open(file_path, 'rb') as fd: |
| + response = fd.read() |
| + fs = os.fstat(fd.fileno()) |
| + self.resource_map[file_path] = { |
| + 'content-length': str(fs[6]), |
| + 'last-modified': fs.st_mtime, |
| + 'response': response |
| + } |
| + |
| + |
| +def test(HandlerClass=MemoryCacheHTTPRequestHandler, |
|
nduca
2013/03/23 00:09:06
def Main(args):
<insert the SimpleHTTPServer.tes
tonyg
2013/03/23 00:27:21
Done.
|
| + ServerClass=MemoryCacheHTTPServer): |
| + SimpleHTTPServer.test(HandlerClass, ServerClass) |
| + |
| + |
| +if __name__ == '__main__': |
| + test() |