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()); }
/// <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; }