title: twisted get body of POST request
body: <p>Ok,</p>
  
  <p>This should be simple, since people do it all the time. I want to get the body of a POST request sent a twisted <code>Agent</code>. This is created with a twisted <code>FileBodyProducer</code>. On the server side, I get a <code>request</code> object for my <code>render_POST</code> method. </p>
  
  <p>How do I retrieve the body? </p>
  
  <p>server:</p>
  
  <pre><code>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()
  </code></pre>
  
  <p>client:</p>
  
  <pre><code>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()
  </code></pre>
  
  <p>The only docs I can find for setting up the consumer side <a href="http://twistedmatrix.com/documents/current/core/howto/producers.html#auto7">leave something to be desired</a>. Primarily, how can a consumer use the <code>write(data)</code> method to <em>receive</em> results?</p>
  
  <p>Which bit am I missing to plug these two components together?</p>