[Zope-dev] Re: Proposal for optimized Blob handling
Chris McDonough
chrism at plope.com
Wed Mar 7 22:46:39 EST 2007
Note that one micro-optimization for PUT requests is to not use a
FieldStorage at all because the body is never mime-encoded anyway in
practice.
I have a monkey patch to do this now, which I turned into a patch for
the core, but took out because Phillipp whined at a sprint once. ;-)
Here's the monkey patch...
def patch_httprequest_processinputs():
""" Patch HTTPRequest.processInputs to not do any processing on a
PUT request (it's pointless, and foils our on-the-fly encryption,
as it creates a new tempfile via FieldStorage). """
# note that OTF encryption support only works for PUT requests
import re
from ZPublisher.HTTPRequest import HTTPRequest
oldProcessInputs = HTTPRequest.processInputs
def newProcessInputs(
self,
# "static" variables that we want to be local for speed
SEQUENCE=1,
DEFAULT=2,
RECORD=4,
RECORDS=8,
REC=12, # RECORD|RECORDS
EMPTY=16,
CONVERTED=32,
hasattr=hasattr,
getattr=getattr,
setattr=setattr,
search_type=re.compile('(:[a-zA-Z][-a-zA-Z0-9_]+|\\.[xy])
$').search,
):
"""Process request inputs
We need to delay input parsing so that it is done under
publisher control for error handling purposes.
"""
method=self.environ.get('REQUEST_METHOD','GET')
if method == 'PUT':
# we don't need to do any real input processing if we
are handling
# a PUT request. This is an optimization especially
because
# FieldStorage creates an additional tempfile if we
allow it to
# parse the body, and PUT uploads can tend to be large.
self._file = self.stdin
return
return oldProcessInputs(self)
HTTPRequest.processInputs = newProcessInputs
- C
On Mar 7, 2007, at 9:57 PM, Philipp von Weitershausen wrote:
> Christian Theune wrote:
>> Hi,
>> [modified slightly from a similar proposal to zope3-dev to match Zope
>> 2's publisher]
>> I'm writing up a proposal for the ZODB to make even more efficient
>> Blob
>> handling possible.
>> This includes not copying the data from an uploaded file, but using a
>> `link` operation when possible.
>
> I think this is a great idea.
>
> Am I the only person here who immediately associated "link" with
> the POSIX? Also, am I the only one who read "when possible" as
> "when on a POSIX system where link is available", in other words,
> "when not on Windows"? One starts to wonder...
>
>> However, the HTTPRequest class currently uses the default
>> implementation
>> of the cgi module's FieldStorage.
>> I propose to create a small subclass to override the `make_file`
>> method
>> to use `NamedTemporaryFile` instead of `TemporaryFile` to allow
>> the file
>> being accessible from a filename so I can apply a `link` operation.
>
> +1
>
>
> --
> http://worldcookery.com -- Professional Zope documentation and
> training
> _______________________________________________
> Zope-Dev maillist - Zope-Dev at zope.org
> http://mail.zope.org/mailman/listinfo/zope-dev
> ** No cross posts or HTML encoding! **
> (Related lists - http://mail.zope.org/mailman/listinfo/zope-announce
> http://mail.zope.org/mailman/listinfo/zope )
>
More information about the Zope-Dev
mailing list