1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 import struct
17
18 import dns.exception
19 import dns.name
20 import dns.rdata
21 from dns._compat import xrange, text_type
25 l = len(s)
26 assert l < 256
27 file.write(struct.pack('!B', l))
28 file.write(s)
29
32 if isinstance(value, text_type):
33 return value.encode()
34 return value
35
36
37 -class NAPTR(dns.rdata.Rdata):
38
39 """NAPTR record
40
41 @ivar order: order
42 @type order: int
43 @ivar preference: preference
44 @type preference: int
45 @ivar flags: flags
46 @type flags: string
47 @ivar service: service
48 @type service: string
49 @ivar regexp: regular expression
50 @type regexp: string
51 @ivar replacement: replacement name
52 @type replacement: dns.name.Name object
53 @see: RFC 3403"""
54
55 __slots__ = ['order', 'preference', 'flags', 'service', 'regexp',
56 'replacement']
57
58 - def __init__(self, rdclass, rdtype, order, preference, flags, service,
59 regexp, replacement):
67
68 - def to_text(self, origin=None, relativize=True, **kw):
69 replacement = self.replacement.choose_relativity(origin, relativize)
70 return '%d %d "%s" "%s" "%s" %s' % \
71 (self.order, self.preference,
72 dns.rdata._escapify(self.flags),
73 dns.rdata._escapify(self.service),
74 dns.rdata._escapify(self.regexp),
75 replacement)
76
77 @classmethod
78 - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
89
90 - def to_wire(self, file, compress=None, origin=None):
97
98 @classmethod
99 - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
100 (order, preference) = struct.unpack('!HH', wire[current: current + 4])
101 current += 4
102 rdlen -= 4
103 strings = []
104 for i in xrange(3):
105 l = wire[current]
106 current += 1
107 rdlen -= 1
108 if l > rdlen or rdlen < 0:
109 raise dns.exception.FormError
110 s = wire[current: current + l].unwrap()
111 current += l
112 rdlen -= l
113 strings.append(s)
114 (replacement, cused) = dns.name.from_wire(wire[: current + rdlen],
115 current)
116 if cused != rdlen:
117 raise dns.exception.FormError
118 if origin is not None:
119 replacement = replacement.relativize(origin)
120 return cls(rdclass, rdtype, order, preference, strings[0], strings[1],
121 strings[2], replacement)
122
126