例子 130. 实体请求一个即时节点
<iq type='set' from='hamlet@denmark.lit/elsinore' to='pubsub.shakespeare.lit' id='create2'> <pubsub xmlns='http://jabber.org/protocol/pubsub'> <create/> </pubsub> </iq>
如果没有发生错误, pubsub服务应该创建该节点, 生成一个那个服务上下文中唯一的NodeID, 并通知该用户成功了(应答中包含该NodeID).
例子 131. 服务应答成功和生成的NodeID
<iq type='result' from='pubsub.shakespeare.lit' to='hamlet@denmark.lit/elsinore' id='create2'> <pubsub xmlns='http://jabber.org/protocol/pubsub'> <create node='25e3d37dabbab9541f7523321421edc5bfeb2dae'/> </pubsub> </iq>
注意: 当一个服务代表请求实体成功创建一个节点, 它必须返回一个 IQ result (根据 XMPP Core). 如果该节点创建请求未指定一个NodeID且服务支持创建即时节点, 该服务必须在该 IQ result 中指定已创建的NodeID. 类似的, 如果该节点创建请求指定了一个NodeID但是服务在创建该节点之前修改了该NodeID, 该服务必须也在 IQ result 中指定已修改的节点. 在所有其他情况下, 该服务可以在该 IQ result 中指定NodeID但是节点创建者不能(MUST NOT)依赖从服务接收到它(因为节点创建者能通过跟踪 IQ-set 指定的'id'属性来确定哪个节点被创建了).
以缺省配置创建一个节点
如上文解释的, 每个节点有它自己的缺省配置. 通过以缺省配置向服务请求创建一个节点, 该节点创建者接受缺省配置. 如果服务允许节点配置, 所有者可以在创建节点之后重新配置该节点(如本文的配置节点所述). 另外, 一个服务可以允许实体在创建节点之前为一个给定的节点类型决定缺省配置(如本文的请求缺省配置所述).
为了以缺省配置创建一个节点, 节点创建者可以简单的包含一个空的<create/>子元素.
在以下例子中, 节点创建者以一个公开访问模式(假定是该服务的缺省类型)请求一个叶子节点(缺省类型).
例子 132. 实体以(缺省的)公开访问模式请求叶子节点
<iq type='set' from='hamlet@denmark.lit/elsinore' to='pubsub.shakespeare.lit' id='create1'> <pubsub xmlns='http://jabber.org/protocol/pubsub'> <create node='princely_musings'/> </pubsub> </iq>
注意: 'pubsub#node_type' 配置字段的的缺省设置是"leaf".
为了向服务请求一个不同于缺省的访问模式, 该节点创建者必须在节点创建请求中包含一个数据表单来为 'pubsub#access_model' 字段指定一个非缺省的值.
例子 133. 实体以非缺省访问模式请求叶子节点
<iq type='set' from='hamlet@denmark.lit/elsinore' to='pubsub.shakespeare.lit' id='create2'> <pubsub xmlns='http://jabber.org/protocol/pubsub'> <create node='princely_musings'/> <configure> <x xmlns='jabber:x:data' type='submit'> <field var='FORM_TYPE' type='hidden'> <value>http://jabber.org/protocol/pubsub#node_config</value> </field> <field var='pubsub#access_model'><value>whitelist</value></field> </x> </configure> </pubsub> </iq>
如果该访问模式是被支持的并且没有发生常规或方法特有的错误, 服务应该创建该节点并通知请求实体成功.
例子 134. 服务通知请求实体成功
<iq type='result' from='pubsub.shakespeare.lit' to='hamlet@denmark.lit/elsinore' id='create1'/>
如果服务不支持指定的访问模式, 它必须返回一个<not-acceptable/>错误, 指定一个pubsub特有的错误条件<unsupported-access-model/>.
例子 135. 服务不支持指定的访问模式
<iq type='error' from='pubsub.shakespeare.lit' to='hamlet@denmark.lit/elsinore' id='create2'> <error type='modify'> <not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> <unsupported-access-model xmlns='http://jabber.org/protocol/pubsub#errors'/> </error> </iq>
(对于如果服务不支持指定的节点类型的错误处理, 参考 XEP-0248 .)
创建并配置节点
如果一个实现允许节点配置(见本文的配置节点), 它应该允许创建请求在节点创建请求中包含期望的节点配置.
注意: <configure/>元素必须跟随<create/>元素且不能(MUST NOT)拥有 'node' 属性, 因为<create/>元素的 'node' 属性的值指定了期望的NodeID; 如果这些规则中的任何一个规则被违反了, 该服务必须返回一个<bad-request/>错误.
例子 136. 实体以非缺省配置请求一个新节点
<iq type='set' from='hamlet@denmark.lit/elsinore' to='pubsub.shakespeare.lit' id='create1'> <pubsub xmlns='http://jabber.org/protocol/pubsub'> <create node='princely_musings'/> <configure> <x xmlns='jabber:x:data' type='submit'> <field var='FORM_TYPE' type='hidden'> <value>http://jabber.org/protocol/pubsub#node_config</value> </field> <field var='pubsub#title'><value>Princely Musings (Atom)</value></field> <field var='pubsub#deliver_notifications'><value>1</value></field> <field var='pubsub#deliver_payloads'><value>1</value></field> <field var='pubsub#persist_items'><value>1</value></field> <field var='pubsub#max_items'><value>10</value></field> <field var='pubsub#item_expire'><value>604800</value></field> <field var='pubsub#access_model'><value>open</value></field> <field var='pubsub#publish_model'><value>publishers</value></field> <field var='pubsub#purge_offline'><value>0</value></field> <field var='pubsub#send_last_published_item'><value>never</value></field> <field var='pubsub#presence_based_delivery'><value>false</value></field> <field var='pubsub#notification_type'><value>headline</value></field> <field var='pubsub#notify_config'><value>0</value></field> <field var='pubsub#notify_delete'><value>0</value></field> <field var='pubsub#notify_retract'><value>0</value></field> <field var='pubsub#notify_sub'><value>0</value></field> <field var='pubsub#max_payload_size'><value>1028</value></field> <field var='pubsub#type'><value>http://www.w3.org/2005/Atom</value></field> <field var='pubsub#body_xslt'> <value>http://jabxslt.jabberstudio.org/atom_body.xslt</value> </field> </x> </configure> </pubsub> </iq>
例子 137. 服务应答成功
<iq type='result' from='pubsub.shakespeare.lit' to='hamlet@denmark.lit/elsinore' id='create1'/>
如果一个服务支持这个 "create-and-configure" 特性, 它必须在对服务查询信息请求的应答中通过返回一个特性 "http://jabber.org/protocol/pubsub#create-and-configure" 来声明那一事实. 如果 create-and-configure 选项不被支持但是请求实体还是发送了这样一个请求, 服务应该忽略该请求的配置部分而当成没有包含这些配置一样处理.
配置节点
在创建了一个新节点之后, 该节点所有者可能想修改该节点的配置. 推荐支持这个特性.
请求
例子 138. 所有者请求配置表单
<iq type='get' from='hamlet@denmark.lit/elsinore' to='pubsub.shakespeare.lit' id='config1'> <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'> <configure node='princely_musings'/> </pubsub> </iq>
成功场景
如果没有发生错误, 服务器必须返回一个配置表单给该节点所有者, 它应该包含当前的节点配置作为缺省值.
注意: 接下来的例子展示了一些可以提供的可能的配置选项. 如果一个实现使用 数据表单 协议实现了这些特性, 那个实现必须使用已经注册到XMPP注册处的和 'http://jabber.org/protocol/pubsub' 命名空间相关的字段(那些字段变量的初步表述见下文以及本文的pubsub#node_config FORM_TYPE, 但是不能(MUST NOT)被解释为标准, 因为XMPP注册处可以晚些时候标准化额外的字段而不用改变本文). 一个实现可以选择指定不同的标签, 值, 以及甚至字段类型, 但必须遵循已定义的变量名scheme.
例子 139. 服务应答配置表单
<iq type='result' from='pubsub.shakespeare.lit' to='hamlet@denmark.lit/elsinore' id='config1'> <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'> <configure node='princely_musings'> <x xmlns='jabber:x:data' type='form'> <field var='FORM_TYPE' type='hidden'> <value>http://jabber.org/protocol/pubsub#node_config</value> </field> <field var='pubsub#title' type='text-single' label='A friendly name for the node'/> <field var='pubsub#deliver_notifications' type='boolean' label='Whether to deliver event notifications'> <value>true</value> </field> <field var='pubsub#deliver_payloads' type='boolean' label='Whether to deliver payloads with event notifications'> <value>true</value> </field> <field var='pubsub#notify_config' type='boolean' label='Notify subscribers when the node configuration changes'> <value>0</value> </field> <field var='pubsub#notify_delete' type='boolean' label='Notify subscribers when the node is deleted'> <value>false</value> </field> <field var='pubsub#notify_retract' type='boolean' label='Notify subscribers when items are removed from the node'> <value>false</value> </field> <field var='pubsub#notify_sub' type='boolean' label='Notify owners about new subscribers and unsubscribes'> <value>0</value> </field> <field var='pubsub#persist_items' type='boolean' label='Persist items to storage'> <value>1</value> </field> <field var='pubsub#max_items' type='text-single' label='Max # of items to persist'> <value>10</value> </field> <field var='pubsub#item_expire' type='text-single' label='Time after which to automatically purge items'> <value>604800</value> </field> <field var='pubsub#subscribe' type='boolean' label='Whether to allow subscriptions'> <value>1</value> </field> <field var='pubsub#access_model' type='list-single' label='Specify the subscriber model'> <option><value>authorize</value></option> <option><value>open</value></option> <option><value>presence</value></option> <option><value>roster</value></option> <option><value>whitelist</value></option> <value>open</value> </field> <field var='pubsub#roster_groups_allowed' type='list-multi' label='Roster groups allowed to subscribe'> <option><value>friends</value></option> <option><value>courtiers</value></option> <option><value>servants</value></option> <option><value>enemies</value></option> </field> <field var='pubsub#publish_model' type='list-single' label='Specify the publisher model'> <option><value>publishers</value></option> <option><value>subscribers</value></option> <option><value>open</value></option> <value>publishers</value> </field> <field var='pubsub#purge_offline' type='boolean' label='Purge all items when the relevant publisher goes offline?'> <value>0</value> </field> <field var='pubsub#max_payload_size' type='text-single' label='Max Payload size in bytes'> <value>1028</value> </field> <field var='pubsub#send_last_published_item' type='list-single' label='When to send the last published item'> <option label='Never'><value>never</value></option> <option label='When a new subscription is processed'><value>on_sub</value></option> <option label='When a new subscription is processed and whenever a subscriber comes online'> <value>on_sub_and_presence</value> </option> <value>never</value> </field> <field var='pubsub#presence_based_delivery' type='boolean' label='Deliver event notifications only to available users'> <value>0</value> </field> <field var='pubsub#notification_type' type='list-single' label='Specify the delivery style for event notifications'> <option><value>normal</value></option> <option><value>headline</value></option> <value>headline</value> </field> <field var='pubsub#type' type='text-single' label='Specify the type of payload data to be provided at this node'> <value>http://www.w3.org/2005/Atom</value> </field> <field var='pubsub#dataform_xslt' type='text-single' label='Payload XSLT'/> </x> </configure> </pubsub> </iq>
错误场景
有很多原因可能导致节点配置请求失败:
- 服务不支持节点配置.
- 请求实体没有足够权限配置该节点.
- 请求未指定一个节点.
- 节点没有配置选项.
- 指定的节点不存在.
这些错误场景的完整描述在下面章节.
不支持节点配置
如果服务不支持节点配置, 该服务必须返回一个<feature-not-implemented/>错误, 指定一个pubsub特有的错误条件<unsupported/>和一个特性 "config-node" .
例子 140. 服务不支持节点配置
<iq type='error' from='hamlet@denmark.lit/elsinore' to='pubsub.shakespeare.lit' id='config1'> <error type='cancel'> <feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> <unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='config-node'/> </error> </iq>
权限不足
如果请求实体没有足够权限去配置该节点, 服务必须应答一个<forbidden/>错误.
例子 141. 请求实体被禁止配置该节点
<iq type='error' from='pubsub.shakespeare.lit' to='hamlet@denmark.lit/elsinore' id='config1'> <error type='auth'> <forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq>
要求NodeID
如果请求未指定一个节点, 服务应该返回一个<bad-request/>错误. 有可能不包含一个NodeID是因为请求实体向根节点请求配置; 无论如何, 如果请求实体不是一个服务器范围的管理员, 最好返回<bad-request/>而不是<forbidden/>.
例子 142. 请求未指定一个节点
<iq type='error' from='hamlet@denmark.lit/elsinore' to='pubsub.shakespeare.lit' id='config1'> <error type='modify'> <bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> <nodeid-required xmlns='http://jabber.org/protocol/pubsub#errors'/> </error> </iq>
无配置选项
如果没有配置选项可用(例如, 因为节点配置"被封止了"), 该服务必须返回一个<not-allowed/>错误给所有者.
例子 143. 节点无配置选项
<iq type='error' from='hamlet@denmark.lit/elsinore' to='pubsub.shakespeare.lit' id='config1'> <error type='cancel'> <not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq>
节点不存在
如果节点不存在, 服务必须返回一个<item-not-found/>错误.
例子 144. 节点不存在
<iq type='error' from='pubsub.shakespeare.lit' to='hamlet@denmark.lit/elsinore' id='config1'> <error type='cancel'> <item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq>
表单提交
在接收到配置表单之后, 所有者应该提交一个完成的配置表单.
例子 145. 所有者提交节点配置表单
<iq type='set' from='hamlet@denmark.lit/elsinore' to='pubsub.shakespeare.lit' id='config2'> <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'> <configure node='princely_musings'> <x xmlns='jabber:x:data' type='submit'> <field var='FORM_TYPE' type='hidden'> <value>http://jabber.org/protocol/pubsub#node_config</value> </field> <field var='pubsub#title'><value>Princely Musings (Atom)</value></field> <field var='pubsub#deliver_notifications'><value>1</value></field> <field var='pubsub#deliver_payloads'><value>1</value></field> <field var='pubsub#persist_items'><value>1</value></field> <field var='pubsub#max_items'><value>10</value></field> <field var='pubsub#item_expire'><value>604800</value></field> <field var='pubsub#access_model'><value>roster</value></field> <field var='pubsub#roster_groups_allowed'> <value>friends</value> <value>servants</value> <value>courtiers</value> </field> <field var='pubsub#publish_model'><value>publishers</value></field> <field var='pubsub#purge_offline'><value>0</value></field> <field var='pubsub#send_last_published_item'><value>never</value></field> <field var='pubsub#presence_based_delivery'><value>false</value></field> <field var='pubsub#notification_type'><value>headline</value></field> <field var='pubsub#notify_config'><value>0</value></field> <field var='pubsub#notify_delete'><value>0</value></field> <field var='pubsub#notify_retract'><value>0</value></field> <field var='pubsub#notify_sub'><value>0</value></field> <field var='pubsub#max_payload_size'><value>1028</value></field> <field var='pubsub#type'><value>http://www.w3.org/2005/Atom</value></field> <field var='pubsub#body_xslt'> <value>http://jabxslt.jabberstudio.org/atom_body.xslt</value> </field> </x> </configure> </pubsub> </iq>
替代的, 所有者可以取消配置过程, 在这种情况下必须应用现有的配置.
例子 146. 所有者取消配置过程
<iq type='set' from='hamlet@denmark.lit/elsinore' to='pubsub.shakespeare.lit' id='config2'> <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'> <configure node='princely_musings'> <x xmlns='jabber:x:data' type='cancel'/> </configure> </pubsub> </iq>
表单处理
成功
如果表单能被成功处理, 服务必须返回一个 IQ-result.
例子 147. 服务应答成功
<iq type='result' from='pubsub.shakespeare.lit' to='hamlet@denmark.lit/elsinore' id='config2'/>
注意: 如果该节点类型从叶子改成集合且有条目和该节点相关, 服务必须清除节点的所有条目(通知或不通知订阅者).
失败
如果请求的节点配置变更不能被处理(例如, 因为节点所有者尝试修改配置使得它没有节点所有者), 服务必须返回一个<not-acceptable/>错误给所有者.
例子 148. 配置变更不能被处理
<iq type='error' from='pubsub.shakespeare.lit' to='hamlet@denmark.lit/elsinore' id='config2'> <error type='modify'> <not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq>
成功并通知
如果 "pubsub#notify_config" 选项被设为true, 服务必须通知订阅者配置变更. (服务应该为叶子节点支持这个选项,必须为集合节点支持这个选项,如 XEP-0248 所述.) 如果节点配置被设为仅通知, 该通知必须包含一个空的<configuration/>元素,它的'node'属性被设为该节点的NodeID; 如果该节点配置被设为全载荷, <configuration/>元素必须额外包含该节点配置并通过 数据表单 协议展示它.
例子 149. 服务发送配置变更通知(仅事件通知)
<message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'> <event xmlns='http://jabber.org/protocol/pubsub#event'> <configuration node='princely_musings'/> </event> </message>
例子 150. 服务发送配置变更通知(带载荷)
<message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'> <event xmlns='http://jabber.org/protocol/pubsub#event'> <configuration node='princely_musings'> <x xmlns='jabber:x:data' type='result'> <field var='FORM_TYPE' type='hidden'> <value>http://jabber.org/protocol/pubsub#node_config</value> </field> <field var='pubsub#title'><value>Princely Musings (Atom)</value></field> <field var='pubsub#deliver_notifications'><value>1</value></field> <field var='pubsub#deliver_payloads'><value>1</value></field> <field var='pubsub#notify_config'><value>0</value></field> <field var='pubsub#notify_delete'><value>0</value></field> <field var='pubsub#notify_retract'><value>0</value></field> <field var='pubsub#notify_sub'><value>0</value></field> <field var='pubsub#persist_items'><value>1</value></field> <field var='pubsub#max_items'><value>10</value></field> <field var='pubsub#item_expire'><value>604800</value></field> <field var='pubsub#subscribe'><value>1</value></field> <field var='pubsub#access_model'><value>open</value></field> <field var='pubsub#publish_model'><value>publishers</value></field> <field var='pubsub#purge_offline'><value>0</value></field> <field var='pubsub#max_payload_size'><value>9216</value></field> <field var='pubsub#send_last_published_item'><value>never</value></field> <field var='pubsub#presence_based_delivery'><value>0</value></field> <field var='pubsub#notification_type'><value>headline</value></field> <field var='pubsub#type'><value>http://www.w3.org/2005/Atom</value></field> <field var='pubsub#body_xslt'> <value>http://jabxslt.jabberstudio.org/atom_body.xslt</value> </field> </x> </configuration> </event> </message>
请求缺省节点配置选项
一个实体可能希望请求关于缺省节点配置的信息, 例如 为了确定是否执行前文所述的 创建并配置 . 对这个特性的支持是可选的.
请求
要获得节点选项, 该实体必须不带NodeID发送一个空的<default/>元素给服务; 在应答中, 该服务应该返回缺省节点选项.
例子 151. 实体请求缺省节点配置选项
<iq type='get' from='hamlet@denmark.lit/elsinore' to='pubsub.shakespeare.lit' id='def1'> <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'> <default/> </pubsub> </iq>
成功场景
如果没有发生错误, 服务必须返回缺省节点配置选项.
例子 152. 服务应答缺省节点配置选项
<iq type='result' from='pubsub.shakespeare.lit' to='hamlet@denmark.lit/elsinore' id='def1'> <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'> <default> <x xmlns='jabber:x:data' type='form'> <field var='FORM_TYPE' type='hidden'> <value>http://jabber.org/protocol/pubsub#node_config</value> </field> <field var='pubsub#title' type='text-single' label='A friendly name for the node'/> <field var='pubsub#deliver_notifications' type='boolean' label='Deliver event notifications'> <value>true</value> </field> <field var='pubsub#deliver_payloads' type='boolean' label='Deliver payloads with event notifications'> <value>1</value> </field> <field var='pubsub#description' type='text-single' label='A description of the node'/> <field var='pubsub#notify_config' type='boolean' label='Notify subscribers when the node configuration changes'> <value>0</value> </field> <field var='pubsub#notify_delete' type='boolean' label='Notify subscribers when the node is deleted'> <value>0</value> </field> <field var='pubsub#notify_retract' type='boolean' label='Notify subscribers when items are removed from the node'> <value>0</value> </field> <field var='pubsub#notify_sub' type='boolean' label='Notify owners about new subscribers and unsubscribes'> <value>0</value> </field> <field var='pubsub#persist_items' type='boolean' label='Persist items to storage'> <value>1</value> </field> <field var='pubsub#max_items' type='text-single' label='Max # of items to persist'> <value>10</value> </field> <field var='pubsub#item_expire' type='text-single' label='Time after which to automatically purge items'> <value>604800</value> </field> <field var='pubsub#subscribe' type='boolean' label='Whether to allow subscriptions'> <value>1</value> </field> <field var='pubsub#access_model' type='list-single' label='Specify the subscriber model'> <option><value>authorize</value></option> <option><value>open</value></option> <option><value>presence</value></option> <option><value>roster</value></option> <option><value>whitelist</value></option> <value>open</value> </field> <field var='pubsub#roster_groups_allowed' type='list-multi' label='Roster groups allowed to subscribe'> <option><value>friends</value></option> <option><value>courtiers</value></option> <option><value>servants</value></option> <option><value>enemies</value></option> </field> <field var='pubsub#publish_model' type='list-single' label='Specify the publisher model'> <option><value>publishers</value></option> <option><value>subscribers</value></option> <option><value>open</value></option> <value>publishers</value> </field> <field var='pubsub#purge_offline' type='boolean' label='Purge all items when the relevant publisher goes offline?'> <value>0</value> </field> <field var='pubsub#max_payload_size' type='text-single' label='Max payload size in bytes'> <value>9216</value> </field> <field var='pubsub#send_last_published_item' type='list-single' label='When to send the last published item'> <option label='Never'><value>never</value></option> <option label='When a new subscription is processed'><value>on_sub</value></option> <option label='When a new subscription is processed and whenever a subscriber comes online'> <value>on_sub_and_presence</value> </option> <value>never</value> </field> <field var='pubsub#presence_based_delivery' type='boolean' label='Deliver notifications only to available users'> <value>0</value> </field> <field var='pubsub#notification_type' type='list-single' label='Specify the delivery style for notifications'> <option><value>normal</value></option> <option><value>headline</value></option> <value>headline</value> </field> </x> </default> </pubsub> </iq>
错误场景
有很多原因可能导致缺省节点配置选项请求失败:
- 服务不支持节点配置.
- 服务不支持获取缺省节点配置.
这些错误场景的完整描述见下面章节.
不支持节点配置
如果服务不支持节点配置, 它必须返回一个<feature-not-implemented/>错误, 指定一个pubsub特有的错误条件<unsupported/>和一个特性 "config-node" .
例子 153. 服务不支持节点配置
<iq type='error' from='pubsub.shakespeare.lit' to='hamlet@denmark.lit/elsinore' id='def1'> <error type='cancel'> <feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> <unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='config-node'/> </error> </iq>
不支持缺省节点配置获取
如果服务不支持获取缺省节点配置选项, 它必须返回一个<feature-not-implemented/>错误, 指定一个pubsub特有的错误条件<unsupported/>和一个特性 "retrieve-default" .
例子 154. 服务不支持获取缺省节点配置选项
<iq type='error' from='pubsub.shakespeare.lit' to='hamlet@denmark.lit/elsinore' id='def1'> <error type='cancel'> <feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> <unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='retri