hgweb.cgi: fix internal WSGI emulation (
issue3804)
The internal WSGI emulation in wsgicgi.py was not fully WSGI compliant and
assumed that all responses sent a body. With
3fbdbeab38cc that caused a real
bug when using hgweb.cgi.
wsgicgi.py will now make sure headers always are sent, using the pattern from
PEP 333 and similar to how it is done in
c007e5c54b16.
--- a/mercurial/hgweb/wsgicgi.py Sun Feb 03 14:26:39 2013 -0800
+++ b/mercurial/hgweb/wsgicgi.py Mon Feb 04 23:25:25 2013 +0100
@@ -77,5 +77,7 @@
try:
for chunk in content:
write(chunk)
+ if not headers_sent:
+ write('') # send headers now if body was empty
finally:
getattr(content, 'close', lambda : None)()
--- a/tests/test-clone-cgi.t Sun Feb 03 14:26:39 2013 -0800
+++ b/tests/test-clone-cgi.t Mon Feb 04 23:25:25 2013 +0100
@@ -29,3 +29,11 @@
$ python hgweb.cgi >page1 2>&1
$ python "$TESTDIR/md5sum.py" page1
1f424bb22ec05c3c6bc866b6e67efe43 page1
+
+make sure headers are sent even when there is no body
+
+ $ QUERY_STRING="cmd=listkeys&namespace=nosuchnamespace" python hgweb.cgi
+ Status: 200 Script output follows\r (esc)
+ Content-Type: application/mercurial-0.1\r (esc)
+ Content-Length: 0\r (esc)
+ \r (esc)
--- a/tests/test-hgweb-commands.t Sun Feb 03 14:26:39 2013 -0800
+++ b/tests/test-hgweb-commands.t Mon Feb 04 23:25:25 2013 +0100
@@ -1376,13 +1376,20 @@
$ . "$TESTDIR/cgienv"
$ PATH_INFO=/bookmarks; export PATH_INFO
$ QUERY_STRING='style=raw'
- $ python hgweb.cgi
+ $ python hgweb.cgi | grep -v ETag:
+ Status: 200 Script output follows\r (esc)
+ Content-Type: text/plain; charset=ascii\r (esc)
+ \r (esc)
listbookmarks hides secret bookmarks
$ PATH_INFO=/; export PATH_INFO
$ QUERY_STRING='cmd=listkeys&namespace=bookmarks'
$ python hgweb.cgi
+ Status: 200 Script output follows\r (esc)
+ Content-Type: application/mercurial-0.1\r (esc)
+ Content-Length: 0\r (esc)
+ \r (esc)
search works with filtering