Mercurial > code > home > repos > homeauto
view service/reasoning/twisted_sse_demo/sse_client.py @ 1121:812c0ded674e
patchsource accept much longer lines from sse_collector
Ignore-this: 712d52cecf99c82afffc1ab6b58a5b4f
darcs-hash:f12ebc03f603e3fed7c5821e24813f7e70de46dd
author | drewp <drewp@bigasterisk.com> |
---|---|
date | Fri, 25 Nov 2016 17:56:26 -0800 |
parents | cb94ea3495b2 |
children | 1d562167868c |
line wrap: on
line source
from twisted.protocols.basic import LineReceiver class EventSourceProtocol(LineReceiver): def __init__(self): self.MAX_LENGTH = 16384 * 8 self.callbacks = {} self.finished = None # Initialize the event and data buffers self.event = 'message' self.data = '' def lineLengthExceeded(self, line): print "line too long" raise NotImplementedError def setFinishedDeferred(self, d): self.finished = d def addCallback(self, event, func): self.callbacks[event] = func def lineReceived(self, line): if line == '': # Dispatch event self.dispatchEvent() else: try: field, value = line.split(':', 1) # If value starts with a space, strip it. value = lstrip(value) except ValueError: # We got a line with no colon, treat it as a field(ignore) return if field == '': # This is a comment; ignore pass elif field == 'data': self.data += value + '\n' elif field == 'event': self.event = value elif field == 'id': # Not implemented pass elif field == 'retry': # Not implemented pass def connectionLost(self, reason): if self.finished: self.finished.callback(None) def dispatchEvent(self): """ Dispatch the event """ # If last character is LF, strip it. if self.data.endswith('\n'): self.data = self.data[:-1] if self.event in self.callbacks: self.callbacks[self.event](self.data) self.data = '' self.event = 'message' def lstrip(value): return value[1:] if value.startswith(' ') else value