]> git.ipfire.org Git - thirdparty/dnspython.git/commitdiff
Add URI record type (draft-faltstrom-uri-13)
authorPetr Spacek <pspacek@redhat.com>
Tue, 17 Mar 2015 15:31:13 +0000 (16:31 +0100)
committerPetr Viktorin <pviktori@redhat.com>
Wed, 27 May 2015 11:13:40 +0000 (13:13 +0200)
dns/rdatatype.py
dns/rdtypes/ANY/URI.py [new file with mode: 0644]

index ae6b6ec29749b3811b721883ae308ccc9786cc4f..0ef6ec26c2d50489fb28e0ead124c83b19a15e38 100644 (file)
@@ -89,6 +89,7 @@ AXFR = 252
 MAILB = 253
 MAILA = 254
 ANY = 255
+URI = 256
 CAA = 257
 TA = 32768
 DLV = 32769
@@ -153,6 +154,7 @@ _by_text = {
     'MAILB' : MAILB,
     'MAILA' : MAILA,
     'ANY' : ANY,
+    'URI' : URI,
     'CAA' : CAA,
     'TA' : TA,
     'DLV' : DLV,
diff --git a/dns/rdtypes/ANY/URI.py b/dns/rdtypes/ANY/URI.py
new file mode 100644 (file)
index 0000000..238a927
--- /dev/null
@@ -0,0 +1,73 @@
+# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
+# Copyright (C) 2015 Red Hat, Inc.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose with or without fee is hereby granted,
+# provided that the above copyright notice and this permission notice
+# appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+import struct
+
+import dns.exception
+import dns.rdata
+import dns.name
+
+class URI(dns.rdata.Rdata):
+    """URI record
+
+    @ivar priority: the priority
+    @type priority: int
+    @ivar weight: the weight
+    @type weight: int
+    @ivar target: the target host
+    @type target: dns.name.Name object
+    @see: draft-faltstrom-uri-13"""
+
+    __slots__ = ['priority', 'weight', 'target']
+
+    def __init__(self, rdclass, rdtype, priority, weight, target):
+        super(URI, self).__init__(rdclass, rdtype)
+        self.priority = priority
+        self.weight = weight
+        if len(target) < 1:
+            raise dns.exception.SyntaxError("URI target cannot be empty")
+        self.target = target
+
+    def to_text(self, origin=None, relativize=True, **kw):
+        return '%d %d "%s"' % (self.priority, self.weight, self.target)
+
+    @classmethod
+    def from_text(cls, rdclass, rdtype, tok, origin = None, relativize = True):
+        priority = tok.get_uint16()
+        weight = tok.get_uint16()
+        target = tok.get().unescape()
+        if not (target.is_quoted_string() or target.is_identifier()):
+            raise dns.exception.SyntaxError("URI target must be a string")
+        tok.get_eol()
+        return cls(rdclass, rdtype, priority, weight, target.value)
+
+    def to_wire(self, file, compress = None, origin = None):
+        two_ints = struct.pack("!HH", self.priority, self.weight)
+        file.write(two_ints)
+        file.write(self.target.encode('ascii'))
+
+    @classmethod
+    def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin = None):
+        if rdlen < 5:
+            raise dns.exception.FormError('URI RR is shorter than 5 octets')
+
+        (priority, weight) = struct.unpack('!HH', wire[current : current + 4])
+        current += 4
+        rdlen -= 4
+        target = wire[current : current + rdlen].decode('ascii')
+        current += rdlen
+
+        return cls(rdclass, rdtype, priority, weight, target)