Skip to content

Instantly share code, notes, and snippets.

@zed
Created January 19, 2012 12:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zed/cf1f475e0e65abfc5d58 to your computer and use it in GitHub Desktop.
Save zed/cf1f475e0e65abfc5d58 to your computer and use it in GitHub Desktop.
http server that write the response in portions with an encreasing delay
#!/usr/bin/env python
"""Write response with an increasing delay.
Install twisted:
$ pip install twisted
Run:
$ python chunked-server.py
Get:
$ curl http://localhost:8880/
Based on https://github.com/agiliq/so-starving/blob/master/twisted/app.py
"""
from twisted.internet import reactor, defer, task
from twisted.python import log
from twisted.web import resource, server
class ChunkedResource(resource.Resource): #NOTE: no relation to chunked-encoding
isLeaf = True
def render_GET(self, request):
d = defer.maybeDeferred(self._render_GET, request)
d.addCallbacks(request.write, request.processingFailed)
d.addBoth(self._finishRequest, request)
request.notifyFinish().addBoth(self._cancelRequest, request)
return server.NOT_DONE_YET
@defer.inlineCallbacks
def _render_GET(self, request):
request.write("""<!DOCTYPE html><html>
<title>Write response with an increasing delay.</title>""")
for i in range(1, 10): # delay each subsequent write by `i` seconds
yield task.deferLater(reactor, i, request.write, "<p>%s\n"%("."*i))
defer.returnValue("</html>")
def _cancelRequest(self, unused, request):
request.finish = lambda: None
def _finishRequest(self, unused, request):
request.finish()
if __name__=="__main__":
import sys
log.startLogging(sys.stderr)
resource = ChunkedResource()
reactor.listenTCP(8880, server.Site(resource))
reactor.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment