3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com> |
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com> |
4 # |
4 # |
5 # This software may be used and distributed according to the terms of the |
5 # This software may be used and distributed according to the terms of the |
6 # GNU General Public License version 2 or any later version. |
6 # GNU General Public License version 2 or any later version. |
7 |
7 |
8 import cStringIO, zlib, sys, urllib |
8 import cgi, cStringIO, itertools, zlib, sys, urllib |
9 from mercurial import util, wireproto |
9 from mercurial import util, wireproto |
10 from common import HTTP_OK |
10 from common import HTTP_OK |
11 |
11 |
12 HGTYPE = 'application/mercurial-0.1' |
12 HGTYPE = 'application/mercurial-0.1' |
13 |
13 |
14 class webproto(object): |
14 class webproto(object): |
15 def __init__(self, req): |
15 def __init__(self, req): |
16 self.req = req |
16 self.req = req |
17 self.response = '' |
17 self.response = '' |
18 def getargs(self, args): |
18 def getargs(self, args): |
|
19 knownargs = self._args() |
19 data = {} |
20 data = {} |
20 keys = args.split() |
21 keys = args.split() |
21 for k in keys: |
22 for k in keys: |
22 if k == '*': |
23 if k == '*': |
23 star = {} |
24 star = {} |
24 for key in self.req.form.keys(): |
25 for key in knownargs.keys(): |
25 if key != 'cmd' and key not in keys: |
26 if key != 'cmd' and key not in keys: |
26 star[key] = self.req.form[key][0] |
27 star[key] = knownargs[key][0] |
27 data['*'] = star |
28 data['*'] = star |
28 else: |
29 else: |
29 data[k] = self.req.form[k][0] |
30 data[k] = knownargs[k][0] |
30 return [data[k] for k in keys] |
31 return [data[k] for k in keys] |
|
32 def _args(self): |
|
33 args = self.req.form.copy() |
|
34 chunks = [] |
|
35 for i in itertools.count(1): |
|
36 h = self.req.env.get('HTTP_X_ARG_' + str(i)) |
|
37 if h is None: |
|
38 break |
|
39 chunks += [h] |
|
40 args.update(cgi.parse_qs(''.join(chunks), keep_blank_values=True)) |
|
41 return args |
31 def getfile(self, fp): |
42 def getfile(self, fp): |
32 length = int(self.req.env['CONTENT_LENGTH']) |
43 length = int(self.req.env['CONTENT_LENGTH']) |
33 for s in util.filechunkiter(self.req, limit=length): |
44 for s in util.filechunkiter(self.req, limit=length): |
34 fp.write(s) |
45 fp.write(s) |
35 def redirect(self): |
46 def redirect(self): |