]> git.ipfire.org Git - thirdparty/dnspython.git/commitdiff
Optimize name.to_digestable() and to_wire(). 470/head
authorBrian Wellington <bwelling@xbill.org>
Fri, 15 May 2020 20:48:34 +0000 (13:48 -0700)
committerBrian Wellington <bwelling@xbill.org>
Fri, 15 May 2020 20:48:34 +0000 (13:48 -0700)
dns/name.py

index 1d151c6d51452c0c57006682f4244ab1f7a5ec3a..ce90f91b5c7ce80ce31c4ee8a0b0b2af4098fe40 100644 (file)
@@ -594,16 +594,17 @@ class Name(object):
         Returns a ``bytes``.
         """
 
+        out = bytearray()
+        for label in self.labels:
+            out.append(len(label))
+            out += label.lower()
         if not self.is_absolute():
             if origin is None or not origin.is_absolute():
                 raise NeedAbsoluteNameOrOrigin
-            labels = list(self.labels)
-            labels.extend(list(origin.labels))
-        else:
-            labels = self.labels
-        dlabels = [struct.pack('!B%ds' % len(x), len(x), x.lower())
-                   for x in labels]
-        return b''.join(dlabels)
+            for label in origin.labels:
+                out.append(len(label))
+                out += label.lower()
+        return bytes(out)
 
     def to_wire(self, file=None, compress=None, origin=None):
         """Convert name to wire format, possibly compressing it.
@@ -629,10 +630,17 @@ class Name(object):
         """
 
         if file is None:
-            file = io.BytesIO()
-            want_return = True
-        else:
-            want_return = False
+            out = bytearray()
+            for label in self.labels:
+                out.append(len(label))
+                out += label
+            if not self.is_absolute():
+                if origin is None or not origin.is_absolute():
+                    raise NeedAbsoluteNameOrOrigin
+                for label in origin.labels:
+                    out.append(len(label))
+                    out += label
+            return bytes(out)
 
         if not self.is_absolute():
             if origin is None or not origin.is_absolute():
@@ -663,8 +671,6 @@ class Name(object):
                 file.write(struct.pack('!B', l))
                 if l > 0:
                     file.write(label)
-        if want_return:
-            return file.getvalue()
 
     def __len__(self):
         """The length of the name (in labels).