Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/hgweb/protocol.py @ 33842:3c91cc0c5fde
httppeer: add support for httppostargs when we're sending a file
This is probably only used in the 'unbundle' command, but the code
ended up being cleaner to make it generic and treat *all* httppostargs
with a non-args request body as though they were file-like in
nature. It also means we get test coverage more or less for free. A
previous version of this change didn't use io.BytesIO, and it was a
lot more complicated.
This also fixes a server-side bug, so anyone using httppostargs should
update all of their servers to this revision or later *before* this
gets to their clients, otherwise servers will hang trying to over-read
the POST body.
Differential Revision: https://phab.mercurial-scm.org/D231
author | Augie Fackler <augie@google.com> |
---|---|
date | Wed, 26 Jul 2017 17:58:19 -0400 |
parents | 35c233975b78 |
children | e21f274cccea |
comparison
equal
deleted
inserted
replaced
33841:fa7e30efe05a | 33842:3c91cc0c5fde |
---|---|
73 argvalue = decodevaluefromheaders(self.req, 'X-HgArg') | 73 argvalue = decodevaluefromheaders(self.req, 'X-HgArg') |
74 args.update(cgi.parse_qs(argvalue, keep_blank_values=True)) | 74 args.update(cgi.parse_qs(argvalue, keep_blank_values=True)) |
75 return args | 75 return args |
76 def getfile(self, fp): | 76 def getfile(self, fp): |
77 length = int(self.req.env['CONTENT_LENGTH']) | 77 length = int(self.req.env['CONTENT_LENGTH']) |
78 # If httppostargs is used, we need to read Content-Length | |
79 # minus the amount that was consumed by args. | |
80 length -= int(self.req.env.get('HTTP_X_HGARGS_POST', 0)) | |
78 for s in util.filechunkiter(self.req, limit=length): | 81 for s in util.filechunkiter(self.req, limit=length): |
79 fp.write(s) | 82 fp.write(s) |
80 def redirect(self): | 83 def redirect(self): |
81 self.oldio = self.ui.fout, self.ui.ferr | 84 self.oldio = self.ui.fout, self.ui.ferr |
82 self.ui.ferr = self.ui.fout = stringio() | 85 self.ui.ferr = self.ui.fout = stringio() |