D2744: hgweb: handle CONTENT_LENGTH
indygreg (Gregory Szorc)
phabricator at mercurial-scm.org
Fri Mar 9 01:06:44 UTC 2018
indygreg created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.
REVISION SUMMARY
PEP-0333 says CONTENT_LENGTH may be set. I /think/ WSGI servers are
allowed to invent this key even if the client didn't send it.
We had code in wireprotoserver looking for this key. So let's
just automagically convert this key to an HTTP request header
when parsing the request.
REPOSITORY
rHG Mercurial
REVISION DETAIL
https://phab.mercurial-scm.org/D2744
AFFECTED FILES
mercurial/hgweb/request.py
mercurial/wireprotoserver.py
CHANGE DETAILS
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))
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,
To: indygreg, #hg-reviewers
Cc: mercurial-devel
More information about the Mercurial-devel
mailing list