2009/1/25 Graham Dumpleton <[email protected]>:
>
> 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"))
Didn't test with modwsgi but with python built in wsgi server that is
not enough since it sets CONTENT_LENGTH to empty so this is necessary:
try:
length = int(environ['CONTENT_LENGTH'])
except (TypeError, ValueError):
length = 0
Regards, Clodoaldo
> 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
-~----------~----~----~----~------~----~------~--~---