twisted get body of POST request
===

Ok,

This should be simple, since people do it all the time. I want to get the body of a POST request sent a twisted `Agent`. This is created with a twisted `FileBodyProducer`. On the server side, I get a `request` object for my `render_POST` method. 

How do I retrieve the body? 

server:

    from twisted.web import server, resource
    from twisted.internet import reactor
    
    
    class Simple(resource.Resource):
    	isLeaf = True
    	def render_GET(self, request):
    		return "{0}".format(request.args.keys())
    	def render_POST(self, request):
    		return "{0}".format(request.data)
    		with open(request.args['filename'][0], 'rb') as fd:
    			fd.write(request.write())
    
    site = server.Site(Simple())
    reactor.listenTCP(8080, site)
    reactor.run()

client:

    from StringIO import StringIO
    
    from twisted.internet import reactor
    from twisted.web.client import Agent
    from twisted.web.http_headers import Headers
    
    from twisted.web.client import FileBodyProducer
    from twisted.internet.defer import Deferred
    from twisted.internet.protocol import Protocol
    from pprint import pformat
    
    class BeginningPrinter(Protocol):
        def __init__(self, finished):
            self.finished = finished
            self.remaining = 1024 * 10
    
        def dataReceived(self, bytes):
            if self.remaining:
                display = bytes[:self.remaining]
                print 'Some data received:'
                print display
                self.remaining -= len(display)
    
        def connectionLost(self, reason):
            print 'Finished receiving body:', reason.getErrorMessage()
            self.finished.callback(None)
    
    agent = Agent(reactor)
    body = FileBodyProducer(StringIO("hello, world"))
    d = agent.request(
        'POST',
    	'http://127.0.0.1:8080/',
        Headers({'User-Agent': ['Twisted Web Client Example'],
                 'Content-Type': ['text/x-greeting']}),
        body)
    
    def cbRequest(response):
        print 'Response version:', response.version
        print 'Response code:', response.code
        print 'Response phrase:', response.phrase
        print 'Response headers:'
        print pformat(list(response.headers.getAllRawHeaders()))
        finished = Deferred()
        response.deliverBody(BeginningPrinter(finished))
        return finished
    d.addCallback(cbRequest)
    
    def cbShutdown(ignored):
        reactor.stop()
    d.addBoth(cbShutdown)
    
    reactor.run()

The only docs I can find for setting up the consumer side [leave something to be desired][1]. Primarily, how can a consumer use the `write(data)` method to *receive* results?

Which bit am I missing to plug these two components together?


  [1]: http://twistedmatrix.com/documents/current/core/howto/producers.html#auto7