diff --git a/mercurial/hgweb/request.py b/mercurial/hgweb/request.py --- a/mercurial/hgweb/request.py +++ b/mercurial/hgweb/request.py @@ -200,6 +200,13 @@ headers = wsgiheaders.Headers(headers) + # This is kind of a lie because the HTTP header wasn't explicitly + # sent. But for all intents and purposes it should be OK to lie about + # this, since a consumer will either either value to determine how many + # bytes are available to read. + if 'CONTENT_LENGTH' in env and 'HTTP_CONTENT_LENGTH' not in env: + headers['Content-Length'] = env['CONTENT_LENGTH'] + return parsedrequest(url=fullurl, baseurl=baseurl, advertisedurl=advertisedfullurl, advertisedbaseurl=advertisedbaseurl, diff --git a/mercurial/wireprotoserver.py b/mercurial/wireprotoserver.py --- a/mercurial/wireprotoserver.py +++ b/mercurial/wireprotoserver.py @@ -91,10 +91,9 @@ return args def forwardpayload(self, fp): - if b'Content-Length' in self._req.headers: - length = int(self._req.headers[b'Content-Length']) - else: - length = int(self._wsgireq.env[r'CONTENT_LENGTH']) + # TODO Content-Length may not always be defined. + length = int(self._req.headers[b'Content-Length']) + # If httppostargs is used, we need to read Content-Length # minus the amount that was consumed by args. length -= int(self._req.headers.get(b'X-HgArgs-Post', 0))