quetz-mod_python-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Graham Dumpleton (JIRA)" <j...@apache.org>
Subject [jira] Commented: (MODPYTHON-255) PythonInputFilter doesn't appear to work for chunked request content.
Date Mon, 08 Jun 2009 04:32:17 GMT

    [ https://issues.apache.org/jira/browse/MODPYTHON-255?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12717143#action_12717143
] 

Graham Dumpleton commented on MODPYTHON-255:
--------------------------------------------

Interestingly, if you change the input filter to be:

from mod_python import apache

def inputfilter(filter):

    filter.req.log_error("inputfilter")

    filter.req.log_error("inputfilter read()")
    s = filter.read(4)
    filter.req.log_error("inputfilter : %s" % repr(s))
    while s:
        filter.req.log_error("inputfilter write()")
        filter.write(s)
        filter.req.log_error("inputfilter read()")
        s = filter.read(4)
        filter.req.log_error("inputfilter : %s" % repr(s))

    if s is None:
        filter.req.log_error("inputfilter close()")
        filter.close()
        filter.req.log_error("inputfilter exit()")

That is, read in 4 byte chunks, it will fail on read subsequent to the first 4 bytes, again
with '\r\n' appearing from somewhere.

[Mon Jun 08 14:23:21 2009] [error] [client 192.168.1.5] inputfilter
[Mon Jun 08 14:23:21 2009] [error] [client 192.168.1.5] inputfilter read()
[Mon Jun 08 14:23:21 2009] [error] [client 192.168.1.5] inputfilter : 'abcd'
[Mon Jun 08 14:23:21 2009] [error] [client 192.168.1.5] inputfilter write()
[Mon Jun 08 14:23:21 2009] [error] [client 192.168.1.5] inputfilter read()
[Mon Jun 08 14:23:21 2009] [error] [client 192.168.1.5] inputfilter
[Mon Jun 08 14:23:21 2009] [error] [client 192.168.1.5] inputfilter read()
[Mon Jun 08 14:23:21 2009] [error] [client 192.168.1.5] inputfilter : '\\r\\n'
[Mon Jun 08 14:23:21 2009] [error] [client 192.168.1.5] inputfilter write()
[Mon Jun 08 14:23:21 2009] [error] [client 192.168.1.5] inputfilter read()

If you then interrupt the curl client, you get:

[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] inputfilter : ''
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] inputfilter : 'efgh'
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] inputfilter write()
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] inputfilter read()
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] inputfilter : 'ijkl'
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] inputfilter write()
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] inputfilter read()
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] inputfilter : 'mnop'
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] inputfilter write()
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] inputfilter read()
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] inputfilter : 'qrst'
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] inputfilter write()
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] inputfilter read()
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] inputfilter : 'uvwx'
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] inputfilter write()
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] inputfilter read()
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] inputfilter : 'yz'
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] inputfilter write()
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] inputfilter read()
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] inputfilter : None
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] inputfilter close()
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] inputfilter exit()
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] inputfilter
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] inputfilter read()
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] inputfilter : None
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] inputfilter close()
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] inputfilter exit()
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] inputfilter
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] inputfilter read()
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] mod_python (pid=49892, interpreter='home.dscpl.com.au',
phase='Filter: myfilter', handler='/Users/grahamd/Sites/inputfilter.mpy'): Application error
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] ServerName: 'home.dscpl.com.au'
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] DocumentRoot: '/Library/WebServer/Documents'
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] URI: '/~grahamd/echo.wsgi'
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] Location: None
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] Directory: None
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] Filename: '/Users/grahamd/Sites/echo.wsgi'
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] PathInfo: ''
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] Traceback (most recent call last):
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5]   File "/Library/Python/2.5/site-packages/mod_python/importer.py",
line 1386, in FilterDispatch\n    arg=filter, silent=0)
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5]   File "/Library/Python/2.5/site-packages/mod_python/importer.py",
line 1229, in _process_target\n    result = _execute_target(config, req, object, arg)
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5]   File "/Library/Python/2.5/site-packages/mod_python/importer.py",
line 1128, in _execute_target\n    result = object(arg)
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5]   File "/Users/grahamd/Sites/inputfilter.mpy",
line 8, in inputfilter\n    s = filter.read(4)
[Mon Jun 08 14:24:16 2009] [error] [client 192.168.1.5] IOError: Input filter read error
[Mon Jun 08 14:24:16 2009] [info] [client 192.168.1.5] (32)Broken pipe: core_output_filter:
writing data to the network

So, killing the client jolts it out of what ever state it was in causing empty string to be
read and drop out of input filter. The input filter is then called again and it keeps reading
data until it gets to the end and closes input filter.

After that, the input filter is called two more times, one causing another close and the second
causing an exception as client connection had then been detected as shutdown.

Something really weird happening here. But then Apache input filters always been a bit dodgy
given that Tramline didn't always work properly with them.

> PythonInputFilter doesn't appear to work for chunked request content.
> ---------------------------------------------------------------------
>
>                 Key: MODPYTHON-255
>                 URL: https://issues.apache.org/jira/browse/MODPYTHON-255
>             Project: mod_python
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 3.3.1
>            Reporter: Graham Dumpleton
>
> If PythonInputFilter is used to create an input filter, but content handler isn't actually
mod_python but another module which can handle chunked request content, and a request is sent
with chunked request content, then things just don't seem to work as one would expect.
> For example, if use:
> $ curl -d "abcdefghijklmnopqrstuvwxyz" http://home.dscpl.com.au/~grahamd/echo.wsgi --header
"Transfer-Encoding: chunked"
> Where the .wsgi script is for mod_wsgi and is:
> import StringIO
> def application(environ, start_response):
>     headers = []
>     headers.append(('Content-type', 'text/plain'))
>     start_response('200 OK', headers)
>     input = environ['wsgi.input']
>     output = StringIO.StringIO()
>     keys = environ.keys()
>     keys.sort()
>     for key in keys:
>         print >> output, '%s: %s' % (key, repr(environ[key]))
>     print >> output
>     length = int(environ.get('CONTENT_LENGTH', '0'))
>     #output.write(input.read(length))
>     output.write(input.read())
>     return [output.getvalue()]
> and the input filter itself is:
> from mod_python import apache
> def inputfilter(filter):
>     filter.req.log_error("inputfilter")
>     filter.req.log_error("inputfilter read()")
>     s = filter.read()
>     filter.req.log_error("inputfilter : %s" % repr(s))
>     while s:
>         filter.req.log_error("inputfilter write()")
>         filter.write(s)
>         filter.req.log_error("inputfilter read()")
>         s = filter.read()
>         filter.req.log_error("inputfilter : %s" % repr(s))
>     if s is None:
>         filter.req.log_error("inputfilter close()")
>         filter.close()
>         filter.req.log_error("inputfilter exit()")
> The curl just hangs and logged output is:
> [Mon Jun 08 14:10:37 2009] [error] [client 192.168.1.5] inputfilter
> [Mon Jun 08 14:10:37 2009] [error] [client 192.168.1.5] inputfilter read()
> [Mon Jun 08 14:10:37 2009] [error] [client 192.168.1.5] inputfilter : 'abcdefghijklmnopqrstuvwxyz'
> [Mon Jun 08 14:10:37 2009] [error] [client 192.168.1.5] inputfilter write()
> [Mon Jun 08 14:10:37 2009] [error] [client 192.168.1.5] inputfilter read()
> [Mon Jun 08 14:10:37 2009] [error] [client 192.168.1.5] inputfilter
> [Mon Jun 08 14:10:37 2009] [error] [client 192.168.1.5] inputfilter read()
> [Mon Jun 08 14:10:37 2009] [error] [client 192.168.1.5] inputfilter : '\\r\\n'
> [Mon Jun 08 14:10:37 2009] [error] [client 192.168.1.5] inputfilter write()
> [Mon Jun 08 14:10:37 2009] [error] [client 192.168.1.5] inputfilter read()
> First off, a '\r\n' is coming from somewhere when it should and then it just blocks on
read().
> Whatever sentinel is used in input stream to indicate end of chunked request content,
it isn't being recognised by mod_python. 

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message