Skip to content

Instantly share code, notes, and snippets.

@EllieTheYeen
Created January 30, 2019 02:42
Show Gist options
  • Save EllieTheYeen/0929178484b0b11c50173c300f9f8097 to your computer and use it in GitHub Desktop.
Save EllieTheYeen/0929178484b0b11c50173c300f9f8097 to your computer and use it in GitHub Desktop.
from twisted.web.server import Site, NOT_DONE_YET
from twisted.web.resource import Resource
from twisted.internet import reactor, defer
from twisted.python import log
from PIL import Image
import random
import sys
import io
def sleep(seconds):
d = defer.Deferred()
reactor.callLater(seconds, d.callback, seconds)
return d
class Handler:
def __init__(self, request):
self.request = request
self.ok = True
@classmethod
def handle(cls, request):
return cls(request).run()
@defer.inlineCallbacks
def run(self):
self.request.connectionLost = self.aborted
self.request.setHeader('Content-Type', 'multipart/x-mixed-replace;boundary=thegayboundary')
print 'Connection from %s' % self.request.getClientIP()
while True:
i = Image.new('RGB', (800, 600), tuple(random.randint(0, 255) for a in xrange(3)))
o = io.BytesIO()
i.save(o, format='jpeg')
imgdata = o.getvalue()
del o
self.request.write('--thegayboundary\r\n'
'Content-Type: image/jpeg\r\n'
'Content-Length: %s\r\n\r\n' % (len(imgdata)))
self.request.write(imgdata)
self.request.write('\r\n')
del imgdata
yield sleep(1)
if not self.ok:
self.request.finish()
return
def aborted(self, reason):
self.ok = False
print 'Connection from %s aborted' % self.request.getClientIP()
class Stream(Resource):
isLeaf = True
def render_GET(self, request):
Handler.handle(request)
return NOT_DONE_YET
site = Site(Stream())
reactor.listenTCP(8080, site)
log.startLogging(sys.stdout)
reactor.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment