Using compression on request content and FieldStorage can cause problems.
-------------------------------------------------------------------------

                 Key: MODPYTHON-215
                 URL: https://issues.apache.org/jira/browse/MODPYTHON-215
             Project: mod_python
          Issue Type: Bug
          Components: core
    Affects Versions: 3.2.10, 3.3
            Reporter: Graham Dumpleton


The problems occur when a client uses 'Content-Encoding' of 'gzip', ie., it 
compresses the content of a POST request and Apache is configured to decompress 
it.

The first issue is that the original content length header will be the length 
of data in the body before it is decompressed. If the content type is 
"application/x-www-form-urlencoded" this will result in not all the 
decompressed data (which would normally be greater in size) being read in and 
used as it uses the original value of the content length header explicitly when 
doing the read.

        if ctype.startswith("application/x-www-form-urlencoded"):
            pairs = parse_qsl(req.read(clen), keep_blank_values)

Note that the change in content size is not a problem with "multipart/*" POST 
requests as it reads data in blocks until req.read() returns an empty string to 
indicate end of data and doesn't consult content length at all.

The second issue is if Apache 2.2 is being used and the mod_filter 
FilterProtocol directive is used to correctly indicate that input filters are 
being used which will change the size of the content, then it will actually zap 
the content length header, removing it from the set of input headers. If this 
is done it will cause FieldStorage to wrongly flag the request as not having a 
content length specified in the first place.

        try:
            clen = int(req.headers_in["content-length"])
        except (KeyError, ValueError):
            # absent content-length is not acceptable
            raise apache.SERVER_RETURN, apache.HTTP_LENGTH_REQUIRED

What should be done to fix this later issue is for FieldStorage to rely on the 
fact that req.read() internally performs a check on first read to ensure that 
the content length header was set. It would just need to be checked that this 
check is before mod_filter zaps the content length header on determining that a 
input filter which actually change the length.

As to the attempt to use the content length header when it is 
"application/x-www-form-urlencoded", it perhaps can do blocked reads as well 
until it accumulates all the content, join it back together and then use it. 
Note that it can't just use req.read() with no arguments because of 
MODPYTHON-212.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
https://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to