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() |