summaryrefslogtreecommitdiff
path: root/slixmpp/plugins/xep_0131/stanza.py
blob: d075c15efe8a4842bf706c8dae8b83ae890fc7d1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
"""
    Slixmpp: The Slick XMPP Library
    Copyright (C) 2012 Nathanael C. Fritz, Lance J.T. Stout
    This file is part of Slixmpp.

    See the file LICENSE for copying permission.
"""

from collections import OrderedDict
from slixmpp.xmlstream import ET, ElementBase


class Headers(ElementBase):
    name = 'headers'
    namespace = 'http://jabber.org/protocol/shim'
    plugin_attrib = 'headers'
    interfaces = {'headers'}
    is_extension = True

    def get_headers(self):
        result = OrderedDict()
        headers = self.xml.findall('{%s}header' % self.namespace)
        for header in headers:
            name = header.attrib.get('name', '')
            value = header.text
            if name in result:
                if not isinstance(result[name], set):
                    result[name] = [result[name]]
                else:
                    result[name] = []
                result[name].add(value)
            else:
                result[name] = value
        return result

    def set_headers(self, values):
        self.del_headers()
        for name in values:
            vals = values[name]
            if not isinstance(vals, (list, set)):
                vals = [values[name]]
            for value in vals:
                header = ET.Element('{%s}header' % self.namespace)
                header.attrib['name'] = name
                header.text = value
                self.xml.append(header)

    def del_headers(self):
        headers = self.xml.findall('{%s}header' % self.namespace)
        for header in headers:
            self.xml.remove(header)