View Javadoc
1   /*
2    * Copyright 2015 The Netty Project
3    *
4    * The Netty Project licenses this file to you under the Apache License,
5    * version 2.0 (the "License"); you may not use this file except in compliance
6    * with the License. You may obtain a copy of the License at:
7    *
8    *   https://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13   * License for the specific language governing permissions and limitations
14   * under the License.
15   */
16  package io.netty5.handler.codec.dns;
17  
18  import io.netty5.util.internal.UnstableApi;
19  
20  import static java.util.Objects.requireNonNull;
21  
22  /**
23   * The DNS {@code RCODE}, as defined in <a href="https://tools.ietf.org/html/rfc2929">RFC2929</a>.
24   */
25  @UnstableApi
26  public class DnsResponseCode implements Comparable<DnsResponseCode> {
27  
28      /**
29       * The 'NoError' DNS RCODE (0), as defined in <a href="https://tools.ietf.org/html/rfc1035">RFC1035</a>.
30       */
31      public static final DnsResponseCode NOERROR = new DnsResponseCode(0, "NoError");
32  
33      /**
34       * The 'FormErr' DNS RCODE (1), as defined in <a href="https://tools.ietf.org/html/rfc1035">RFC1035</a>.
35       */
36      public static final DnsResponseCode FORMERR = new DnsResponseCode(1, "FormErr");
37  
38      /**
39       * The 'ServFail' DNS RCODE (2), as defined in <a href="https://tools.ietf.org/html/rfc1035">RFC1035</a>.
40       */
41      public static final DnsResponseCode SERVFAIL = new DnsResponseCode(2, "ServFail");
42  
43      /**
44       * The 'NXDomain' DNS RCODE (3), as defined in <a href="https://tools.ietf.org/html/rfc1035">RFC1035</a>.
45       */
46      public static final DnsResponseCode NXDOMAIN = new DnsResponseCode(3, "NXDomain");
47  
48      /**
49       * The 'NotImp' DNS RCODE (4), as defined in <a href="https://tools.ietf.org/html/rfc1035">RFC1035</a>.
50       */
51      public static final DnsResponseCode NOTIMP = new DnsResponseCode(4, "NotImp");
52  
53      /**
54       * The 'Refused' DNS RCODE (5), as defined in <a href="https://tools.ietf.org/html/rfc1035">RFC1035</a>.
55       */
56      public static final DnsResponseCode REFUSED = new DnsResponseCode(5, "Refused");
57  
58      /**
59       * The 'YXDomain' DNS RCODE (6), as defined in <a href="https://tools.ietf.org/html/rfc2136">RFC2136</a>.
60       */
61      public static final DnsResponseCode YXDOMAIN = new DnsResponseCode(6, "YXDomain");
62  
63      /**
64       * The 'YXRRSet' DNS RCODE (7), as defined in <a href="https://tools.ietf.org/html/rfc2136">RFC2136</a>.
65       */
66      public static final DnsResponseCode YXRRSET = new DnsResponseCode(7, "YXRRSet");
67  
68      /**
69       * The 'NXRRSet' DNS RCODE (8), as defined in <a href="https://tools.ietf.org/html/rfc2136">RFC2136</a>.
70       */
71      public static final DnsResponseCode NXRRSET = new DnsResponseCode(8, "NXRRSet");
72  
73      /**
74       * The 'NotAuth' DNS RCODE (9), as defined in <a href="https://tools.ietf.org/html/rfc2136">RFC2136</a>.
75       */
76      public static final DnsResponseCode NOTAUTH = new DnsResponseCode(9, "NotAuth");
77  
78      /**
79       * The 'NotZone' DNS RCODE (10), as defined in <a href="https://tools.ietf.org/html/rfc2136">RFC2136</a>.
80       */
81      public static final DnsResponseCode NOTZONE = new DnsResponseCode(10, "NotZone");
82  
83      /**
84       * The 'BADVERS' or 'BADSIG' DNS RCODE (16), as defined in <a href="https://tools.ietf.org/html/rfc2671">RFC2671</a>
85       * and <a href="https://tools.ietf.org/html/rfc2845">RFC2845</a>.
86       */
87      public static final DnsResponseCode BADVERS_OR_BADSIG = new DnsResponseCode(16, "BADVERS_OR_BADSIG");
88  
89      /**
90       * The 'BADKEY' DNS RCODE (17), as defined in <a href="https://tools.ietf.org/html/rfc2845">RFC2845</a>.
91       */
92      public static final DnsResponseCode BADKEY = new DnsResponseCode(17, "BADKEY");
93  
94      /**
95       * The 'BADTIME' DNS RCODE (18), as defined in <a href="https://tools.ietf.org/html/rfc2845">RFC2845</a>.
96       */
97      public static final DnsResponseCode BADTIME = new DnsResponseCode(18, "BADTIME");
98  
99      /**
100      * The 'BADMODE' DNS RCODE (19), as defined in <a href="https://tools.ietf.org/html/rfc2930">RFC2930</a>.
101      */
102     public static final DnsResponseCode BADMODE = new DnsResponseCode(19, "BADMODE");
103 
104     /**
105      * The 'BADNAME' DNS RCODE (20), as defined in <a href="https://tools.ietf.org/html/rfc2930">RFC2930</a>.
106      */
107     public static final DnsResponseCode BADNAME = new DnsResponseCode(20, "BADNAME");
108 
109     /**
110      * The 'BADALG' DNS RCODE (21), as defined in <a href="https://tools.ietf.org/html/rfc2930">RFC2930</a>.
111      */
112     public static final DnsResponseCode BADALG = new DnsResponseCode(21, "BADALG");
113 
114     /**
115      * Returns the {@link DnsResponseCode} that corresponds with the given {@code responseCode}.
116      *
117      * @param responseCode the DNS RCODE
118      *
119      * @return the corresponding {@link DnsResponseCode}
120      */
121     public static DnsResponseCode valueOf(int responseCode) {
122         switch (responseCode) {
123         case 0:
124             return NOERROR;
125         case 1:
126             return FORMERR;
127         case 2:
128             return SERVFAIL;
129         case 3:
130             return NXDOMAIN;
131         case 4:
132             return NOTIMP;
133         case 5:
134             return REFUSED;
135         case 6:
136             return YXDOMAIN;
137         case 7:
138             return YXRRSET;
139         case 8:
140             return NXRRSET;
141         case 9:
142             return NOTAUTH;
143         case 10:
144             return NOTZONE;
145         case 16:
146             return BADVERS_OR_BADSIG;
147         case 17:
148             return BADKEY;
149         case 18:
150             return BADTIME;
151         case 19:
152             return BADMODE;
153         case 20:
154             return BADNAME;
155         case 21:
156             return BADALG;
157         default:
158             return new DnsResponseCode(responseCode);
159         }
160     }
161 
162     private final int code;
163     private final String name;
164     private String text;
165 
166     private DnsResponseCode(int code) {
167         this(code, "UNKNOWN");
168     }
169 
170     public DnsResponseCode(int code, String name) {
171         if (code < 0 || code > 65535) {
172             throw new IllegalArgumentException("code: " + code + " (expected: 0 ~ 65535)");
173         }
174 
175         this.code = code;
176         this.name = requireNonNull(name, "name");
177     }
178 
179     /**
180      * Returns the error code for this {@link DnsResponseCode}.
181      */
182     public int intValue() {
183         return code;
184     }
185 
186     @Override
187     public int compareTo(DnsResponseCode o) {
188         return intValue() - o.intValue();
189     }
190 
191     @Override
192     public int hashCode() {
193         return intValue();
194     }
195 
196     /**
197      * Equality of {@link DnsResponseCode} only depends on {@link #intValue()}.
198      */
199     @Override
200     public boolean equals(Object o) {
201         if (!(o instanceof DnsResponseCode)) {
202             return false;
203         }
204 
205         return intValue() == ((DnsResponseCode) o).intValue();
206     }
207 
208     /**
209      * Returns a formatted error message for this {@link DnsResponseCode}.
210      */
211     @Override
212     public String toString() {
213         String text = this.text;
214         if (text == null) {
215             this.text = text = name + '(' + intValue() + ')';
216         }
217         return text;
218     }
219 }