Mercurial > libervia-pubsub
annotate sat_pubsub/gateway.py @ 291:61fb4817b77f
delegation: iq forwarded management:
in addition to the onForward observer, the xmlstream.send message is monkey patched, so we can inject the forwarded stanza as if it was received normally, and intercept the result to send it back to the server.
author | Goffi <goffi@goffi.org> |
---|---|
date | Mon, 04 May 2015 18:40:47 +0200 |
parents | 002c59dbc23f |
children | 4115999d85e9 |
rev | line source |
---|---|
233 | 1 #!/usr/bin/python |
2 #-*- coding: utf-8 -*- | |
3 | |
4 """ | |
235
64f780413b82
fixed Ralph Meijer copyright years (last commit was in 2011, not in 2009)
Goffi <goffi@goffi.org>
parents:
234
diff
changeset
|
5 Copyright (c) 2003-2011 Ralph Meijer |
283 | 6 Copyright (c) 2012, 2013, 2014, 2015 Jérôme Poisson |
233 | 7 |
8 | |
9 This program is free software: you can redistribute it and/or modify | |
10 it under the terms of the GNU Affero General Public License as published by | |
11 the Free Software Foundation, either version 3 of the License, or | |
12 (at your option) any later version. | |
13 | |
14 This program is distributed in the hope that it will be useful, | |
15 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 GNU Affero General Public License for more details. | |
18 | |
19 You should have received a copy of the GNU Affero General Public License | |
20 along with this program. If not, see <http://www.gnu.org/licenses/>. | |
21 -- | |
22 | |
23 This program is based on Idavoll (http://idavoll.ik.nu/), | |
24 originaly written by Ralph Meijer (http://ralphm.net/blog/) | |
25 It is sublicensed under AGPL v3 (or any later version) as allowed by the original | |
26 license. | |
27 | |
28 -- | |
29 | |
30 Here is a copy of the original license: | |
31 | |
235
64f780413b82
fixed Ralph Meijer copyright years (last commit was in 2011, not in 2009)
Goffi <goffi@goffi.org>
parents:
234
diff
changeset
|
32 Copyright (c) 2003-2011 Ralph Meijer |
233 | 33 |
34 Permission is hereby granted, free of charge, to any person obtaining | |
35 a copy of this software and associated documentation files (the | |
36 "Software"), to deal in the Software without restriction, including | |
37 without limitation the rights to use, copy, modify, merge, publish, | |
38 distribute, sublicense, and/or sell copies of the Software, and to | |
39 permit persons to whom the Software is furnished to do so, subject to | |
40 the following conditions: | |
41 | |
42 The above copyright notice and this permission notice shall be | |
43 included in all copies or substantial portions of the Software. | |
44 | |
45 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
46 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
47 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
48 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE | |
49 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | |
50 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | |
51 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
52 | |
53 """ | |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
54 |
183
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
55 """ |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
56 Web resources and client for interacting with pubsub services. |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
57 """ |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
58 |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
59 import mimetools |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
60 from time import gmtime, strftime |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
61 from StringIO import StringIO |
183
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
62 import urllib |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
63 import urlparse |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
64 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
65 import simplejson |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
66 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
67 from twisted.application import service |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
68 from twisted.internet import defer, reactor |
183
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
69 from twisted.python import log |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
70 from twisted.web import client, http, resource, server |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
71 from twisted.web.error import Error |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
72 from twisted.words.protocols.jabber.jid import JID |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
73 from twisted.words.protocols.jabber.error import StanzaError |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
74 from twisted.words.xish import domish |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
75 |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
76 from wokkel.generic import parseXml |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
77 from wokkel.pubsub import Item |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
78 from wokkel.pubsub import PubSubClient |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
79 |
234
51af2ed8bd50
replaced idavoll imports by sat_pubsub imports
Goffi <goffi@goffi.org>
parents:
233
diff
changeset
|
80 from sat_pubsub import error |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
81 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
82 NS_ATOM = 'http://www.w3.org/2005/Atom' |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
83 MIME_ATOM_ENTRY = b'application/atom+xml;type=entry' |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
84 MIME_ATOM_FEED = b'application/atom+xml;type=feed' |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
85 MIME_JSON = b'application/json' |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
86 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
87 class XMPPURIParseError(ValueError): |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
88 """ |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
89 Raised when a given XMPP URI couldn't be properly parsed. |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
90 """ |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
91 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
92 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
93 |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
94 def getServiceAndNode(uri): |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
95 """ |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
96 Given an XMPP URI, extract the publish subscribe service JID and node ID. |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
97 """ |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
98 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
99 try: |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
100 scheme, rest = uri.split(':', 1) |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
101 except ValueError: |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
102 raise XMPPURIParseError("No URI scheme component") |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
103 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
104 if scheme != 'xmpp': |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
105 raise XMPPURIParseError("Unknown URI scheme") |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
106 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
107 if rest.startswith("//"): |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
108 raise XMPPURIParseError("Unexpected URI authority component") |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
109 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
110 try: |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
111 entity, query = rest.split('?', 1) |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
112 except ValueError: |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
113 entity, query = rest, '' |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
114 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
115 if not entity: |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
116 raise XMPPURIParseError("Empty URI path component") |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
117 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
118 try: |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
119 service = JID(entity) |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
120 except Exception, e: |
210
2a0a6a671776
Fix error reporting for older Python versions.
Ralph Meijer <ralphm@ik.nu>
parents:
209
diff
changeset
|
121 raise XMPPURIParseError("Invalid JID: %s" % e) |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
122 |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
123 params = urlparse.parse_qs(query) |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
124 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
125 try: |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
126 nodeIdentifier = params['node'][0] |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
127 except (KeyError, ValueError): |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
128 nodeIdentifier = '' |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
129 |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
130 return service, nodeIdentifier |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
131 |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
132 |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
133 |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
134 def getXMPPURI(service, nodeIdentifier): |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
135 """ |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
136 Construct an XMPP URI from a service JID and node identifier. |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
137 """ |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
138 return "xmpp:%s?;node=%s" % (service.full(), nodeIdentifier or '') |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
139 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
140 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
141 |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
142 def _parseContentType(header): |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
143 """ |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
144 Parse a Content-Type header value to a L{mimetools.Message}. |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
145 |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
146 L{mimetools.Message} parses a Content-Type header and makes the |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
147 components available with its C{getmaintype}, C{getsubtype}, C{gettype}, |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
148 C{getplist} and C{getparam} methods. |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
149 """ |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
150 return mimetools.Message(StringIO(b'Content-Type: ' + header)) |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
151 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
152 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
153 |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
154 def _asyncResponse(render): |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
155 """ |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
156 """ |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
157 def wrapped(self, request): |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
158 def eb(failure): |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
159 if failure.check(Error): |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
160 err = failure.value |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
161 else: |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
162 log.err(failure) |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
163 err = Error(500) |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
164 request.setResponseCode(err.status, err.message) |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
165 return err.response |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
166 |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
167 def finish(result): |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
168 if result is server.NOT_DONE_YET: |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
169 return |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
170 |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
171 if result: |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
172 request.write(result) |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
173 request.finish() |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
174 |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
175 d = defer.maybeDeferred(render, self, request) |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
176 d.addErrback(eb) |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
177 d.addCallback(finish) |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
178 |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
179 return server.NOT_DONE_YET |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
180 |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
181 return wrapped |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
182 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
183 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
184 |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
185 class CreateResource(resource.Resource): |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
186 """ |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
187 A resource to create a publish-subscribe node. |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
188 """ |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
189 def __init__(self, backend, serviceJID, owner): |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
190 self.backend = backend |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
191 self.serviceJID = serviceJID |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
192 self.owner = owner |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
193 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
194 |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
195 http_GET = None |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
196 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
197 |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
198 @_asyncResponse |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
199 def render_POST(self, request): |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
200 """ |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
201 Respond to a POST request to create a new node. |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
202 """ |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
203 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
204 def toResponse(nodeIdentifier): |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
205 uri = getXMPPURI(self.serviceJID, nodeIdentifier) |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
206 body = simplejson.dumps({'uri': uri}) |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
207 request.setHeader(b'Content-Type', MIME_JSON) |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
208 return body |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
209 |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
191
diff
changeset
|
210 d = self.backend.createNode(None, self.owner) |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
211 d.addCallback(toResponse) |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
212 return d |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
213 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
214 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
215 |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
216 class DeleteResource(resource.Resource): |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
217 """ |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
218 A resource to create a publish-subscribe node. |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
219 """ |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
220 def __init__(self, backend, serviceJID, owner): |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
221 self.backend = backend |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
222 self.serviceJID = serviceJID |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
223 self.owner = owner |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
224 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
225 |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
226 render_GET = None |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
227 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
228 |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
229 @_asyncResponse |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
230 def render_POST(self, request): |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
231 """ |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
232 Respond to a POST request to create a new node. |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
233 """ |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
234 def toResponse(result): |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
235 request.setResponseCode(http.NO_CONTENT) |
209
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
236 |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
237 def trapNotFound(failure): |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
238 failure.trap(error.NodeNotFound) |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
239 raise Error(http.NOT_FOUND, "Node not found") |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
240 |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
241 if not request.args.get('uri'): |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
242 raise Error(http.BAD_REQUEST, "No URI given") |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
243 |
274
6641ea7990ee
Fix checking for malformed XMPP URI in DeleteResource.
Ralph Meijer <ralphm@ik.nu>
parents:
273
diff
changeset
|
244 try: |
6641ea7990ee
Fix checking for malformed XMPP URI in DeleteResource.
Ralph Meijer <ralphm@ik.nu>
parents:
273
diff
changeset
|
245 jid, nodeIdentifier = getServiceAndNode(request.args['uri'][0]) |
6641ea7990ee
Fix checking for malformed XMPP URI in DeleteResource.
Ralph Meijer <ralphm@ik.nu>
parents:
273
diff
changeset
|
246 except XMPPURIParseError, e: |
6641ea7990ee
Fix checking for malformed XMPP URI in DeleteResource.
Ralph Meijer <ralphm@ik.nu>
parents:
273
diff
changeset
|
247 raise Error(http.BAD_REQUEST, "Malformed XMPP URI: %s" % e) |
6641ea7990ee
Fix checking for malformed XMPP URI in DeleteResource.
Ralph Meijer <ralphm@ik.nu>
parents:
273
diff
changeset
|
248 |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
249 |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
250 data = request.content.read() |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
251 if data: |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
252 params = simplejson.loads(data) |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
253 redirectURI = params.get('redirect_uri', None) |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
254 else: |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
255 redirectURI = None |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
256 |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
257 d = self.backend.deleteNode(nodeIdentifier, self.owner, |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
258 redirectURI) |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
259 d.addCallback(toResponse) |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
260 d.addErrback(trapNotFound) |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
261 return d |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
262 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
263 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
264 |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
265 class PublishResource(resource.Resource): |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
266 """ |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
267 A resource to publish to a publish-subscribe node. |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
268 """ |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
269 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
270 def __init__(self, backend, serviceJID, owner): |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
271 self.backend = backend |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
272 self.serviceJID = serviceJID |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
273 self.owner = owner |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
274 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
275 |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
276 render_GET = None |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
277 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
278 |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
279 def checkMediaType(self, request): |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
280 ctype = request.getHeader(b'content-type') |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
281 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
282 if not ctype: |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
283 request.setResponseCode(http.BAD_REQUEST) |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
284 |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
285 raise Error(http.BAD_REQUEST, b"No specified Media Type") |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
286 |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
287 message = _parseContentType(ctype) |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
288 if (message.maintype != b'application' or |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
289 message.subtype != b'atom+xml' or |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
290 message.getparam(b'type') != b'entry' or |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
291 (message.getparam(b'charset') or b'utf-8') != b'utf-8'): |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
292 raise Error(http.UNSUPPORTED_MEDIA_TYPE, |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
293 b"Unsupported Media Type: %s" % ctype) |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
294 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
295 |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
296 @_asyncResponse |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
297 def render_POST(self, request): |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
298 """ |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
299 Respond to a POST request to create a new item. |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
300 """ |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
301 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
302 def toResponse(nodeIdentifier): |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
303 uri = getXMPPURI(self.serviceJID, nodeIdentifier) |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
304 body = simplejson.dumps({'uri': uri}) |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
305 request.setHeader(b'Content-Type', MIME_JSON) |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
306 return body |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
307 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
308 def gotNode(nodeIdentifier, payload): |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
309 item = Item(id='current', payload=payload) |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
310 d = self.backend.publish(nodeIdentifier, [item], self.owner) |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
311 d.addCallback(lambda _: nodeIdentifier) |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
312 return d |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
313 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
314 def getNode(): |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
315 if request.args.get('uri'): |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
316 jid, nodeIdentifier = getServiceAndNode(request.args['uri'][0]) |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
317 return defer.succeed(nodeIdentifier) |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
318 else: |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
191
diff
changeset
|
319 return self.backend.createNode(None, self.owner) |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
320 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
321 def trapNotFound(failure): |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
322 failure.trap(error.NodeNotFound) |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
323 raise Error(http.NOT_FOUND, "Node not found") |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
324 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
325 def trapXMPPURIParseError(failure): |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
326 failure.trap(XMPPURIParseError) |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
327 raise Error(http.BAD_REQUEST, |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
328 "Malformed XMPP URI: %s" % failure.value) |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
329 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
330 self.checkMediaType(request) |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
331 payload = parseXml(request.content.read()) |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
332 d = getNode() |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
333 d.addCallback(gotNode, payload) |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
334 d.addCallback(toResponse) |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
335 d.addErrback(trapNotFound) |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
336 d.addErrback(trapXMPPURIParseError) |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
337 return d |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
338 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
339 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
340 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
341 class ListResource(resource.Resource): |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
342 def __init__(self, service): |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
343 self.service = service |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
344 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
345 |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
346 @_asyncResponse |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
347 def render_GET(self, request): |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
348 def responseFromNodes(nodeIdentifiers): |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
349 body = simplejson.dumps(nodeIdentifiers) |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
350 request.setHeader(b'Content-Type', MIME_JSON) |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
351 return body |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
352 |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
191
diff
changeset
|
353 d = self.service.getNodes() |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
354 d.addCallback(responseFromNodes) |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
355 return d |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
356 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
357 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
358 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
359 # Service for subscribing to remote XMPP Pubsub nodes and web resources |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
360 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
361 def extractAtomEntries(items): |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
362 """ |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
363 Extract atom entries from a list of publish-subscribe items. |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
364 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
365 @param items: List of L{domish.Element}s that represent publish-subscribe |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
366 items. |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
367 @type items: C{list} |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
368 """ |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
369 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
370 atomEntries = [] |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
371 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
372 for item in items: |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
373 # ignore non-items (i.e. retractions) |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
374 if item.name != 'item': |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
375 continue |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
376 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
377 atomEntry = None |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
378 for element in item.elements(): |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
379 # extract the first element that is an atom entry |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
380 if element.uri == NS_ATOM and element.name == 'entry': |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
381 atomEntry = element |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
382 break |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
383 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
384 if atomEntry: |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
385 atomEntries.append(atomEntry) |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
386 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
387 return atomEntries |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
388 |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
191
diff
changeset
|
389 |
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
191
diff
changeset
|
390 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
391 def constructFeed(service, nodeIdentifier, entries, title): |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
392 nodeURI = getXMPPURI(service, nodeIdentifier) |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
393 now = strftime("%Y-%m-%dT%H:%M:%SZ", gmtime()) |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
394 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
395 # Collect the received entries in a feed |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
396 feed = domish.Element((NS_ATOM, 'feed')) |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
397 feed.addElement('title', content=title) |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
398 feed.addElement('id', content=nodeURI) |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
399 feed.addElement('updated', content=now) |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
400 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
401 for entry in entries: |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
402 feed.addChild(entry) |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
403 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
404 return feed |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
405 |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
191
diff
changeset
|
406 |
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
191
diff
changeset
|
407 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
408 class RemoteSubscriptionService(service.Service, PubSubClient): |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
409 """ |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
410 Service for subscribing to remote XMPP Publish-Subscribe nodes. |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
411 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
412 Subscriptions are created with a callback HTTP URI that is POSTed |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
413 to with the received items in notifications. |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
414 """ |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
415 |
204
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
416 def __init__(self, jid, storage): |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
417 self.jid = jid |
204
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
418 self.storage = storage |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
419 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
420 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
421 def trapNotFound(self, failure): |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
422 failure.trap(StanzaError) |
204
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
423 |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
424 if failure.value.condition == 'item-not-found': |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
425 raise error.NodeNotFound() |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
426 else: |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
427 return failure |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
428 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
429 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
430 def subscribeCallback(self, jid, nodeIdentifier, callback): |
204
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
431 """ |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
432 Subscribe a callback URI. |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
433 |
204
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
434 This registers a callback URI to be called when a notification is |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
435 received for the given node. |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
436 |
204
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
437 If this is the first callback registered for this node, the gateway |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
438 will subscribe to the node. Otherwise, the most recently published item |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
439 for this node is retrieved and, if present, the newly registered |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
440 callback will be called with that item. |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
441 """ |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
442 |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
443 def callbackForLastItem(items): |
187
69cdd8c6a431
Make sure second subscribers through HTTP also get a notification of the
Ralph Meijer <ralphm@ik.nu>
parents:
186
diff
changeset
|
444 atomEntries = extractAtomEntries(items) |
69cdd8c6a431
Make sure second subscribers through HTTP also get a notification of the
Ralph Meijer <ralphm@ik.nu>
parents:
186
diff
changeset
|
445 |
69cdd8c6a431
Make sure second subscribers through HTTP also get a notification of the
Ralph Meijer <ralphm@ik.nu>
parents:
186
diff
changeset
|
446 if not atomEntries: |
69cdd8c6a431
Make sure second subscribers through HTTP also get a notification of the
Ralph Meijer <ralphm@ik.nu>
parents:
186
diff
changeset
|
447 return |
69cdd8c6a431
Make sure second subscribers through HTTP also get a notification of the
Ralph Meijer <ralphm@ik.nu>
parents:
186
diff
changeset
|
448 |
69cdd8c6a431
Make sure second subscribers through HTTP also get a notification of the
Ralph Meijer <ralphm@ik.nu>
parents:
186
diff
changeset
|
449 self._postTo([callback], jid, nodeIdentifier, atomEntries[0], |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
450 MIME_ATOM_ENTRY) |
187
69cdd8c6a431
Make sure second subscribers through HTTP also get a notification of the
Ralph Meijer <ralphm@ik.nu>
parents:
186
diff
changeset
|
451 |
204
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
452 def subscribeOrItems(hasCallbacks): |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
453 if hasCallbacks: |
224
55b45c7dccb4
Upon gateway subscription to the root node, don't retrieve items.
Ralph Meijer <ralphm@ik.nu>
parents:
214
diff
changeset
|
454 if not nodeIdentifier: |
55b45c7dccb4
Upon gateway subscription to the root node, don't retrieve items.
Ralph Meijer <ralphm@ik.nu>
parents:
214
diff
changeset
|
455 return None |
204
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
456 d = self.items(jid, nodeIdentifier, 1) |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
457 d.addCallback(callbackForLastItem) |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
458 else: |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
459 d = self.subscribe(jid, nodeIdentifier, self.jid) |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
460 |
204
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
461 d.addErrback(self.trapNotFound) |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
462 return d |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
463 |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
464 d = self.storage.hasCallbacks(jid, nodeIdentifier) |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
465 d.addCallback(subscribeOrItems) |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
466 d.addCallback(lambda _: self.storage.addCallback(jid, nodeIdentifier, |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
467 callback)) |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
468 return d |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
469 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
470 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
471 def unsubscribeCallback(self, jid, nodeIdentifier, callback): |
204
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
472 """ |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
473 Unsubscribe a callback. |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
474 |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
475 If this was the last registered callback for this node, the |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
476 gateway will unsubscribe from node. |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
477 """ |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
478 |
204
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
479 def cb(last): |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
480 if last: |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
481 return self.unsubscribe(jid, nodeIdentifier, self.jid) |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
482 |
204
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
483 d = self.storage.removeCallback(jid, nodeIdentifier, callback) |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
484 d.addCallback(cb) |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
485 return d |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
486 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
487 |
203
2c46e6664680
Match wokkel API change for PubSubClient.
Ralph Meijer <ralphm@ik.nu>
parents:
198
diff
changeset
|
488 def itemsReceived(self, event): |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
489 """ |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
490 Fire up HTTP client to do callback |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
491 """ |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
492 |
203
2c46e6664680
Match wokkel API change for PubSubClient.
Ralph Meijer <ralphm@ik.nu>
parents:
198
diff
changeset
|
493 atomEntries = extractAtomEntries(event.items) |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
494 service = event.sender |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
495 nodeIdentifier = event.nodeIdentifier |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
496 headers = event.headers |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
497 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
498 # Don't notify if there are no atom entries |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
499 if not atomEntries: |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
500 return |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
501 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
502 if len(atomEntries) == 1: |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
503 contentType = MIME_ATOM_ENTRY |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
504 payload = atomEntries[0] |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
505 else: |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
506 contentType = MIME_ATOM_FEED |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
507 payload = constructFeed(service, nodeIdentifier, atomEntries, |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
508 title='Received item collection') |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
509 |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
510 self.callCallbacks(service, nodeIdentifier, payload, contentType) |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
511 |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
512 if 'Collection' in headers: |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
513 for collection in headers['Collection']: |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
514 nodeIdentifier = collection or '' |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
515 self.callCallbacks(service, nodeIdentifier, payload, |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
516 contentType) |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
517 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
518 |
203
2c46e6664680
Match wokkel API change for PubSubClient.
Ralph Meijer <ralphm@ik.nu>
parents:
198
diff
changeset
|
519 def deleteReceived(self, event): |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
520 """ |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
521 Fire up HTTP client to do callback |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
522 """ |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
523 |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
524 service = event.sender |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
525 nodeIdentifier = event.nodeIdentifier |
209
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
526 redirectURI = event.redirectURI |
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
527 self.callCallbacks(service, nodeIdentifier, eventType='DELETED', |
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
528 redirectURI=redirectURI) |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
529 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
530 |
187
69cdd8c6a431
Make sure second subscribers through HTTP also get a notification of the
Ralph Meijer <ralphm@ik.nu>
parents:
186
diff
changeset
|
531 def _postTo(self, callbacks, service, nodeIdentifier, |
209
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
532 payload=None, contentType=None, eventType=None, |
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
533 redirectURI=None): |
204
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
534 |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
535 if not callbacks: |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
536 return |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
537 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
538 postdata = None |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
539 nodeURI = getXMPPURI(service, nodeIdentifier) |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
540 headers = {'Referer': nodeURI.encode('utf-8'), |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
541 'PubSub-Service': service.full().encode('utf-8')} |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
542 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
543 if payload: |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
544 postdata = payload.toXml().encode('utf-8') |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
545 if contentType: |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
546 headers['Content-Type'] = "%s;charset=utf-8" % contentType |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
547 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
548 if eventType: |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
549 headers['Event'] = eventType |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
550 |
209
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
551 if redirectURI: |
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
552 headers['Link'] = '<%s>; rel=alternate' % ( |
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
553 redirectURI.encode('utf-8'), |
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
554 ) |
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
555 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
556 def postNotification(callbackURI): |
214
3c45208678fa
Make 204 responses not result in failure.
Ralph Meijer <ralphm@ik.nu>
parents:
211
diff
changeset
|
557 f = getPageWithFactory(str(callbackURI), |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
558 method='POST', |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
559 postdata=postdata, |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
560 headers=headers) |
214
3c45208678fa
Make 204 responses not result in failure.
Ralph Meijer <ralphm@ik.nu>
parents:
211
diff
changeset
|
561 d = f.deferred |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
562 d.addErrback(log.err) |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
563 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
564 for callbackURI in callbacks: |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
565 reactor.callLater(0, postNotification, callbackURI) |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
566 |
204
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
567 |
187
69cdd8c6a431
Make sure second subscribers through HTTP also get a notification of the
Ralph Meijer <ralphm@ik.nu>
parents:
186
diff
changeset
|
568 def callCallbacks(self, service, nodeIdentifier, |
209
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
569 payload=None, contentType=None, eventType=None, |
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
570 redirectURI=None): |
204
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
571 |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
572 def eb(failure): |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
573 failure.trap(error.NoCallbacks) |
187
69cdd8c6a431
Make sure second subscribers through HTTP also get a notification of the
Ralph Meijer <ralphm@ik.nu>
parents:
186
diff
changeset
|
574 |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
575 # No callbacks were registered for this node. Unsubscribe? |
187
69cdd8c6a431
Make sure second subscribers through HTTP also get a notification of the
Ralph Meijer <ralphm@ik.nu>
parents:
186
diff
changeset
|
576 |
204
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
577 d = self.storage.getCallbacks(service, nodeIdentifier) |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
578 d.addCallback(self._postTo, service, nodeIdentifier, payload, |
209
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
579 contentType, eventType, redirectURI) |
204
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
580 d.addErrback(eb) |
b4bf0a5ce50d
Implement storage facilities for the HTTP gateway.
Ralph Meijer <ralphm@ik.nu>
parents:
203
diff
changeset
|
581 d.addErrback(log.err) |
187
69cdd8c6a431
Make sure second subscribers through HTTP also get a notification of the
Ralph Meijer <ralphm@ik.nu>
parents:
186
diff
changeset
|
582 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
583 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
584 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
585 class RemoteSubscribeBaseResource(resource.Resource): |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
586 """ |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
587 Base resource for remote pubsub node subscription and unsubscription. |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
588 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
589 This resource accepts POST request with a JSON document that holds |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
590 a dictionary with the keys C{uri} and C{callback} that respectively map |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
591 to the XMPP URI of the publish-subscribe node and the callback URI. |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
592 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
593 This class should be inherited with L{serviceMethod} overridden. |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
594 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
595 @cvar serviceMethod: The name of the method to be called with |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
596 the JID of the pubsub service, the node identifier |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
597 and the callback URI as received in the HTTP POST |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
598 request to this resource. |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
599 """ |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
600 serviceMethod = None |
191
48245777acea
Return proper HTTP status codes on failed un-/subscription.
Ralph Meijer <ralphm@ik.nu>
parents:
187
diff
changeset
|
601 errorMap = { |
48245777acea
Return proper HTTP status codes on failed un-/subscription.
Ralph Meijer <ralphm@ik.nu>
parents:
187
diff
changeset
|
602 error.NodeNotFound: |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
603 (http.FORBIDDEN, "Node not found"), |
191
48245777acea
Return proper HTTP status codes on failed un-/subscription.
Ralph Meijer <ralphm@ik.nu>
parents:
187
diff
changeset
|
604 error.NotSubscribed: |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
605 (http.FORBIDDEN, "No such subscription found"), |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
606 error.SubscriptionExists: |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
607 (http.FORBIDDEN, "Subscription already exists"), |
191
48245777acea
Return proper HTTP status codes on failed un-/subscription.
Ralph Meijer <ralphm@ik.nu>
parents:
187
diff
changeset
|
608 } |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
609 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
610 def __init__(self, service): |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
611 self.service = service |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
612 self.params = None |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
613 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
614 |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
615 render_GET = None |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
616 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
617 |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
618 @_asyncResponse |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
619 def render_POST(self, request): |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
620 def trapNotFound(failure): |
191
48245777acea
Return proper HTTP status codes on failed un-/subscription.
Ralph Meijer <ralphm@ik.nu>
parents:
187
diff
changeset
|
621 err = failure.trap(*self.errorMap.keys()) |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
622 status, message = self.errorMap[err] |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
623 raise Error(status, message) |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
624 |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
625 def toResponse(result): |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
626 request.setResponseCode(http.NO_CONTENT) |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
627 return b'' |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
628 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
629 def trapXMPPURIParseError(failure): |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
630 failure.trap(XMPPURIParseError) |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
631 raise Error(http.BAD_REQUEST, |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
632 "Malformed XMPP URI: %s" % failure.value) |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
633 |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
634 data = request.content.read() |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
635 self.params = simplejson.loads(data) |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
636 |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
637 uri = self.params['uri'] |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
638 callback = self.params['callback'] |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
639 |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
640 jid, nodeIdentifier = getServiceAndNode(uri) |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
641 method = getattr(self.service, self.serviceMethod) |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
642 d = method(jid, nodeIdentifier, callback) |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
643 d.addCallback(toResponse) |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
644 d.addErrback(trapNotFound) |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
645 d.addErrback(trapXMPPURIParseError) |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
646 return d |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
647 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
648 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
649 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
650 class RemoteSubscribeResource(RemoteSubscribeBaseResource): |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
651 """ |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
652 Resource to subscribe to a remote publish-subscribe node. |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
653 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
654 The passed C{uri} is the XMPP URI of the node to subscribe to and the |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
655 C{callback} is the callback URI. Upon receiving notifications from the |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
656 node, a POST request will be perfomed on the callback URI. |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
657 """ |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
658 serviceMethod = 'subscribeCallback' |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
659 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
660 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
661 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
662 class RemoteUnsubscribeResource(RemoteSubscribeBaseResource): |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
663 """ |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
664 Resource to unsubscribe from a remote publish-subscribe node. |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
665 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
666 The passed C{uri} is the XMPP URI of the node to unsubscribe from and the |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
667 C{callback} is the callback URI that was registered for it. |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
668 """ |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
669 serviceMethod = 'unsubscribeCallback' |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
670 |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
671 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
672 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
673 class RemoteItemsResource(resource.Resource): |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
674 """ |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
675 Resource for retrieving items from a remote pubsub node. |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
676 """ |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
677 |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
678 def __init__(self, service): |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
679 self.service = service |
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
680 |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
191
diff
changeset
|
681 |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
682 @_asyncResponse |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
683 def render_GET(self, request): |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
684 try: |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
685 maxItems = int(request.args.get('max_items', [0])[0]) or None |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
686 except ValueError: |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
687 raise Error(http.BAD_REQUEST, |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
688 "The argument max_items has an invalid value.") |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
689 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
690 try: |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
191
diff
changeset
|
691 uri = request.args['uri'][0] |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
692 except KeyError: |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
693 raise Error(http.BAD_REQUEST, |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
694 "No URI for the remote node provided.") |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
191
diff
changeset
|
695 |
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
191
diff
changeset
|
696 try: |
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
191
diff
changeset
|
697 jid, nodeIdentifier = getServiceAndNode(uri) |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
698 except XMPPURIParseError: |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
699 raise Error(http.BAD_REQUEST, |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
700 "Malformed XMPP URI: %s" % uri) |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
701 |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
702 def toResponse(items): |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
703 """ |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
704 Create a feed out the retrieved items. |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
705 """ |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
706 atomEntries = extractAtomEntries(items) |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
707 feed = constructFeed(jid, nodeIdentifier, atomEntries, |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
708 "Retrieved item collection") |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
709 body = feed.toXml().encode('utf-8') |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
710 request.setHeader(b'Content-Type', MIME_ATOM_FEED) |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
711 return body |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
712 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
713 def trapNotFound(failure): |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
714 failure.trap(StanzaError) |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
715 if not failure.value.condition == 'item-not-found': |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
716 raise failure |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
717 raise Error(http.NOT_FOUND, "Node not found") |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
718 |
186 | 719 d = self.service.items(jid, nodeIdentifier, maxItems) |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
720 d.addCallback(toResponse) |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
721 d.addErrback(trapNotFound) |
177
faf1c9bc2612
Add HTTP gateway in a separate plugin.
Ralph Meijer <ralphm@ik.nu>
parents:
diff
changeset
|
722 return d |
183
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
723 |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
724 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
725 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
726 # Client side code to interact with a service as provided above |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
727 |
183
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
728 def getPageWithFactory(url, contextFactory=None, *args, **kwargs): |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
729 """Download a web page. |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
730 |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
731 Download a page. Return the factory that holds a deferred, which will |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
732 callback with a page (as a string) or errback with a description of the |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
733 error. |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
734 |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
735 See HTTPClientFactory to see what extra args can be passed. |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
736 """ |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
737 |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
738 factory = client.HTTPClientFactory(url, *args, **kwargs) |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
739 factory.protocol.handleStatus_204 = lambda self: self.handleStatus_200() |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
740 |
275 | 741 if factory.scheme == 'https': |
183
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
742 from twisted.internet import ssl |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
743 if contextFactory is None: |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
744 contextFactory = ssl.ClientContextFactory() |
275 | 745 reactor.connectSSL(factory.host, factory.port, factory, contextFactory) |
183
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
746 else: |
275 | 747 reactor.connectTCP(factory.host, factory.port, factory) |
183
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
748 return factory |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
749 |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
750 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
751 |
183
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
752 class CallbackResource(resource.Resource): |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
753 """ |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
754 Web resource for retrieving gateway notifications. |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
755 """ |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
756 |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
757 def __init__(self, callback): |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
758 self.callback = callback |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
759 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
760 |
183
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
761 http_GET = None |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
762 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
763 |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
764 def render_POST(self, request): |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
765 if request.requestHeaders.hasHeader(b'Event'): |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
766 payload = None |
209
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
767 else: |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
768 payload = parseXml(request.content.read()) |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
769 |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
770 self.callback(payload, request.requestHeaders) |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
771 |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
772 request.setResponseCode(http.NO_CONTENT) |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
773 return b'' |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
774 |
183
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
775 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
776 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
777 |
183
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
778 class GatewayClient(service.Service): |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
779 """ |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
780 Service that provides client access to the HTTP Gateway into Idavoll. |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
781 """ |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
782 |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
783 agent = "Idavoll HTTP Gateway Client" |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
784 |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
785 def __init__(self, baseURI, callbackHost=None, callbackPort=None): |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
786 self.baseURI = baseURI |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
787 self.callbackHost = callbackHost or 'localhost' |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
788 self.callbackPort = callbackPort or 8087 |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
789 root = resource.Resource() |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
790 root.putChild('callback', CallbackResource( |
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
791 lambda *args, **kwargs: self.callback(*args, **kwargs))) |
183
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
792 self.site = server.Site(root) |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
793 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
794 |
183
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
795 def startService(self): |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
796 self.port = reactor.listenTCP(self.callbackPort, |
273
6ba0d6def7f5
Use twisted.web instead of web2, initial tests.
Ralph Meijer <ralphm@ik.nu>
parents:
255
diff
changeset
|
797 self.site) |
183
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
798 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
799 |
183
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
800 def stopService(self): |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
801 return self.port.stopListening() |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
802 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
803 |
183
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
804 def _makeURI(self, verb, query=None): |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
805 uriComponents = urlparse.urlparse(self.baseURI) |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
806 uri = urlparse.urlunparse((uriComponents[0], |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
807 uriComponents[1], |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
808 uriComponents[2] + verb, |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
809 '', |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
810 query and urllib.urlencode(query) or '', |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
811 '')) |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
812 return uri |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
813 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
814 |
183
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
815 def callback(self, data, headers): |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
816 pass |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
817 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
818 |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
819 def ping(self): |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
820 f = getPageWithFactory(self._makeURI(''), |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
821 method='HEAD', |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
822 agent=self.agent) |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
823 return f.deferred |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
824 |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
204
diff
changeset
|
825 |
183
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
826 def create(self): |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
827 f = getPageWithFactory(self._makeURI('create'), |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
828 method='POST', |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
829 agent=self.agent) |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
830 return f.deferred.addCallback(simplejson.loads) |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
831 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
832 |
209
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
833 def delete(self, xmppURI, redirectURI=None): |
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
834 query = {'uri': xmppURI} |
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
835 |
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
836 if redirectURI: |
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
837 params = {'redirect_uri': redirectURI} |
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
838 postdata = simplejson.dumps(params) |
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
839 headers = {'Content-Type': MIME_JSON} |
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
840 else: |
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
841 postdata = None |
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
842 headers = None |
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
843 |
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
844 f = getPageWithFactory(self._makeURI('delete', query), |
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
845 method='POST', |
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
846 postdata=postdata, |
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
847 headers=headers, |
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
848 agent=self.agent) |
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
849 return f.deferred |
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
850 |
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
851 |
183
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
852 def publish(self, entry, xmppURI=None): |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
853 query = xmppURI and {'uri': xmppURI} |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
854 |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
855 f = getPageWithFactory(self._makeURI('publish', query), |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
856 method='POST', |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
857 postdata=entry.toXml().encode('utf-8'), |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
858 headers={'Content-Type': MIME_ATOM_ENTRY}, |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
859 agent=self.agent) |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
860 return f.deferred.addCallback(simplejson.loads) |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
861 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
862 |
183
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
863 def listNodes(self): |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
864 f = getPageWithFactory(self._makeURI('list'), |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
865 method='GET', |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
866 agent=self.agent) |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
867 return f.deferred.addCallback(simplejson.loads) |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
868 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
869 |
183
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
870 def subscribe(self, xmppURI): |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
871 params = {'uri': xmppURI, |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
872 'callback': 'http://%s:%s/callback' % (self.callbackHost, |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
873 self.callbackPort)} |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
874 f = getPageWithFactory(self._makeURI('subscribe'), |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
875 method='POST', |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
876 postdata=simplejson.dumps(params), |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
877 headers={'Content-Type': MIME_JSON}, |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
878 agent=self.agent) |
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
177
diff
changeset
|
879 return f.deferred |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
880 |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
881 |
191
48245777acea
Return proper HTTP status codes on failed un-/subscription.
Ralph Meijer <ralphm@ik.nu>
parents:
187
diff
changeset
|
882 def unsubscribe(self, xmppURI): |
48245777acea
Return proper HTTP status codes on failed un-/subscription.
Ralph Meijer <ralphm@ik.nu>
parents:
187
diff
changeset
|
883 params = {'uri': xmppURI, |
48245777acea
Return proper HTTP status codes on failed un-/subscription.
Ralph Meijer <ralphm@ik.nu>
parents:
187
diff
changeset
|
884 'callback': 'http://%s:%s/callback' % (self.callbackHost, |
48245777acea
Return proper HTTP status codes on failed un-/subscription.
Ralph Meijer <ralphm@ik.nu>
parents:
187
diff
changeset
|
885 self.callbackPort)} |
48245777acea
Return proper HTTP status codes on failed un-/subscription.
Ralph Meijer <ralphm@ik.nu>
parents:
187
diff
changeset
|
886 f = getPageWithFactory(self._makeURI('unsubscribe'), |
48245777acea
Return proper HTTP status codes on failed un-/subscription.
Ralph Meijer <ralphm@ik.nu>
parents:
187
diff
changeset
|
887 method='POST', |
48245777acea
Return proper HTTP status codes on failed un-/subscription.
Ralph Meijer <ralphm@ik.nu>
parents:
187
diff
changeset
|
888 postdata=simplejson.dumps(params), |
48245777acea
Return proper HTTP status codes on failed un-/subscription.
Ralph Meijer <ralphm@ik.nu>
parents:
187
diff
changeset
|
889 headers={'Content-Type': MIME_JSON}, |
48245777acea
Return proper HTTP status codes on failed un-/subscription.
Ralph Meijer <ralphm@ik.nu>
parents:
187
diff
changeset
|
890 agent=self.agent) |
48245777acea
Return proper HTTP status codes on failed un-/subscription.
Ralph Meijer <ralphm@ik.nu>
parents:
187
diff
changeset
|
891 return f.deferred |
48245777acea
Return proper HTTP status codes on failed un-/subscription.
Ralph Meijer <ralphm@ik.nu>
parents:
187
diff
changeset
|
892 |
48245777acea
Return proper HTTP status codes on failed un-/subscription.
Ralph Meijer <ralphm@ik.nu>
parents:
187
diff
changeset
|
893 |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
894 def items(self, xmppURI, maxItems=None): |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
895 query = {'uri': xmppURI} |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
896 if maxItems: |
186 | 897 query['max_items'] = int(maxItems) |
185
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
898 f = getPageWithFactory(self._makeURI('items', query), |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
899 method='GET', |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
900 agent=self.agent) |
9038908dc2f5
Add gateway support for retrieving items from a node. Reorder gateway module.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
901 return f.deferred |