Description
XMLRPC is broken for FastCGI engine, unknown cause. It is not the same as MoinMoinBugs/XmlRpcBroken, because the CGI appears to work.
Steps to reproduce
Try to do an XMLRPC request to a FastCGI engine, such as:
Example
Doesn't work here. Need to find a public FastCGI wiki first...
The following error is returned:
xml.parsers.expat.ExpatError: no element found: line 1, column 0
File "/usr/lib/python2.4/site-packages/MoinMoin/wikirpc.py", line 402, in proc
ess
params, method = xmlrpclib.loads(data)
File "/usr/lib/python2.4/xmlrpclib.py", line 1080, in loads
p.close()
File "/usr/lib/python2.4/xmlrpclib.py", line 530, in close
self._parser.Parse("", 1) # end of dataThe code is in wikirpc.py, process(), starting at line 400:
data returns a Null or empty string.
Details
MoinMoin Version |
1.5.4 [Revision release] |
OS and Version |
Gentoo, with GCC 3.3.6 (Gentoo 3.3.6, ssp-3.3.6-1.0, pie-8.7.8) |
Python Version |
2.4.3 (#2, Jun 29 2006, 02:46:39) |
Server Setup |
Apache with FastCGI, single |
Workaround
Use a different engine. Works with regular CGI, unknown on other engines.
Discussion
This looks like it is the same bug - the body is read before the XMLRPC code can handle it.
Yes, the body is read by cgi.FieldStorage for whatever reason. This patch makes it work for me:
diff -r dc1784a3e30f MoinMoin/support/thfcgi.py
--- a/MoinMoin/support/thfcgi.py Mon Jul 10 13:16:00 2006 +0200
+++ b/MoinMoin/support/thfcgi.py Wed Jul 19 22:14:47 2006 +0100
@@ -281,8 +281,13 @@ class Request:
"""Return a cgi FieldStorage constructed from the stdin and
environ read from the server for this request."""
self.stdin.reset()
- return cgi.FieldStorage(fp=self.stdin, environ=self.env,
- keep_blank_values=1)
+ # cgi.FieldStorage will eat the input here...
+ r = cgi.FieldStorage(fp=self.stdin, environ=self.env,
+ keep_blank_values=1)
+ # hence, we reset here so we can obtain
+ # the data again...
+ self.stdin.reset()
+ return r
def _flush(self, stream):
"""Flush a stream of this request."""
@@ -478,6 +483,8 @@ class Request:
if not rec.content:
self.stdin_complete = 1
+ self.stdin.reset()
+ return
self.stdin.write(rec.content)-- JohannesBerg DateTime(2006-07-19T21:16:10Z)
Works for bug submitter too. My site is fast again! Thank Johannes! -- JohnWhitlock 2006-07-20 13:21:34
Plan
- Priority:
- Assigned to:
Status: fix in 1.6 changeset 996: bd54096490d3, 1.5 changeset 663: 95a2991fb76c, thanks to JohannesBerg
