Just make dataReceived
store display
in an instance variable, and append to it every time dataReceived
is called. Then, once connectionLost
is called, you know you have the complete response.
class BeginningPrinter(Protocol):
def __init__(self, finished):
self.finished = finished
self.remaining = 1024 * 10
self.total_response = "" # This will store the response.
def dataReceived(self, bytes):
if self.remaining:
display = bytes[:self.remaining]
self.total_response += display # Append to our response.
self.remaining -= len(display)
def connectionLost(self, reason):
print 'Finished receiving body:', reason.getErrorMessage()
print 'response is ',self.total_response
self.finished.callback(self.total_response)
In the context of the full example:
from pprint import pformat
from twisted.internet import reactor
from twisted.internet.defer import Deferred
from twisted.internet.protocol import Protocol
from twisted.web.client import Agent
from twisted.web.http_headers import Headers
class BeginningPrinter(Protocol):
def __init__(self, finished):
self.finished = finished
self.remaining = 1024 * 10
self.total_response = "" # This will store the response.
def dataReceived(self, bytes):
if self.remaining:
display = bytes[:self.remaining]
self.total_response += display # Append to our response.
self.remaining -= len(display)
def connectionLost(self, reason):
print 'Finished receiving body:', reason.getErrorMessage()
print 'response is ',self.total_response
self.finished.callback(self.total_response) # Executes all registered callbacks
def handle_result(response):
print("Got response {}".format(response)
agent = Agent(reactor)
d = agent.request(
'GET',
'http://example.com/',
Headers({'User-Agent': ['Twisted Web Client Example']}),
None)
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()
finished.addCallback(handle_result) # handle_result will be called when the response is ready
response.deliverBody(BeginningPrinter(finished))
return finished
d.addCallback(cbRequest)
def cbShutdown(ignored):
reactor.stop()
d.addBoth(cbShutdown)
reactor.run()