private DnsResourceRecord ResolveUriRecord(ResourceRecordInfo info) { var prio = _reader.ReadUInt16NetworkOrder(); var weight = _reader.ReadUInt16NetworkOrder(); var target = _reader.ReadString(info.RawDataLength - 4); return(new UriRecord(info, prio, weight, target)); }
public DnsResourceRecord GetRecord(ResourceRecordInfo info) { if (info == null) { throw new ArgumentNullException(nameof(info)); } var oldIndex = _reader.Index; DnsResourceRecord result; switch (info.RecordType) { case ResourceRecordType.A: result = new ARecord(info, _reader.ReadIPAddress()); break; case ResourceRecordType.NS: result = new NsRecord(info, _reader.ReadDnsName()); break; case ResourceRecordType.CNAME: result = new CNameRecord(info, _reader.ReadDnsName()); break; case ResourceRecordType.SOA: result = ResolveSoaRecord(info); break; case ResourceRecordType.MB: result = new MbRecord(info, _reader.ReadDnsName()); break; case ResourceRecordType.MG: result = new MgRecord(info, _reader.ReadDnsName()); break; case ResourceRecordType.MR: result = new MrRecord(info, _reader.ReadDnsName()); break; case ResourceRecordType.NULL: result = new NullRecord(info, _reader.ReadBytes(info.RawDataLength).ToArray()); break; case ResourceRecordType.WKS: result = ResolveWksRecord(info); break; case ResourceRecordType.PTR: result = new PtrRecord(info, _reader.ReadDnsName()); break; case ResourceRecordType.HINFO: result = new HInfoRecord(info, _reader.ReadString(), _reader.ReadString()); break; case ResourceRecordType.MINFO: result = new MInfoRecord(info, _reader.ReadDnsName(), _reader.ReadDnsName()); break; case ResourceRecordType.MX: result = ResolveMXRecord(info); break; case ResourceRecordType.TXT: result = ResolveTXTRecord(info); break; case ResourceRecordType.RP: result = new RpRecord(info, _reader.ReadDnsName(), _reader.ReadDnsName()); break; case ResourceRecordType.AFSDB: result = new AfsDbRecord(info, (AfsType)_reader.ReadUInt16NetworkOrder(), _reader.ReadDnsName()); break; case ResourceRecordType.AAAA: result = new AaaaRecord(info, _reader.ReadIPv6Address()); break; case ResourceRecordType.SRV: result = ResolveSrvRecord(info); break; case ResourceRecordType.OPT: result = ResolveOptRecord(info); break; case ResourceRecordType.URI: result = ResolveUriRecord(info); break; case ResourceRecordType.CAA: result = ResolveCaaRecord(info); break; default: // update reader index because we don't read full data for the empty record _reader.Index += info.RawDataLength; result = new EmptyRecord(info); break; } // sanity check if (_reader.Index != oldIndex + info.RawDataLength) { throw new InvalidOperationException("Record reader index out of sync."); } return(result); }