annotate lib/twisted_sse_demo/eventsource.py @ 452:a8073bcddd8b

rewrite sse_demo for py3, better connection close behavior Ignore-this: eda5b7fcd8914eb9a751ec8471626cea
author drewp@bigasterisk.com
date Fri, 19 Apr 2019 04:18:44 -0700
parents 975384ebd88e
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
294
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
1 from twisted.internet import reactor
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
2 from twisted.internet.defer import Deferred
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
3 from twisted.web.client import Agent
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
4 from twisted.web.http_headers import Headers
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
5
452
a8073bcddd8b rewrite sse_demo for py3, better connection close behavior
drewp@bigasterisk.com
parents: 445
diff changeset
6 from .sse_client import EventSourceProtocol
294
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
7
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
8
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
9 class EventSource(object):
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
10 """
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
11 The main EventSource class
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
12 """
452
a8073bcddd8b rewrite sse_demo for py3, better connection close behavior
drewp@bigasterisk.com
parents: 445
diff changeset
13 def __init__(self, url, userAgent):
a8073bcddd8b rewrite sse_demo for py3, better connection close behavior
drewp@bigasterisk.com
parents: 445
diff changeset
14 # type: (str, bytes)
294
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
15 self.url = url
452
a8073bcddd8b rewrite sse_demo for py3, better connection close behavior
drewp@bigasterisk.com
parents: 445
diff changeset
16 self.userAgent = userAgent
a8073bcddd8b rewrite sse_demo for py3, better connection close behavior
drewp@bigasterisk.com
parents: 445
diff changeset
17 self.protocol = EventSourceProtocol(self.onConnectionLost)
294
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
18 self.errorHandler = None
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
19 self.stashedError = None
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
20 self.connect()
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
21
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
22 def connect(self):
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
23 """
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
24 Connect to the event source URL
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
25 """
452
a8073bcddd8b rewrite sse_demo for py3, better connection close behavior
drewp@bigasterisk.com
parents: 445
diff changeset
26 agent = Agent(reactor, connectTimeout=5)
a8073bcddd8b rewrite sse_demo for py3, better connection close behavior
drewp@bigasterisk.com
parents: 445
diff changeset
27 self.agent = agent
294
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
28 d = agent.request(
452
a8073bcddd8b rewrite sse_demo for py3, better connection close behavior
drewp@bigasterisk.com
parents: 445
diff changeset
29 b'GET',
294
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
30 self.url,
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
31 Headers({
452
a8073bcddd8b rewrite sse_demo for py3, better connection close behavior
drewp@bigasterisk.com
parents: 445
diff changeset
32 b'User-Agent': [self.userAgent],
a8073bcddd8b rewrite sse_demo for py3, better connection close behavior
drewp@bigasterisk.com
parents: 445
diff changeset
33 b'Cache-Control': [b'no-cache'],
a8073bcddd8b rewrite sse_demo for py3, better connection close behavior
drewp@bigasterisk.com
parents: 445
diff changeset
34 b'Accept': [b'text/event-stream; charset=utf-8'],
294
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
35 }),
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
36 None)
452
a8073bcddd8b rewrite sse_demo for py3, better connection close behavior
drewp@bigasterisk.com
parents: 445
diff changeset
37 d.addCallbacks(self.cbRequest, self.connectError)
294
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
38
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
39 def cbRequest(self, response):
371
59067d81a296 better eventsource erroring
drewp@bigasterisk.com
parents: 351
diff changeset
40 if response is None:
452
a8073bcddd8b rewrite sse_demo for py3, better connection close behavior
drewp@bigasterisk.com
parents: 445
diff changeset
41 # seems out of spec, according to https://twistedmatrix.com/documents/current/api/twisted.web.iweb.IAgent.html
371
59067d81a296 better eventsource erroring
drewp@bigasterisk.com
parents: 351
diff changeset
42 raise ValueError('no response for url %r' % self.url)
59067d81a296 better eventsource erroring
drewp@bigasterisk.com
parents: 351
diff changeset
43 elif response.code != 200:
294
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
44 self.callErrorHandler("non 200 response received: %d" %
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
45 response.code)
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
46 else:
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
47 response.deliverBody(self.protocol)
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
48
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
49 def connectError(self, ignored):
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
50 self.callErrorHandler("error connecting to endpoint: %s" % self.url)
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
51
452
a8073bcddd8b rewrite sse_demo for py3, better connection close behavior
drewp@bigasterisk.com
parents: 445
diff changeset
52 def onConnectionLost(self, reason):
a8073bcddd8b rewrite sse_demo for py3, better connection close behavior
drewp@bigasterisk.com
parents: 445
diff changeset
53 # overridden
a8073bcddd8b rewrite sse_demo for py3, better connection close behavior
drewp@bigasterisk.com
parents: 445
diff changeset
54 reason.printDetailedTraceback()
a8073bcddd8b rewrite sse_demo for py3, better connection close behavior
drewp@bigasterisk.com
parents: 445
diff changeset
55
294
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
56 def callErrorHandler(self, msg):
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
57 if self.errorHandler:
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
58 func, callInThread = self.errorHandler
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
59 if callInThread:
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
60 reactor.callInThread(func, msg)
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
61 else:
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
62 func(msg)
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
63 else:
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
64 self.stashedError = msg
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
65
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
66 def onerror(self, func, callInThread=False):
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
67 self.errorHandler = func, callInThread
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
68 if self.stashedError:
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
69 self.callErrorHandler(self.stashedError)
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
70
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
71 def onmessage(self, func, callInThread=False):
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
72 self.addEventListener('message', func, callInThread)
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
73
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
74 def addEventListener(self, event, func, callInThread=False):
452
a8073bcddd8b rewrite sse_demo for py3, better connection close behavior
drewp@bigasterisk.com
parents: 445
diff changeset
75 assert isinstance(event, bytes), event
294
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
76 callback = func
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
77 if callInThread:
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
78 callback = lambda data: reactor.callInThread(func, data)
14ac4a210dbc Copy from from https://github.com/juggernaut/twisted-sse-demo
drewp@bigasterisk.com
parents:
diff changeset
79 self.protocol.addCallback(event, callback)