2009/1/25 gert <[email protected]>:
>
>
>
> On Jan 25, 2:59 am, Graham Dumpleton <[email protected]>
> wrote:
>> 2009/1/25 gert <[email protected]>:
>>
>> > What does this mean ?
>>
>> > [Sun Jan 25 01:10:02 2009] [error] [client 217.136.57.14] Traceback
>> > (most recent call last):
>> > [Sun Jan 25 01:10:02 2009] [error] [client 217.136.57.14] File "/
>> > home/www/appwsgi/www/lib/upload.py", line 12, in application
>> > [Sun Jan 25 01:10:02 2009] [error] [client 217.136.57.14] s =
>> > environ['wsgi.input'].read().decode('latin1')
>> > [Sun Jan 25 01:10:02 2009] [error] [client 217.136.57.14] SystemError:
>> > Objects/bytesobject.c:3171: bad argument to internal function
>>
>> It means something bad happened. What is the exact line and
>> surrounding lines of Python code in WSGI application doing?
>>
>> Include the existing contents of the email in the reply so context not
>> lost. Do not reply with only the new stuff you want to add as it makes
>> it very hard to track the conversation.
>
> def application(environ, response):
> db = Db()
> cookie = "SID="+environ['QUERY_STRING']
> session = Session(db,cookie,'guest')
> response('200 OK', [('Content-type', 'text/xml'), ('Set-Cookie',
> session.COOKIE)])
> if not session.GID : return []
> s = environ['wsgi.input'].read().decode('latin1')
> p = search(r'Content-Type: application/octet-stream\r\n\r\n(.*?)\r
> \n--',s,DOTALL).group(1)
> db.execute('UPDATE users SET picture=? WHERE uid=?',(p.encode
> ('latin1'),session.UID))
> xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
> xml+= "<root>"+str(db.ERROR)+"</root>"
> response('200 OK', [('Content-type', 'text/xml')])
> return [xml]
>
> i get this error on files with a size of 182 KB
Does it only happen for this specific file upload and does it happen repeatably?
Regarding the line:
s = environ['wsgi.input'].read().decode('latin1')
First off, this is not WSGI compliant. To be compliant with WSGI
specification you must supply a length to read() when it is called on
wsgi.input.
I want you to first off replace that line with:
length = int(environ.get("CONTENT_LENGTH", "0"))
print("LENGTH=%d", length, file=environ["wsgi.errors"])
data = environ['wsgi.input'].read(length)
print("TYPE=%s", type(data), file=environ["wsgi.errors"])
print("DATA=%s", repr(data), file=environ["wsgi.errors"])
s = data.decode("latin1")
print("STRING=%s", repr(s), file=environ["wsgi.errors"])
Then instead of that replace it with:
data = environ['wsgi.input'].read()
print("TYPE=%s", type(data), file=environ["wsgi.errors"])
print("DATA=%s", repr(data), file=environ["wsgi.errors"])
s = data.decode("latin1")
print("STRING=%s", repr(s), file=environ["wsgi.errors"])
Post the output from Apache error logs for both.
This will help narrow down whether problem is in Python with decoding
bytes to latin1 string, or whether there is an issue in mod_wsgi with
calling read() with no argument, which as I said before is outside of
what WSGI specification allows anyway.
Graham
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"modwsgi" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/modwsgi?hl=en
-~----------~----~----~----~------~----~------~--~---