Mercurial > code > home > repos > homeauto
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 |
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 | 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 | 42 raise ValueError('no response for url %r' % self.url) |
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) |