Mercurial > public > mercurial-scm > hg
comparison mercurial/hgweb/hgwebdir_mod.py @ 5561:22713dce19f6
hgweb: return meaningful HTTP status codes instead of nonsense
author | Bryan O'Sullivan <bos@serpentine.com> |
---|---|
date | Wed, 28 Nov 2007 08:38:42 -0800 |
parents | 24de027551c1 |
children | d74fc8dec2b4 |
comparison
equal
deleted
inserted
replaced
5560:e78c24011001 | 5561:22713dce19f6 |
---|---|
7 # of the GNU General Public License, incorporated herein by reference. | 7 # of the GNU General Public License, incorporated herein by reference. |
8 | 8 |
9 import os, mimetools, cStringIO | 9 import os, mimetools, cStringIO |
10 from mercurial.i18n import gettext as _ | 10 from mercurial.i18n import gettext as _ |
11 from mercurial import ui, hg, util, templater | 11 from mercurial import ui, hg, util, templater |
12 from common import get_mtime, staticfile, style_map, paritygen | 12 from common import ErrorResponse, get_mtime, staticfile, style_map, paritygen |
13 from hgweb_mod import hgweb | 13 from hgweb_mod import hgweb |
14 | 14 |
15 # This is a stopgap | 15 # This is a stopgap |
16 class hgwebdir(object): | 16 class hgwebdir(object): |
17 def __init__(self, config, parentui=None): | 17 def __init__(self, config, parentui=None): |
213 req.write(tmpl("index", entries=entries, subdir=subdir, | 213 req.write(tmpl("index", entries=entries, subdir=subdir, |
214 sortcolumn=sortcolumn, descending=descending, | 214 sortcolumn=sortcolumn, descending=descending, |
215 **dict(sort))) | 215 **dict(sort))) |
216 | 216 |
217 try: | 217 try: |
218 virtual = req.env.get("PATH_INFO", "").strip('/') | 218 try: |
219 if virtual.startswith('static/'): | 219 virtual = req.env.get("PATH_INFO", "").strip('/') |
220 static = os.path.join(templater.templatepath(), 'static') | 220 if virtual.startswith('static/'): |
221 fname = virtual[7:] | 221 static = os.path.join(templater.templatepath(), 'static') |
222 req.write(staticfile(static, fname, req) or | 222 fname = virtual[7:] |
223 tmpl('error', error='%r not found' % fname)) | 223 req.write(staticfile(static, fname, req)) |
224 elif virtual: | 224 elif virtual: |
225 repos = dict(self.repos) | 225 repos = dict(self.repos) |
226 while virtual: | 226 while virtual: |
227 real = repos.get(virtual) | 227 real = repos.get(virtual) |
228 if real: | 228 if real: |
229 req.env['REPO_NAME'] = virtual | 229 req.env['REPO_NAME'] = virtual |
230 try: | 230 try: |
231 repo = hg.repository(parentui, real) | 231 repo = hg.repository(parentui, real) |
232 hgweb(repo).run_wsgi(req) | 232 hgweb(repo).run_wsgi(req) |
233 except IOError, inst: | 233 return |
234 req.write(tmpl("error", error=inst.strerror)) | 234 except IOError, inst: |
235 except hg.RepoError, inst: | 235 raise ErrorResponse(500, inst.strerror) |
236 req.write(tmpl("error", error=str(inst))) | 236 except hg.RepoError, inst: |
237 return | 237 raise ErrorResponse(500, str(inst)) |
238 | 238 |
239 # browse subdirectories | 239 # browse subdirectories |
240 subdir = virtual + '/' | 240 subdir = virtual + '/' |
241 if [r for r in repos if r.startswith(subdir)]: | 241 if [r for r in repos if r.startswith(subdir)]: |
242 makeindex(req, subdir) | 242 makeindex(req, subdir) |
243 return | 243 return |
244 | 244 |
245 up = virtual.rfind('/') | 245 up = virtual.rfind('/') |
246 if up < 0: | 246 if up < 0: |
247 break | 247 break |
248 virtual = virtual[:up] | 248 virtual = virtual[:up] |
249 | 249 |
250 req.write(tmpl("notfound", repo=virtual)) | 250 req.respond(404, tmpl("notfound", repo=virtual)) |
251 else: | |
252 if req.form.has_key('static'): | |
253 static = os.path.join(templater.templatepath(), "static") | |
254 fname = req.form['static'][0] | |
255 req.write(staticfile(static, fname, req) | |
256 or tmpl("error", error="%r not found" % fname)) | |
257 else: | 251 else: |
258 makeindex(req) | 252 if req.form.has_key('static'): |
253 static = os.path.join(templater.templatepath(), "static") | |
254 fname = req.form['static'][0] | |
255 req.write(staticfile(static, fname, req)) | |
256 else: | |
257 makeindex(req) | |
258 except ErrorResponse, err: | |
259 req.respond(err.code, tmpl('error', error=err.message or '')) | |
259 finally: | 260 finally: |
260 tmpl = None | 261 tmpl = None |