I’ve made a simple http server using Twisted, which sends the Content-Type: multipart/x-mixed-replace header. I’m using this to test an http client which I want to set up to accept a long-term stream.
The problem that has arisen is that my client request hangs until the http.Request calls self.finish(), then it receives all multipart documents at once.
Is there a way to manually flush the output buffers down to the client? I’m assuming this is why I’m not receiving the individual multipart documents.
#!/usr/bin/env python
import time
from twisted.web import http
from twisted.internet import protocol
class StreamHandler(http.Request):
BOUNDARY = 'BOUNDARY'
def writeBoundary(self):
self.write("--%s\n" % (self.BOUNDARY))
def writeStop(self):
self.write("--%s--\n" % (self.BOUNDARY))
def process(self):
self.setHeader('Connection', 'Keep-Alive')
self.setHeader('Content-Type', "multipart/x-mixed-replace;boundary=%s" % (self.BOUNDARY))
self.writeBoundary()
self.write("Content-Type: text/html\n")
s = "<html>foo</html>\n"
self.write("Content-Length: %s\n\n" % (len(s)))
self.write(s)
self.writeBoundary()
time.sleep(2)
self.write("Content-Type: text/html\n")
s = "<html>bar</html>\n"
self.write("Content-Length: %s\n\n" % (len(s)))
self.write(s)
self.writeBoundary()
time.sleep(2)
self.write("Content-Type: text/html\n")
s = "<html>baz</html>\n"
self.write("Content-Length: %s\n\n" % (len(s)))
self.write(s)
self.writeStop()
self.finish()
class StreamProtocol(http.HTTPChannel):
requestFactory = StreamHandler
class StreamFactory(http.HTTPFactory):
protocol = StreamProtocol
if __name__ == '__main__':
from twisted.internet import reactor
reactor.listenTCP(8800, StreamFactory())
reactor.run()
Using
time.sleep()prevents twisted from doing its job. To make it work you can’t usetime.sleep(), you must return control to twisted instead. The easiest way to modify your existing code to do that is by usingtwisted.internet.defer.inlineCallbacks, which is the next best thing since sliced bread:That works in firefox, I guess it answers your question correctly.