diff --git a/codec-dns/src/main/java/io/netty/handler/codec/dns/DefaultDnsPtrRecord.java b/codec-dns/src/main/java/io/netty/handler/codec/dns/DefaultDnsPtrRecord.java
new file mode 100644
index 0000000000..517c5f9570
--- /dev/null
+++ b/codec-dns/src/main/java/io/netty/handler/codec/dns/DefaultDnsPtrRecord.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2016 The Netty Project
+ *
+ * The Netty Project licenses this file to you under the Apache License,
+ * version 2.0 (the "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+package io.netty.handler.codec.dns;
+
+import static io.netty.util.internal.ObjectUtil.checkNotNull;
+
+import io.netty.util.internal.StringUtil;
+
+public class DefaultDnsPtrRecord extends AbstractDnsRecord implements DnsPtrRecord {
+
+ private final String hostname;
+
+ /**
+ * Creates a new PTR record.
+ *
+ * @param name the domain name
+ * @param type the type of the record
+ * @param dnsClass the class of the record, usually one of the following:
+ *
+ * - {@link #CLASS_IN}
+ * - {@link #CLASS_CSNET}
+ * - {@link #CLASS_CHAOS}
+ * - {@link #CLASS_HESIOD}
+ * - {@link #CLASS_NONE}
+ * - {@link #CLASS_ANY}
+ *
+ * @param timeToLive the TTL value of the record
+ * @param hostname the hostname this PTR record resolves to.
+ */
+ public DefaultDnsPtrRecord(
+ String name, int dnsClass, long timeToLive, String hostname) {
+ super(name, DnsRecordType.PTR, dnsClass, timeToLive);
+ this.hostname = checkNotNull(hostname, "hostname");
+ }
+
+ @Override
+ public String hostname() {
+ return hostname;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder buf = new StringBuilder(64).append(StringUtil.simpleClassName(this)).append('(');
+ final DnsRecordType type = type();
+ buf.append(name().isEmpty()? "" : name())
+ .append(' ')
+ .append(timeToLive())
+ .append(' ');
+
+ DnsMessageUtil.appendRecordClass(buf, dnsClass())
+ .append(' ')
+ .append(type.name());
+
+ buf.append(' ')
+ .append(hostname);
+
+ return buf.toString();
+ }
+}
diff --git a/codec-dns/src/main/java/io/netty/handler/codec/dns/DefaultDnsRecordDecoder.java b/codec-dns/src/main/java/io/netty/handler/codec/dns/DefaultDnsRecordDecoder.java
index 6d6beea4e4..5f04e2bd63 100644
--- a/codec-dns/src/main/java/io/netty/handler/codec/dns/DefaultDnsRecordDecoder.java
+++ b/codec-dns/src/main/java/io/netty/handler/codec/dns/DefaultDnsRecordDecoder.java
@@ -87,6 +87,10 @@ public class DefaultDnsRecordDecoder implements DnsRecordDecoder {
String name, DnsRecordType type, int dnsClass, long timeToLive,
ByteBuf in, int offset, int length) throws Exception {
+ if (type == DnsRecordType.PTR) {
+ in.setIndex(offset, offset + length);
+ return new DefaultDnsPtrRecord(name, dnsClass, timeToLive, decodeName(in));
+ }
return new DefaultDnsRawRecord(
name, type, dnsClass, timeToLive, in.duplicate().setIndex(offset, offset + length).retain());
}
diff --git a/codec-dns/src/main/java/io/netty/handler/codec/dns/DefaultDnsRecordEncoder.java b/codec-dns/src/main/java/io/netty/handler/codec/dns/DefaultDnsRecordEncoder.java
index 055ac2f34f..e9dc602032 100644
--- a/codec-dns/src/main/java/io/netty/handler/codec/dns/DefaultDnsRecordEncoder.java
+++ b/codec-dns/src/main/java/io/netty/handler/codec/dns/DefaultDnsRecordEncoder.java
@@ -43,6 +43,8 @@ public class DefaultDnsRecordEncoder implements DnsRecordEncoder {
public void encodeRecord(DnsRecord record, ByteBuf out) throws Exception {
if (record instanceof DnsQuestion) {
encodeQuestion((DnsQuestion) record, out);
+ } else if (record instanceof DnsPtrRecord) {
+ encodePtrRecord((DnsPtrRecord) record, out);
} else if (record instanceof DnsRawRecord) {
encodeRawRecord((DnsRawRecord) record, out);
} else {
@@ -50,6 +52,16 @@ public class DefaultDnsRecordEncoder implements DnsRecordEncoder {
}
}
+ private void encodePtrRecord(DnsPtrRecord record, ByteBuf out) throws Exception {
+ encodeName(record.name(), out);
+
+ out.writeShort(record.type().intValue());
+ out.writeShort(record.dnsClass());
+ out.writeInt((int) record.timeToLive());
+
+ encodeName(record.hostname(), out);
+ }
+
private void encodeRawRecord(DnsRawRecord record, ByteBuf out) throws Exception {
encodeName(record.name(), out);
diff --git a/codec-dns/src/main/java/io/netty/handler/codec/dns/DnsPtrRecord.java b/codec-dns/src/main/java/io/netty/handler/codec/dns/DnsPtrRecord.java
new file mode 100644
index 0000000000..53962e1142
--- /dev/null
+++ b/codec-dns/src/main/java/io/netty/handler/codec/dns/DnsPtrRecord.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2016 The Netty Project
+ *
+ * The Netty Project licenses this file to you under the Apache License,
+ * version 2.0 (the "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+package io.netty.handler.codec.dns;
+
+public interface DnsPtrRecord extends DnsRecord {
+
+ /**
+ * Returns the hostname this PTR record resolves to.
+ */
+ String hostname();
+
+}