Changeset 73:f574beee3bca in ralphm-patches
- Timestamp:
- May 6, 2013, 10:01:18 PM (9 years ago)
- Branch:
- default
- Children:
- 74:355afce3af27, 75:9b7b8b99da61
- Files:
-
- 1 added
- 1 deleted
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
async-observer.patch
r72 r73 1 1 # HG changeset patch 2 # Parent 2076bac14221bf6aa7dc9337590b18604b100f322 # Parent ed052dd5cb7a57faf1693f78457401fd820fdd79 3 3 4 4 diff --git a/wokkel/subprotocols.py b/wokkel/subprotocols.py … … 26 26 + 27 27 + >>> class MyHandler(XMPPHandler): 28 + ... def connection Made(self):28 + ... def connectionInitialized(self): 29 29 + ... self.xmlstream.addObserver('/message', self.onMessage) 30 30 + ... @asyncObserver … … 104 104 """ 105 105 XMPP subprotocol mixin for handle incoming IQ stanzas. 106 @@ -401,15 +486,15 @@ 107 108 A typical way to use this mixin, is to set up L{xpath} observers on the 109 C{xmlstream} to call handleRequest, for example in an overridden 110 - L{XMPPHandler.connectionMade}. It is likely a good idea to only listen for 111 - incoming iq get and/org iq set requests, and not for any iq, to prevent 112 - hijacking incoming responses to outgoing iq requests. An example: 113 + L{XMPPHandler.connectionInitialized}. It is likely a good idea to only 114 + listen for incoming iq get and/org iq set requests, and not for any iq, to 115 + prevent hijacking incoming responses to outgoing iq requests. An example: 116 117 >>> QUERY_ROSTER = "/query[@xmlns='jabber:iq:roster']" 118 >>> class MyHandler(XMPPHandler, IQHandlerMixin): 119 ... iqHandlers = {"/iq[@type='get']" + QUERY_ROSTER: 'onRosterGet', 120 ... "/iq[@type='set']" + QUERY_ROSTER: 'onRosterSet'} 121 - ... def connectionMade(self): 122 + ... def connectionInitialized(self): 123 ... self.xmlstream.addObserver( 124 ... "/iq[@type='get' or @type='set']" + QUERY_ROSTER, 125 ... self.handleRequest) 106 126 @@ -425,6 +510,7 @@ 107 127 -
c2s_stanza_handlers.patch
r72 r73 1 1 # HG changeset patch 2 # Parent c104dd0a9d3fb840b53661822cf06728a5b23d8f2 # Parent 70ce9e97aa58780ac7f75a177fe8c0d2aaf1bfc6 3 3 Add c2s protocol handlers for iq, message and presence stanzas. 4 4 … … 48 48 from wokkel.subprotocols import IQHandlerMixin 49 49 50 @@ -20 04,3 +2004,419@@50 @@ -2031,3 +2031,418 @@ 51 51 d = self.sessionManager.probePresence(user) 52 52 d.addCallback(cb) … … 197 197 + stanza = received[-1] 198 198 + self.assertEqual(u'Hello', stanza.body) 199 +200 199 + 201 200 + … … 522 521 523 522 + observerPriority = 0 524 stanzaFactory = Message523 messageFactory = Message 525 524 526 525 def connectionInitialized(self): … … 531 530 532 531 @asyncObserver 533 @@ -16 73,3 +1681,246 @@532 @@ -1689,3 +1697,246 @@ 534 533 presence = ProbePresence(recipient=entity, 535 534 sender=user.entity) -
message-stanza.patch
r72 r73 1 1 # HG changeset patch 2 # Parent 4d9f583550dd048922d89ea09c60cd082b6c2c65 2 # Parent a94e14d79311f8efde3bd001ce4b5c8bafbb8094 3 Parse message stanzas into Message objects. 4 5 This replaces `MessageProtocol.onMessage` with `messageReceived` and 6 `errorReceived`. 7 8 Incoming messages stanzas are parsed by the `fromElement` class method 9 of the class set in `MessageProtocol.messageFactory`. This defaults to 10 the `Message` class. The resulting object is passed to 11 `messageReceived`. 12 13 If the message type was `error`, the message is parsed as a 14 `wokkel.generic.ErrorStanza` instead, and passed to `errorReceived`. 15 16 `Message` now normalizes the message type of empty or unknown values to 17 `normal` per RFC 6120. 3 18 4 19 diff --git a/wokkel/test/test_xmppim.py b/wokkel/test/test_xmppim.py 5 20 --- a/wokkel/test/test_xmppim.py 6 21 +++ b/wokkel/test/test_xmppim.py 7 @@ -1336,3 +1336, 186@@22 @@ -1336,3 +1336,213 @@ 8 23 d = self.handleRequest(xml) 9 24 d.addCallback(cb) … … 112 127 + stanza = received[-1] 113 128 + self.assertEqual(u'Hello', stanza.body) 129 + 130 + 131 + def test_errorReceived(self): 132 + """ 133 + Message stanzas of type error are received by errorReceived. 134 + """ 135 + messagesReceived = [] 136 + errorsReceived = [] 137 + self.patch(self.protocol, 'messageReceived', messagesReceived.append) 138 + self.patch(self.protocol, 'errorReceived', errorsReceived.append) 139 + 140 + xml = """ 141 + <message to='example.org' type='error'> 142 + <error type='cancel'> 143 + <service-unavailable 144 + xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> 145 + </error> 146 + </message> 147 + """ 148 + 149 + message = parseXml(xml) 150 + self.stub.send(message) 151 + 152 + self.assertEqual(0, len(messagesReceived)) 153 + self.assertEqual(1, len(errorsReceived)) 154 + stanza = errorsReceived[-1] 155 + self.assertEqual(u'service-unavailable', stanza.exception.condition) 114 156 + 115 157 + … … 220 262 221 263 def __init__(self, recipient=None, sender=None, body=None, subject=None): 222 @@ -1031,39 +1034, 68@@264 @@ -1031,39 +1034,84 @@ 223 265 element = Stanza.toElement(self) 224 266 … … 246 288 Generic XMPP subprotocol handler for incoming message stanzas. 247 289 + 248 + @cvar stanzaFactory: The class to parse messages into. Its C{fromElement}290 + @cvar messageFactory: The class to parse messages into. Its C{fromElement} 249 291 + will be called with the received L{domish.Element}. Defaults to 250 292 + L{Message}. … … 252 294 253 295 - messageTypes = None, 'normal', 'chat', 'headline', 'groupchat' 254 + stanzaFactory = Message296 + messageFactory = Message 255 297 256 298 def connectionInitialized(self): … … 264 306 + @asyncObserver 265 307 + def _onMessage(self, element): 266 + stanza = self.stanzaFactory.fromElement(element) 267 + return self.messageReceived(stanza) 308 + if element.getAttribute(u'type') == u'error': 309 + stanza = ErrorStanza.fromElement(element) 310 + return self.errorReceived(stanza) 311 + else: 312 + stanza = self.messageFactory.fromElement(element) 313 + return self.messageReceived(stanza) 268 314 269 315 - if messageType == 'error': … … 272 318 - if messageType not in self.messageTypes: 273 319 - message["type"] = 'normal' 274 - 320 + def errorReceived(self, stanza): 321 + """ 322 + Called when a message stanza of type error was received. 323 275 324 - self.onMessage(message) 276 - 325 + @type stanza: L{ErrorStanza} 326 + """ 327 + if hasattr(self, 'onMessage'): 328 + warnings.warn( 329 + "wokkel.xmppim.MessageProtocol.onMessage " 330 + "was deprecated in Wokkel 0.8.0; " 331 + "please use MessageProtocol.messageReceived instead.", 332 + DeprecationWarning) 333 + return False 334 277 335 - def onMessage(self, message): 336 + 278 337 + def messageReceived(self, message): 279 338 """ … … 295 354 + DeprecationWarning) 296 355 + 297 + if message.stanzaType == u'error':298 + return False299 +300 356 + if message.stanzaType == u'normal': 301 357 + # Override stanza type for backwards compatibility. -
roster_server.patch
r72 r73 26 26 + 27 27 + 28 + def test_ onRosterGet(self):28 + def test_getRosterReceived(self): 29 29 + """ 30 30 + A roster get request should trigger getRoster with the request. 31 31 + """ 32 32 + xml = """ 33 + <iq type='get' from='user@example.org ' to='user@example.org'>33 + <iq type='get' from='user@example.org/Home'> 34 34 + <query xmlns='jabber:iq:roster'/> 35 35 + </iq> 36 36 + """ 37 37 + 38 + def getRoster (request):39 + self.assertEqual(JID('user@example.org '), request.sender)38 + def getRosterReceived(request): 39 + self.assertEqual(JID('user@example.org/Home'), request.sender) 40 40 + item = xmppim.RosterItem(JID('other@example.org'), True, False, 41 41 + 'The User') … … 54 54 + self.assertEquals(u'The User', item.getAttribute('name')) 55 55 + 56 + self.service.getRoster = getRoster56 + self.service.getRosterReceived = getRosterReceived 57 57 + d = self.handleRequest(xml) 58 58 + d.addCallback(cb) … … 60 60 + 61 61 + 62 + def test_ onRosterGetNotOverridden(self):62 + def test_getRosterReceivedNotOverridden(self): 63 63 + """ 64 64 + If getRoster is not overridden, return feature-not-implemented. 65 65 + """ 66 66 + xml = """ 67 + <iq type='get' from='user@example.org ' to='user@example.org'>67 + <iq type='get' from='user@example.org/Home'> 68 68 + <query xmlns='jabber:iq:roster'/> 69 69 + </iq> … … 75 75 + 76 76 + 77 + def test_ onRosterSet(self):77 + def test_setRosterReceived(self): 78 78 + """ 79 79 + Roster set is not yet supported. 80 80 + """ 81 81 + xml = """ 82 + <iq type='set' from='user@example.org ' to='user@example.org'>82 + <iq type='set' from='user@example.org/Home'> 83 83 + <query xmlns='jabber:iq:roster'> 84 84 + <item jid='other@example.org' name='Other User'/> … … 231 231 + return roster.toElement() 232 232 + 233 + d = self.getRoster (request)233 + d = self.getRosterReceived(request) 234 234 + d.addCallback(toResponse) 235 235 + return d 236 236 + 237 237 + 238 + def getRoster (self, request):238 + def getRosterReceived(self, request): 239 239 + """ 240 240 + Called when the roster is requested. -
series
r72 r73 1 deprecate_prepareIDNName.patch2 1 async-observer.patch 3 2 message-stanza.patch … … 14 13 15 14 c2s_stanza_handlers.patch #+c2s 16 c2s_example.patch 15 c2s_example.patch #+c2s 16 17 pubsub_connectionInitialized.patch 17 18 18 19 version.patch -
session_manager.patch
r72 r73 1 1 # HG changeset patch 2 # Parent fdef0cff7a57368fa21984593ef05e616039e2e22 # Parent 60135baa4e422ab203c780c9093c374481b17a7a 3 3 4 4 diff --git a/wokkel/ewokkel.py b/wokkel/ewokkel.py … … 346 346 """ 347 347 Tests for L{xmppim.Message}. 348 @@ -1 598,3 +1710,297 @@348 @@ -1625,3 +1737,297 @@ 349 349 "was deprecated in Wokkel 0.8.0; " 350 350 "please use MessageProtocol.messageReceived instead.", … … 737 737 """ 738 738 A message stanza. 739 @@ -11 59,3 +1228,448 @@739 @@ -1175,3 +1244,448 @@ 740 740 741 741 self.onMessage(message.element)
Note: See TracChangeset
for help on using the changeset viewer.