41 chunk = cg.read(4096) |
41 chunk = cg.read(4096) |
42 if not chunk: |
42 if not chunk: |
43 break |
43 break |
44 yield z.compress(chunk) |
44 yield z.compress(chunk) |
45 yield z.flush() |
45 yield z.flush() |
46 def sendresponse(self, s): |
|
47 self.req.respond(HTTP_OK, HGTYPE, length=len(s)) |
|
48 self.response = s |
|
49 def sendstream(self, source): |
|
50 self.req.respond(HTTP_OK, HGTYPE) |
|
51 for chunk in source.gen: |
|
52 self.req.write(chunk) |
|
53 def sendpushresponse(self, rsp): |
|
54 val = sys.stdout.getvalue() |
|
55 sys.stdout, sys.stderr = self.oldio |
|
56 self.req.respond(HTTP_OK, HGTYPE) |
|
57 self.response = '%d\n%s' % (rsp.res, val) |
|
58 |
|
59 handlers = { |
|
60 str: sendresponse, |
|
61 wireproto.streamres: sendstream, |
|
62 wireproto.pushres: sendpushresponse, |
|
63 } |
|
64 |
|
65 def _client(self): |
46 def _client(self): |
66 return 'remote:%s:%s:%s' % ( |
47 return 'remote:%s:%s:%s' % ( |
67 self.req.env.get('wsgi.url_scheme') or 'http', |
48 self.req.env.get('wsgi.url_scheme') or 'http', |
68 urllib.quote(self.req.env.get('REMOTE_HOST', '')), |
49 urllib.quote(self.req.env.get('REMOTE_HOST', '')), |
69 urllib.quote(self.req.env.get('REMOTE_USER', ''))) |
50 urllib.quote(self.req.env.get('REMOTE_USER', ''))) |
72 return cmd in wireproto.commands |
53 return cmd in wireproto.commands |
73 |
54 |
74 def call(repo, req, cmd): |
55 def call(repo, req, cmd): |
75 p = webproto(req) |
56 p = webproto(req) |
76 rsp = wireproto.dispatch(repo, p, cmd) |
57 rsp = wireproto.dispatch(repo, p, cmd) |
77 webproto.handlers[rsp.__class__](p, rsp) |
58 if isinstance(rsp, str): |
78 return [p.response] |
59 req.respond(HTTP_OK, HGTYPE, length=len(rsp)) |
|
60 return [rsp] |
|
61 elif isinstance(rsp, wireproto.streamres): |
|
62 req.respond(HTTP_OK, HGTYPE) |
|
63 return rsp.gen |
|
64 elif isinstance(rsp, wireproto.pushres): |
|
65 val = sys.stdout.getvalue() |
|
66 sys.stdout, sys.stderr = p.oldio |
|
67 req.respond(HTTP_OK, HGTYPE) |
|
68 return ['%d\n%s' % (rsp.res, val)] |