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()