comparison mercurial/hgweb/hgwebdir_mod.py @ 37818:877185de62cf stable

hgweb: reuse body file object when hgwebdir calls hgweb (issue5851) An unintended side-effect of f0a851542a05 was that the request body file object (which uses a util.cappedreader) was constructed twice when hgwebdir called into hgweb. Since we attempt to read all remaining data from this file object when Content-Length is defined and since there were two instances of this object and the client supplied no additional data to read, this resulted in deadlock. The fix implemented in this commit is to reuse the request body file object when it is passed from hgwebdir to hgweb. A test demonstrating `hg clone` and `hg push` via hgwebdir has been added. Without this patch, the test hangs when doing `hg clone`. Surprisingly, this must mean that we have effectively no test coverage of the wire protocol when run via hgwebdir. Differential Revision: https://phab.mercurial-scm.org/D3427
author Gregory Szorc <gregory.szorc@gmail.com>
date Tue, 24 Apr 2018 13:55:25 -0700
parents a728e3695325
children 258d90f69076
comparison
equal deleted inserted replaced
37817:678ab0de7296 37818:877185de62cf
426 if pycompat.ispy3: 426 if pycompat.ispy3:
427 uenv = {k.decode('latin1'): v for k, v in 427 uenv = {k.decode('latin1'): v for k, v in
428 uenv.iteritems()} 428 uenv.iteritems()}
429 req = requestmod.parserequestfromenv( 429 req = requestmod.parserequestfromenv(
430 uenv, reponame=virtualrepo, 430 uenv, reponame=virtualrepo,
431 altbaseurl=self.ui.config('web', 'baseurl')) 431 altbaseurl=self.ui.config('web', 'baseurl'),
432 # Reuse wrapped body file object otherwise state
433 # tracking can get confused.
434 bodyfh=req.bodyfh)
432 try: 435 try:
433 # ensure caller gets private copy of ui 436 # ensure caller gets private copy of ui
434 repo = hg.repository(self.ui.copy(), real) 437 repo = hg.repository(self.ui.copy(), real)
435 return hgweb_mod.hgweb(repo).run_wsgi(req, res) 438 return hgweb_mod.hgweb(repo).run_wsgi(req, res)
436 except IOError as inst: 439 except IOError as inst: