OLD | NEW |
---|---|
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 | 2 |
3 ''' | 3 ''' |
4 Copyright 2013 Google Inc. | 4 Copyright 2013 Google Inc. |
5 | 5 |
6 Use of this source code is governed by a BSD-style license that can be | 6 Use of this source code is governed by a BSD-style license that can be |
7 found in the LICENSE file. | 7 found in the LICENSE file. |
8 ''' | 8 ''' |
9 | 9 |
10 ''' | 10 ''' |
11 HTTP server for our HTML rebaseline viewer. | 11 HTTP server for our HTML rebaseline viewer. |
12 ''' | 12 ''' |
13 | 13 |
14 # System-level imports | 14 # System-level imports |
15 import argparse | 15 import argparse |
16 import BaseHTTPServer | 16 import BaseHTTPServer |
17 import json | 17 import json |
18 import os | 18 import os |
19 import posixpath | 19 import posixpath |
20 import re | 20 import re |
21 import shutil | 21 import shutil |
22 import sys | 22 import sys |
23 | 23 |
24 # Imports from within Skia | 24 # Imports from within Skia |
25 # | 25 # |
26 # We need to add the 'tools' directory, so that we can import svn.py within | 26 # We need to add the 'tools' directory, so that we can import svn.py within |
27 # that directory. | 27 # that directory. |
28 # Make sure that the 'tools' dir is in the PYTHONPATH, but add it at the *end* | 28 # Make sure that the 'tools' dir is in the PYTHONPATH, but add it at the *end* |
29 # so any dirs that are already in the PYTHONPATH will be preferred. | 29 # so any dirs that are already in the PYTHONPATH will be preferred. |
30 TRUNK_DIRECTORY = os.path.dirname(os.path.dirname(os.path.dirname( | 30 PARENT_DIRECTORY = os.path.dirname(os.path.realpath(__file__)) |
31 os.path.realpath(__file__)))) | 31 TRUNK_DIRECTORY = os.path.dirname(os.path.dirname(PARENT_DIRECTORY)) |
32 TOOLS_DIRECTORY = os.path.join(TRUNK_DIRECTORY, 'tools') | 32 TOOLS_DIRECTORY = os.path.join(TRUNK_DIRECTORY, 'tools') |
33 if TOOLS_DIRECTORY not in sys.path: | 33 if TOOLS_DIRECTORY not in sys.path: |
34 sys.path.append(TOOLS_DIRECTORY) | 34 sys.path.append(TOOLS_DIRECTORY) |
35 import svn | 35 import svn |
36 | 36 |
37 # Imports from local dir | 37 # Imports from local dir |
38 import results | 38 import results |
39 | 39 |
40 ACTUALS_SVN_REPO = 'http://skia-autogen.googlecode.com/svn/gm-actual' | 40 ACTUALS_SVN_REPO = 'http://skia-autogen.googlecode.com/svn/gm-actual' |
41 PATHSPLIT_RE = re.compile('/([^/]+)/(.+)') | 41 PATHSPLIT_RE = re.compile('/([^/]+)/(.+)') |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
150 TODO(epoger): Unless we start making use of result_type, remove that | 150 TODO(epoger): Unless we start making use of result_type, remove that |
151 parameter.""" | 151 parameter.""" |
152 print 'do_GET_results: sending results of type "%s"' % result_type | 152 print 'do_GET_results: sending results of type "%s"' % result_type |
153 response_dict = _SERVER.results.GetAll() | 153 response_dict = _SERVER.results.GetAll() |
154 if response_dict: | 154 if response_dict: |
155 self.send_json_dict(response_dict) | 155 self.send_json_dict(response_dict) |
156 else: | 156 else: |
157 self.send_error(404) | 157 self.send_error(404) |
158 | 158 |
159 def do_GET_static(self, path): | 159 def do_GET_static(self, path): |
160 """ Handle a GET request for a file under the 'static' directory. """ | 160 """ Handle a GET request for a file under the 'static' directory. |
161 Only allow serving of files within the 'static' directory that is a | |
162 filesystem sibling of this script. """ | |
161 print 'do_GET_static: sending file "%s"' % path | 163 print 'do_GET_static: sending file "%s"' % path |
162 self.send_file(posixpath.join('static', path)) | 164 static_dir = os.path.realpath(os.path.join(PARENT_DIRECTORY, 'static')) |
epoger
2013/10/02 18:39:56
Main purpose of this CL: make the server retrieve
| |
165 full_path = os.path.realpath(os.path.join(static_dir, path)) | |
166 if full_path.startswith(static_dir): | |
167 self.send_file(full_path) | |
168 else: | |
169 print ('Attempted do_GET_static() of path [%s] outside of static dir [%s]' | |
epoger
2013/10/02 18:39:56
While I was at it, put in some double-checking to
| |
170 % (full_path, static_dir)) | |
171 self.send_error(404) | |
163 | 172 |
164 def redirect_to(self, url): | 173 def redirect_to(self, url): |
165 """ Redirect the HTTP client to a different url. """ | 174 """ Redirect the HTTP client to a different url. """ |
166 self.send_response(301) | 175 self.send_response(301) |
167 self.send_header('Location', url) | 176 self.send_header('Location', url) |
168 self.end_headers() | 177 self.end_headers() |
169 | 178 |
170 def send_file(self, path): | 179 def send_file(self, path): |
171 """ Send the contents of the file at this path, with a mimetype based | 180 """ Send the contents of the file at this path, with a mimetype based |
172 on the filename extension. """ | 181 on the filename extension. """ |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
219 'defaults to %(default)s'), | 228 'defaults to %(default)s'), |
220 default=DEFAULT_PORT) | 229 default=DEFAULT_PORT) |
221 args = parser.parse_args() | 230 args = parser.parse_args() |
222 global _SERVER | 231 global _SERVER |
223 _SERVER = Server(expectations_dir=args.expectations_dir, | 232 _SERVER = Server(expectations_dir=args.expectations_dir, |
224 port=args.port, export=args.export) | 233 port=args.port, export=args.export) |
225 _SERVER.run() | 234 _SERVER.run() |
226 | 235 |
227 if __name__ == '__main__': | 236 if __name__ == '__main__': |
228 main() | 237 main() |
OLD | NEW |