protocol.py
75 lines
| 2.5 KiB
| text/x-python
|
PythonLexer
Dirkjan Ochtman
|
r5598 | # | ||
# Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net> | ||||
# Copyright 2005-2007 Matt Mackall <mpm@selenic.com> | ||||
# | ||||
Martin Geisler
|
r8225 | # This software may be used and distributed according to the terms of the | ||
Matt Mackall
|
r10263 | # GNU General Public License version 2 or any later version. | ||
Dirkjan Ochtman
|
r5598 | |||
Matt Mackall
|
r11595 | import cStringIO, zlib, sys, urllib | ||
from mercurial import util, wireproto | ||||
from common import HTTP_OK | ||||
Dirkjan Ochtman
|
r5963 | |||
Dirkjan Ochtman
|
r5993 | HGTYPE = 'application/mercurial-0.1' | ||
Matt Mackall
|
r11595 | |||
class webproto(object): | ||||
def __init__(self, req): | ||||
self.req = req | ||||
self.response = '' | ||||
def getargs(self, args): | ||||
data = {} | ||||
keys = args.split() | ||||
for k in keys: | ||||
if k == '*': | ||||
star = {} | ||||
for key in self.req.form.keys(): | ||||
Peter Arrenbrecht
|
r13721 | if key != 'cmd' and key not in keys: | ||
Matt Mackall
|
r11595 | star[key] = self.req.form[key][0] | ||
data['*'] = star | ||||
else: | ||||
data[k] = self.req.form[k][0] | ||||
return [data[k] for k in keys] | ||||
Dirkjan Ochtman
|
r11621 | def getfile(self, fp): | ||
length = int(self.req.env['CONTENT_LENGTH']) | ||||
for s in util.filechunkiter(self.req, limit=length): | ||||
fp.write(s) | ||||
def redirect(self): | ||||
self.oldio = sys.stdout, sys.stderr | ||||
sys.stderr = sys.stdout = cStringIO.StringIO() | ||||
Dirkjan Ochtman
|
r11623 | def groupchunks(self, cg): | ||
Matt Mackall
|
r11595 | z = zlib.compressobj() | ||
while 1: | ||||
chunk = cg.read(4096) | ||||
if not chunk: | ||||
break | ||||
Dirkjan Ochtman
|
r11623 | yield z.compress(chunk) | ||
yield z.flush() | ||||
Matt Mackall
|
r11595 | def _client(self): | ||
return 'remote:%s:%s:%s' % ( | ||||
self.req.env.get('wsgi.url_scheme') or 'http', | ||||
urllib.quote(self.req.env.get('REMOTE_HOST', '')), | ||||
urllib.quote(self.req.env.get('REMOTE_USER', ''))) | ||||
def iscmd(cmd): | ||||
return cmd in wireproto.commands | ||||
def call(repo, req, cmd): | ||||
p = webproto(req) | ||||
Dirkjan Ochtman
|
r11625 | rsp = wireproto.dispatch(repo, p, cmd) | ||
Dirkjan Ochtman
|
r11626 | if isinstance(rsp, str): | ||
req.respond(HTTP_OK, HGTYPE, length=len(rsp)) | ||||
return [rsp] | ||||
elif isinstance(rsp, wireproto.streamres): | ||||
req.respond(HTTP_OK, HGTYPE) | ||||
return rsp.gen | ||||
elif isinstance(rsp, wireproto.pushres): | ||||
val = sys.stdout.getvalue() | ||||
sys.stdout, sys.stderr = p.oldio | ||||
req.respond(HTTP_OK, HGTYPE) | ||||
return ['%d\n%s' % (rsp.res, val)] | ||||
Benoit Boissinot
|
r12703 | elif isinstance(rsp, wireproto.pusherr): | ||
Benoit Boissinot
|
r12704 | # drain the incoming bundle | ||
req.drain() | ||||
Benoit Boissinot
|
r12703 | sys.stdout, sys.stderr = p.oldio | ||
rsp = '0\n%s\n' % rsp.res | ||||
req.respond(HTTP_OK, HGTYPE, length=len(rsp)) | ||||
return [rsp] | ||||