Esempio n. 1
0
        public void ToCanonical()
        {
            var a = new DomainName("My.EXAMPLe.ORg");

            Assert.AreEqual("My.EXAMPLe.ORg", a.ToString());
            Assert.AreEqual("my.example.org", a.ToCanonical().ToString());
        }
Esempio n. 2
0
        /// <summary>
        ///   Write a domain name.
        /// </summary>
        /// <param name="name">
        ///   The name to write.
        /// </param>
        /// <param name="uncompressed">
        ///   Determines if the <paramref name="name"/> must be uncompressed.  The
        ///   defaultl is false (allow compression).
        ///   <see cref="CanonicalForm"/> overrides this value.
        /// </param>
        /// <exception cref="ArgumentException">
        ///   When a label length is greater than 63 octets.
        /// </exception>
        /// <remarks>
        ///   A domain name is represented as a sequence of labels, where
        ///   each label consists of a length octet followed by that
        ///   number of octets.The domain name terminates with the
        ///   zero length octet for the null label of the root. Note
        ///   that this field may be an odd number of octets; no
        ///   padding is used.
        /// </remarks>
        public void WriteDomainName(DomainName name, bool uncompressed = false)
        {
            if (name == null)
            {
                stream.WriteByte(0); // terminating byte
                ++Position;
                return;
            }

            if (CanonicalForm)
            {
                uncompressed = true;
                name         = name.ToCanonical();
            }

            var labels = name.Labels.ToArray();
            var n      = labels.Length;

            for (var i = 0; i < n; ++i)
            {
                var label = labels[i];
                if (label.Length > 63)
                {
                    throw new ArgumentException($"Label '{label}' cannot exceed 63 octets.");
                }

                // Check for qualified name already used.
                var qn = string.Join(".", labels, i, labels.Length - i);
                if (!uncompressed && pointers.TryGetValue(qn, out int pointer))
                {
                    WriteUInt16((ushort)(0xC000 | pointer));
                    return;
                }
                if (Position <= maxPointer)
                {
                    pointers[qn] = Position;
                }

                // Add the label
                var bytes = Encoding.UTF8.GetBytes(label);
                WriteByteLengthPrefixedBytes(bytes);
            }

            stream.WriteByte(0); // terminating byte
            ++Position;
        }