Mercurial > public > mercurial-scm > hg
comparison mercurial/hgweb/hgweb_mod.py @ 11582:26c7d4fc31bf
protocol: use new wireproto infrastructure in ssh
- add protocol helper
- insert wireproto into dispatcher
- drop duplicate functions from hgweb implementation
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Wed, 14 Jul 2010 15:25:15 -0500 |
parents | db3f6f0e4e7d |
children | 1af96b090116 |
comparison
equal
deleted
inserted
replaced
11581:4530b3307fb9 | 11582:26c7d4fc31bf |
---|---|
5 # | 5 # |
6 # This software may be used and distributed according to the terms of the | 6 # This software may be used and distributed according to the terms of the |
7 # GNU General Public License version 2 or any later version. | 7 # GNU General Public License version 2 or any later version. |
8 | 8 |
9 import os | 9 import os |
10 from mercurial import ui, hg, hook, error, encoding, templater | 10 from mercurial import ui, hg, hook, error, encoding, templater, wireproto |
11 from common import get_mtime, ErrorResponse, permhooks | 11 from common import get_mtime, ErrorResponse, permhooks |
12 from common import HTTP_OK, HTTP_BAD_REQUEST, HTTP_NOT_FOUND, HTTP_SERVER_ERROR | 12 from common import HTTP_OK, HTTP_BAD_REQUEST, HTTP_NOT_FOUND, HTTP_SERVER_ERROR |
13 from request import wsgirequest | 13 from request import wsgirequest |
14 import webcommands, protocol, webutil | 14 import webcommands, protocol, webutil |
15 | 15 |
19 'stream_out': 'pull', | 19 'stream_out': 'pull', |
20 'listkeys': 'pull', | 20 'listkeys': 'pull', |
21 'unbundle': 'push', | 21 'unbundle': 'push', |
22 'pushkey': 'push', | 22 'pushkey': 'push', |
23 } | 23 } |
24 | |
25 class webproto(object): | |
26 def __init__(self, req): | |
27 self.req = req | |
28 self.response = '' | |
29 def getargs(self, args): | |
30 data = {} | |
31 keys = args.split() | |
32 for k in keys: | |
33 if k == '*': | |
34 star = {} | |
35 for key in self.req.form.keys(): | |
36 if key not in keys: | |
37 star[key] = self.req.form[key][0] | |
38 data['*'] = star | |
39 else: | |
40 data[k] = self.req.form[k][0] | |
41 return [data[k] for k in keys] | |
42 def respond(self, s): | |
43 HGTYPE = 'application/mercurial-0.1' | |
44 self.req.respond(HTTP_OK, HGTYPE, length=len(s)) | |
45 self.response = s | |
46 | |
47 def callproto(repo, req, cmd): | |
48 p = webproto(req) | |
49 r = wireproto.dispatch(repo, p, cmd) | |
50 yield p.response | |
24 | 51 |
25 class hgweb(object): | 52 class hgweb(object): |
26 def __init__(self, repo, name=None, baseui=None): | 53 def __init__(self, repo, name=None, baseui=None): |
27 if isinstance(repo, str): | 54 if isinstance(repo, str): |
28 if baseui: | 55 if baseui: |
121 self.check_perm(req, perms[cmd]) | 148 self.check_perm(req, perms[cmd]) |
122 except ErrorResponse, inst: | 149 except ErrorResponse, inst: |
123 if cmd == 'unbundle': | 150 if cmd == 'unbundle': |
124 req.drain() | 151 req.drain() |
125 raise | 152 raise |
153 if cmd in wireproto.commands: | |
154 return callproto(self.repo, req, cmd) | |
126 method = getattr(protocol, cmd) | 155 method = getattr(protocol, cmd) |
127 return method(self.repo, req) | 156 return method(self.repo, req) |
128 except ErrorResponse, inst: | 157 except ErrorResponse, inst: |
129 req.respond(inst, protocol.HGTYPE) | 158 req.respond(inst, protocol.HGTYPE) |
130 if not inst.message: | 159 if not inst.message: |