On Wed, 28 Mar 2007 07:24:00 -0500, Jarek Zgoda <[EMAIL PROTECTED]> wrote:

The code that produces failure:

path = '/indexer'
headers = {
    'Content-Type': 'application/x-www-form-urlencoded',
    'accept': 'text/plain',
}
docs = [{'field1': 'value1', 'field2': 'value2'}]
params = urllib.urlencode({'items': pickle.dumps(docs)})
http = httplib.HTTPConnection('localhost', 8080)
try:
    http.request('PUT', path, params, headers)
    response = http.getresponse()
    print response.reason
finally:
    http.close()

The dictionary I get as request.args is empty.


My apologies, I was thinking about POST, not PUT.  request.args
will always be empty in the case of a PUT.  This is because
twisted.web.http.Request does the following:

- parse the querystring (note that your PUT has no querystring)
- if the request method is POST
  - parse the request body

Long story short, a PUT gets ignored when it comes to parsing
and populating request.args.  I've never run into this problem
because I don't PUT 'application/x-www-urelencoded' data, only
JSON or text/xml, which don't get handled as request.args anyway.

The solution is, in your render_PUT method, to do something like
this:

from twisted.web import http, resource


class MyResource(resource.Resource):
    allowedMethods = ('PUT',)
    isLeaf = True

    def render_PUT(self, request):
        parameters = http.parse_qs(request.content.read(), 1)
        # proceed using parameters instead of request.args

Obviously, this is a fairly trivial piece of code, but if you
feel strongly about this issue, please consider filing a ticket
on twistedmatrix.com, requesting that a PUT, with a Content-Type
of 'application/x-www/urlencoded' or 'multipart/form-data' be
parsed into request.args just as a POST would be.

Hope this helps,

L. Daniel Burr

_______________________________________________
Twisted-web mailing list
[email protected]
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-web

Reply via email to