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

Side by Side Diff: chrome/common/extensions/docs/server2/preview.py

Issue 13470005: Refactor the devserver to make it easier to control caching (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: cache static files in cron, fix path canonicalizer bug Created 7 years, 8 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
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 # This helps you preview the apps and extensions docs. 6 # This helps you preview the apps and extensions docs.
7 # 7 #
8 # ./preview.py --help 8 # ./preview.py --help
9 # 9 #
10 # There are two modes: server- and render- mode. The default is server, in which 10 # There are two modes: server- and render- mode. The default is server, in which
(...skipping 10 matching lines...) Expand all
21 # and for profiling the server. For example, 21 # and for profiling the server. For example,
22 # 22 #
23 # ./preview.py -r extensions/tabs.html 23 # ./preview.py -r extensions/tabs.html
24 # 24 #
25 # will output the documentation for the tabs API on stdout and exit immediately. 25 # will output the documentation for the tabs API on stdout and exit immediately.
26 # 26 #
27 # Note: absolute paths into static content (e.g. /static/css/site.css) will be 27 # Note: absolute paths into static content (e.g. /static/css/site.css) will be
28 # relative paths (e.g. static/css/site.css) for convenient sandboxing. 28 # relative paths (e.g. static/css/site.css) for convenient sandboxing.
29 29
30 from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 30 from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
31 import logging
31 import optparse 32 import optparse
32 import os 33 import os
33 import shutil 34 import shutil
34 from StringIO import StringIO 35 from StringIO import StringIO
35 import sys 36 import sys
36 import urlparse 37 import urlparse
37 38
38 import build_server 39 import build_server
39 # Copy all the files necessary to run the server. These are cleaned up when the 40 # Copy all the files necessary to run the server. These are cleaned up when the
40 # server quits. 41 # server quits.
41 build_server.main() 42 build_server.main()
42 43
43 from fake_fetchers import ConfigureFakeFetchers 44 from fake_fetchers import ConfigureFakeFetchers
44 45
45 class _Response(object): 46 class _Response(object):
46 def __init__(self): 47 def __init__(self):
47 self.status = 200 48 self.status = 200
48 self.out = StringIO() 49 self.out = StringIO()
49 self.headers = {} 50 self.headers = {}
50 51
51 def set_status(self, status): 52 def set_status(self, status):
52 self.status = status 53 self.status = status
53 54
54 class _Request(object): 55 class _Request(object):
55 def __init__(self, path): 56 def __init__(self, path):
56 self.headers = {} 57 self.headers = {}
57 self.path = path 58 self.path = path
58 self.url = 'http://localhost' + path 59 self.url = 'http://localhost' + path
59 60
60 def _Render(path, local_path): 61 def _Render(path):
61 response = _Response() 62 response = _Response()
62 Handler(_Request(urlparse.urlparse(path).path), 63 Handler(_Request(urlparse.urlparse(path).path), response).get()
63 response,
64 local_path=local_path).get()
65 content = response.out.getvalue() 64 content = response.out.getvalue()
66 if isinstance(content, unicode): 65 if isinstance(content, unicode):
67 content = content.encode('utf-8', 'replace') 66 content = content.encode('utf-8', 'replace')
68 return (content, response.status, response.headers) 67 return (content, response.status, response.headers)
69 68
70 def _GetLocalPath(): 69 def _GetLocalPath():
71 if os.sep in sys.argv[0]: 70 if os.sep in sys.argv[0]:
72 return os.path.join(sys.argv[0].rsplit(os.sep, 1)[0], os.pardir, os.pardir) 71 return os.path.join(sys.argv[0].rsplit(os.sep, 1)[0], os.pardir, os.pardir)
73 return os.path.join(os.pardir, os.pardir) 72 return os.path.join(os.pardir, os.pardir)
74 73
75 class RequestHandler(BaseHTTPRequestHandler): 74 class RequestHandler(BaseHTTPRequestHandler):
76 """A HTTPRequestHandler that outputs the docs page generated by Handler. 75 """A HTTPRequestHandler that outputs the docs page generated by Handler.
77 """ 76 """
78 def do_GET(self): 77 def do_GET(self):
79 content, status, headers = _Render(self.path, RequestHandler.local_path) 78 content, status, headers = _Render(self.path)
80 self.send_response(status) 79 self.send_response(status)
81 for k, v in headers.iteritems(): 80 for k, v in headers.iteritems():
82 self.send_header(k, v) 81 self.send_header(k, v)
83 self.end_headers() 82 self.end_headers()
84 self.wfile.write(content) 83 self.wfile.write(content)
85 84
86 if __name__ == '__main__': 85 if __name__ == '__main__':
87 parser = optparse.OptionParser( 86 parser = optparse.OptionParser(
88 description='Runs a server to preview the extension documentation.', 87 description='Runs a server to preview the extension documentation.',
89 usage='usage: %prog [option]...') 88 usage='usage: %prog [option]...')
(...skipping 21 matching lines...) Expand all
111 from handler import Handler 110 from handler import Handler
112 111
113 if opts.render: 112 if opts.render:
114 if opts.render.find('#') >= 0: 113 if opts.render.find('#') >= 0:
115 (path, iterations) = opts.render.rsplit('#', 1) 114 (path, iterations) = opts.render.rsplit('#', 1)
116 extra_iterations = int(iterations) - 1 115 extra_iterations = int(iterations) - 1
117 else: 116 else:
118 path = opts.render 117 path = opts.render
119 extra_iterations = 0 118 extra_iterations = 0
120 119
121 content, status, headers = _Render(path, opts.directory) 120 content, status, headers = _Render(path)
122 if status in [301, 302]: 121 if status in [301, 302]:
123 # Handle a single level of redirection. 122 # Handle a single level of redirection.
124 redirect_path = headers['Location'].lstrip('/') 123 redirect_path = headers['Location'].lstrip('/')
125 sys.stderr.write('<!-- Redirected %s to %s -->\n' % (path, redirect_path)) 124 sys.stderr.write('<!-- Redirected %s to %s -->\n' % (path, redirect_path))
126 content, status, headers = _Render(redirect_path, opts.directory) 125 content, status, headers = _Render(redirect_path)
127 if status != 200: 126 if status != 200:
128 print('Error status: %s' % status) 127 print('Error status: %s' % status)
129 exit(1) 128 exit(1)
130 129
131 for _ in range(extra_iterations): 130 for _ in range(extra_iterations):
132 _Render(path, opts.directory) 131 _Render(path)
133 132
134 # Static paths will show up as /stable/static/foo but this only makes sense 133 # Static paths will show up as /stable/static/foo but this only makes sense
135 # from a webserver. 134 # from a webserver.
136 print(content.replace('/stable/static', 'static')) 135 print(content.replace('/stable/static', 'static'))
137 exit() 136 exit()
138 137
139 print('Starting previewserver on port %s' % opts.port) 138 print('Starting previewserver on port %s' % opts.port)
140 print('Reading from %s' % opts.directory)
141 print('') 139 print('')
142 print('The extension documentation can be found at:') 140 print('The extension documentation can be found at:')
143 print('') 141 print('')
144 print(' http://localhost:%s/extensions/' % opts.port) 142 print(' http://localhost:%s/extensions/' % opts.port)
145 print('') 143 print('')
146 print('The apps documentation can be found at:') 144 print('The apps documentation can be found at:')
147 print('') 145 print('')
148 print(' http://localhost:%s/apps/' % opts.port) 146 print(' http://localhost:%s/apps/' % opts.port)
149 print('') 147 print('')
150 148
151 RequestHandler.local_path = opts.directory 149 logging.getLogger().setLevel(logging.INFO)
152 server = HTTPServer(('', int(opts.port)), RequestHandler) 150 server = HTTPServer(('', int(opts.port)), RequestHandler)
153 try: 151 try:
154 server.serve_forever() 152 server.serve_forever()
155 finally: 153 finally:
156 server.socket.close() 154 server.socket.close()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698