Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(288)

Unified Diff: tools/telemetry/telemetry/core/memory_cache_http_server.py

Issue 12813013: [Telemetry] Cause web server to keep resources in memory and thread requests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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()

Powered by Google App Engine
This is Rietveld 408576698