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

Side by Side Diff: gae/main.py

Issue 954693002: Store each file as "hash/<sha1>", list of hashes as "meta/@<rev>" and serve them at "serve_file/@<r… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/chrome-devtools-frontend
Patch Set: rebase Created 5 years, 10 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « gae/config.py ('k') | gce/uploader_iteration.sh » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 # Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 import re 5 import re
6 # F0401: 7,0: Unable to import 'webapp2' 6 # F0401: 7,0: Unable to import 'webapp2'
7 # pylint: disable=F0401 7 # pylint: disable=F0401
8 import webapp2 8 import webapp2
9 9
10 import cache 10 import cache
11 import config 11 import config
12 import content_processor 12 import content_processor
13 import content_type 13 import content_type
14 import pre_cacher 14 import pre_cacher
15 import file_reader 15 import file_reader
16 import zip_proxy 16 import zip_proxy
17 17
18 current_config = config.DEFAULT 18 current_config = config.DEFAULT
19 19
20 class MainPage(webapp2.RequestHandler): 20 class MainPage(webapp2.RequestHandler):
21 def get(self): 21 def get(self):
22 self.response.headers['Content-Type'] = 'text/plain' 22 self.response.headers['Content-Type'] = 'text/plain'
23 self.response.write(str(current_config)) 23 self.response.write(str(current_config))
24 24
25 class Server(webapp2.RequestHandler): 25 class Server(webapp2.RequestHandler):
26 def get_hash_cache_key(self, rev, path):
27 return '/hashes/%s/%s' % (rev, path)
28
29 def get_file_hash(self, helper, rev, path):
30 file_hash = cache.get_content(self.get_hash_cache_key(rev, path))
31
32 if not file_hash:
33 meta_cache_key = '/meta-parsed/%s' % rev
34 if cache.get_content(meta_cache_key):
35 return None
36
37 meta_file_name = helper.get_meta_path(rev)
38 meta_content = file_reader.read(helper, meta_file_name)
39 if not meta_content:
40 return None
41
42 for line in meta_content.split('\n'):
43 hash_and_path = line.split(':')
44 if len(hash_and_path) == 2:
45 (line_hash, line_path) = hash_and_path
46 cache.set_content(self.get_hash_cache_key(rev, line_path), line_hash)
47 if line_path == path:
48 file_hash = line_hash
49 cache.set_content(meta_cache_key, 'parsed')
50
51 return file_hash
52
26 def get(self, tag_type, tag, path): 53 def get(self, tag_type, tag, path):
27 cache_key_name = '/res/%s/%s/%s' % (tag_type, tag, path)
28 content = cache.get_content(cache_key_name)
29 helper = config.ConfigHelper(current_config) 54 helper = config.ConfigHelper(current_config)
55 content = None
30 56
31 if not content: 57 if tag_type == 'file':
32 if tag_type == 'rev': 58 file_hash = self.get_file_hash(helper, tag, path)
33 meta_file_name = helper.get_revision_path(tag) 59 if not file_hash:
34 elif tag_type =='ver':
35 meta_file_name = helper.get_version_path(tag)
36 else:
37 self.abort(404) 60 self.abort(404)
38 61 content = file_reader.read(helper, helper.get_hash_path(file_hash))
39 meta_content = file_reader.read(helper, meta_file_name)
40 if meta_content:
41 zip_file_name = meta_content.strip(' \t\n')
42 else:
43 self.abort(404)
44
45 content = zip_proxy.read(helper, zip_file_name, path)
46 if not content: 62 if not content:
47 self.abort(404) 63 self.abort(404)
48 content = content_processor.process(path, content) 64 content = content_processor.process(path, content)
49 cache.set_content(cache_key_name, content) 65
66 else:
67 cache_key_name = '/res/%s/%s/%s' % (tag_type, tag, path)
68 content = cache.get_content(cache_key_name)
69 if not content:
70 if tag_type == 'rev':
71 meta_file_name = helper.get_revision_path(tag)
72 elif tag_type =='ver':
73 meta_file_name = helper.get_version_path(tag)
74 else:
75 self.abort(404)
76
77 meta_content = file_reader.read(helper, meta_file_name)
78 if meta_content:
79 zip_file_name = meta_content.strip(' \t\n')
80 else:
81 self.abort(404)
82
83 content = zip_proxy.read(helper, zip_file_name, path)
84 if not content:
85 self.abort(404)
86 content = content_processor.process(path, content)
87 cache.set_content(cache_key_name, content)
50 88
51 self.response.headers['Content-Type'] = content_type.from_path(path) 89 self.response.headers['Content-Type'] = content_type.from_path(path)
52 self.response.headers['Access-Control-Allow-Origin'] = '*' 90 self.response.headers['Access-Control-Allow-Origin'] = '*'
53 cache_control = 'public, max-age=%d' % helper.get_max_age() 91 cache_control = 'public, max-age=%d' % helper.get_max_age()
54 self.response.headers['Cache-Control'] = cache_control 92 self.response.headers['Cache-Control'] = cache_control
55 self.response.body = content 93 self.response.body = content
56 94
57 class LegacyStatic(Server): 95 class LegacyStatic(Server):
58 def get(self, version, path): 96 def get(self, version, path):
59 # Map x.x.x.x -> x.x.x.0 to deal with patched releases 97 # Map x.x.x.x -> x.x.x.0 to deal with patched releases
60 match = re.search('(\d+\.\d+\.\d+\.)\d+', version) 98 match = re.search('(\d+\.\d+\.\d+\.)\d+', version)
61 if match: 99 if match:
62 return super(LegacyStatic, self).get('ver', match.group(1) + '0', path) 100 return super(LegacyStatic, self).get('ver', match.group(1) + '0', path)
63 else: 101 else:
64 self.abort(404) 102 self.abort(404)
65 103
66 app = webapp2.WSGIApplication( 104 app = webapp2.WSGIApplication(
67 [('/', MainPage), 105 [('/', MainPage),
68 ('/precache_url', pre_cacher.PreCacherFromUrl), 106 ('/precache_url', pre_cacher.PreCacherFromUrl),
69 webapp2.Route('/serve_<tag_type>/<tag>/<path:.*>', Server), 107 webapp2.Route('/serve_<tag_type>/<tag>/<path:.*>', Server),
70 webapp2.Route('/static/<version>/<path:.*>', LegacyStatic)], 108 webapp2.Route('/static/<version>/<path:.*>', LegacyStatic)],
71 debug=config.IS_DEV_APP_SERVER) 109 debug=config.IS_DEV_APP_SERVER)
OLDNEW
« no previous file with comments | « gae/config.py ('k') | gce/uploader_iteration.sh » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698