hgweb.cgi: fix internal WSGI emulation (issue3804) stable
authorMads Kiilerich <madski@unity3d.com>
Mon, 04 Feb 2013 23:25:25 +0100
branchstable
changeset 18552 e8efcc8ff5c0
parent 18549 12de53323e59
child 18553 b6b9475c563a
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.
mercurial/hgweb/wsgicgi.py
tests/test-clone-cgi.t
tests/test-hgweb-commands.t
--- 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