changeset 18552:e8efcc8ff5c0 stable

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.
author Mads Kiilerich <madski@unity3d.com>
date Mon, 04 Feb 2013 23:25:25 +0100
parents 12de53323e59
children b6b9475c563a
files mercurial/hgweb/wsgicgi.py tests/test-clone-cgi.t tests/test-hgweb-commands.t
diffstat 3 files changed, 18 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- 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