Yo,
I'm in the process of moving from mod_webkit to using the built-in
HTTP server (because my hosting co wants to run my webapp behind
Apache mod_rewrite/mod_proxy).
My service supports uploads of some very large files. This worked
fine under mod_webkit, which is what we had been using. However,
things are blowing up with the built-in HTTP server. I did some
investigating, and discovered that, for *any* request with a separate
body (a POST, a multipart/form, etc), WebKit.HTTPServer.HTTPHandler
is reading the entire body into memory, then wrapping it in a
StringIO instance before handing if off to the Application class.
This is a disaster for large files (> 50 M, say), and just seems like
an odd design choice all around.
After looking carefully at HTTPHandler, I think I've found a way to
avoid holding that file in memory. I wanted to ask the list if there
was a reason for the current design that I'm missing. If not, I'd
propose the patch below as an improvement to the built-in HTTP
server. Here's what I'm doing:
In WebKit/HTTPServer.py, l. 58, it does the read into memory from
rfile (which is a file-like wrapper around the connection from the
client, poised to read at the start of the body):
input = self.headers.has_key('Content-Length') \
and self.rfile.read(int(self.headers['Content-Length']))
or ''
Which is then wrapped in StringIO and passed on to the app on l. 140:
'input': StringIO(input),
I changed that to (again, l.58):
if self.headers.has_key('Content-Length'):
input = self.rfile
env['CONTENT_LENGTH'] = self.headers['Content-Length']
else:
input = StringIO('')
And then just passed that input in directly on l. 140:
'input': input,
I had to set the CONTENT_LENGTH in the environment dict so that
cgi.py could accurately parse it. Without that, it just locked up.
With it, it seems to be working fine.
Basically, I'm just removing an extra level of reading into memory
and then wrapping in StringIO, which, as far as I can tell, is
serving no purpose, and, for large request bodies, is a crippling
problem.
Anyone know what it's set up the way it is now?
-Dan Milstein
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Webware-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/webware-devel