comparison mercurial/hgweb/hgwebdir_mod.py @ 5993:948a41e77902

hgweb: explicit response status
author Dirkjan Ochtman <dirkjan@ochtman.nl>
date Fri, 01 Feb 2008 10:31:13 +0100
parents 9f1e6ab76069
children 588ad9227b63
comparison
equal deleted inserted replaced
5992:30c40ba10963 5993:948a41e77902
8 8
9 import os 9 import os
10 from mercurial.i18n import gettext as _ 10 from mercurial.i18n import gettext as _
11 from mercurial import ui, hg, util, templater, templatefilters 11 from mercurial import ui, hg, util, templater, templatefilters
12 from common import ErrorResponse, get_mtime, staticfile, style_map, paritygen,\ 12 from common import ErrorResponse, get_mtime, staticfile, style_map, paritygen,\
13 get_contact 13 get_contact, HTTP_OK, HTTP_NOT_FOUND, HTTP_SERVER_ERROR
14 from hgweb_mod import hgweb 14 from hgweb_mod import hgweb
15 from request import wsgirequest 15 from request import wsgirequest
16 16
17 # This is a stopgap 17 # This is a stopgap
18 class hgwebdir(object): 18 class hgwebdir(object):
74 74
75 try: 75 try:
76 try: 76 try:
77 77
78 virtual = req.env.get("PATH_INFO", "").strip('/') 78 virtual = req.env.get("PATH_INFO", "").strip('/')
79 tmpl = self.templater(req)
80 ctype = tmpl('mimetype', encoding=util._encoding)
81 ctype = templater.stringify(ctype)
79 82
80 # a static file 83 # a static file
81 if virtual.startswith('static/') or 'static' in req.form: 84 if virtual.startswith('static/') or 'static' in req.form:
82 static = os.path.join(templater.templatepath(), 'static') 85 static = os.path.join(templater.templatepath(), 'static')
83 if virtual.startswith('static/'): 86 if virtual.startswith('static/'):
87 req.write(staticfile(static, fname, req)) 90 req.write(staticfile(static, fname, req))
88 return 91 return
89 92
90 # top-level index 93 # top-level index
91 elif not virtual: 94 elif not virtual:
92 tmpl = self.templater(req) 95 req.respond(HTTP_OK, ctype)
93 req.write(self.makeindex(req, tmpl)) 96 req.write(self.makeindex(req, tmpl))
94 return 97 return
95 98
96 # nested indexes and hgwebs 99 # nested indexes and hgwebs
100
97 repos = dict(self.repos) 101 repos = dict(self.repos)
98 while virtual: 102 while virtual:
99 real = repos.get(virtual) 103 real = repos.get(virtual)
100 if real: 104 if real:
101 req.env['REPO_NAME'] = virtual 105 req.env['REPO_NAME'] = virtual
102 try: 106 try:
103 repo = hg.repository(self.parentui, real) 107 repo = hg.repository(self.parentui, real)
104 hgweb(repo).run_wsgi(req) 108 hgweb(repo).run_wsgi(req)
105 return 109 return
106 except IOError, inst: 110 except IOError, inst:
107 raise ErrorResponse(500, inst.strerror) 111 msg = inst.strerror
112 raise ErrorResponse(HTTP_SERVER_ERROR, msg)
108 except hg.RepoError, inst: 113 except hg.RepoError, inst:
109 raise ErrorResponse(500, str(inst)) 114 raise ErrorResponse(HTTP_SERVER_ERROR, str(inst))
110 115
111 # browse subdirectories 116 # browse subdirectories
112 subdir = virtual + '/' 117 subdir = virtual + '/'
113 if [r for r in repos if r.startswith(subdir)]: 118 if [r for r in repos if r.startswith(subdir)]:
114 tmpl = self.templater(req) 119 req.respond(HTTP_OK, ctype)
115 req.write(self.makeindex(req, tmpl, subdir)) 120 req.write(self.makeindex(req, tmpl, subdir))
116 return 121 return
117 122
118 up = virtual.rfind('/') 123 up = virtual.rfind('/')
119 if up < 0: 124 if up < 0:
120 break 125 break
121 virtual = virtual[:up] 126 virtual = virtual[:up]
122 127
123 # prefixes not found 128 # prefixes not found
124 tmpl = self.templater(req) 129 req.respond(HTTP_NOT_FOUND, ctype)
125 req.respond(404, tmpl("notfound", repo=virtual)) 130 req.write(tmpl("notfound", repo=virtual))
126 131
127 except ErrorResponse, err: 132 except ErrorResponse, err:
128 tmpl = self.templater(req) 133 req.respond(err.code, ctype)
129 req.respond(err.code, tmpl('error', error=err.message or '')) 134 req.write(tmpl('error', error=err.message or ''))
130 finally: 135 finally:
131 tmpl = None 136 tmpl = None
132 137
133 def makeindex(self, req, tmpl, subdir=""): 138 def makeindex(self, req, tmpl, subdir=""):
134 139
232 **dict(sort)) 237 **dict(sort))
233 238
234 def templater(self, req): 239 def templater(self, req):
235 240
236 def header(**map): 241 def header(**map):
237 ctype = tmpl('mimetype', encoding=util._encoding)
238 req.httphdr(templater.stringify(ctype))
239 yield tmpl('header', encoding=util._encoding, **map) 242 yield tmpl('header', encoding=util._encoding, **map)
240 243
241 def footer(**map): 244 def footer(**map):
242 yield tmpl("footer", **map) 245 yield tmpl("footer", **map)
243 246