@@ -2216,3 +2216,131 @@ func TestDNSPacketSize(t *testing.T) {
2216
2216
t .Errorf ("lookup failed: %v" , err )
2217
2217
}
2218
2218
}
2219
+
2220
+ func TestLongDNSNames (t * testing.T ) {
2221
+ const longDNSsuffix = ".go.dev."
2222
+ const longDNSsuffixNoEndingDot = ".go.dev"
2223
+
2224
+ var longDNSPrefix = strings .Repeat ("verylongdomainlabel." , 20 )
2225
+
2226
+ var longDNSNamesTests = []struct {
2227
+ req string
2228
+ fail bool
2229
+ }{
2230
+ {req : longDNSPrefix [:255 - len (longDNSsuffix )] + longDNSsuffix , fail : true },
2231
+ {req : longDNSPrefix [:254 - len (longDNSsuffix )] + longDNSsuffix },
2232
+ {req : longDNSPrefix [:253 - len (longDNSsuffix )] + longDNSsuffix },
2233
+
2234
+ {req : longDNSPrefix [:253 - len (longDNSsuffixNoEndingDot )] + longDNSsuffixNoEndingDot },
2235
+ {req : longDNSPrefix [:254 - len (longDNSsuffixNoEndingDot )] + longDNSsuffixNoEndingDot , fail : true },
2236
+ }
2237
+
2238
+ fake := fakeDNSServer {
2239
+ rh : func (_ , _ string , q dnsmessage.Message , _ time.Time ) (dnsmessage.Message , error ) {
2240
+ r := dnsmessage.Message {
2241
+ Header : dnsmessage.Header {
2242
+ ID : q .Header .ID ,
2243
+ Response : true ,
2244
+ RCode : dnsmessage .RCodeSuccess ,
2245
+ },
2246
+ Questions : q .Questions ,
2247
+ Answers : []dnsmessage.Resource {
2248
+ {
2249
+ Header : dnsmessage.ResourceHeader {
2250
+ Name : q .Questions [0 ].Name ,
2251
+ Type : q .Questions [0 ].Type ,
2252
+ Class : dnsmessage .ClassINET ,
2253
+ },
2254
+ },
2255
+ },
2256
+ }
2257
+
2258
+ switch q .Questions [0 ].Type {
2259
+ case dnsmessage .TypeA :
2260
+ r .Answers [0 ].Body = & dnsmessage.AResource {A : TestAddr }
2261
+ case dnsmessage .TypeAAAA :
2262
+ r .Answers [0 ].Body = & dnsmessage.AAAAResource {AAAA : TestAddr6 }
2263
+ case dnsmessage .TypeTXT :
2264
+ r .Answers [0 ].Body = & dnsmessage.TXTResource {TXT : []string {"." }}
2265
+ case dnsmessage .TypeMX :
2266
+ r .Answers [0 ].Body = & dnsmessage.MXResource {
2267
+ MX : dnsmessage .MustNewName ("go.dev." ),
2268
+ }
2269
+ case dnsmessage .TypeNS :
2270
+ r .Answers [0 ].Body = & dnsmessage.NSResource {
2271
+ NS : dnsmessage .MustNewName ("go.dev." ),
2272
+ }
2273
+ case dnsmessage .TypeSRV :
2274
+ r .Answers [0 ].Body = & dnsmessage.SRVResource {
2275
+ Target : dnsmessage .MustNewName ("go.dev." ),
2276
+ }
2277
+ default :
2278
+ panic ("unknown dnsmessage type" )
2279
+ }
2280
+
2281
+ return r , nil
2282
+ },
2283
+ }
2284
+
2285
+ r := & Resolver {PreferGo : true , Dial : fake .DialContext }
2286
+
2287
+ methodTests := []string {"CNAME" , "Host" , "IP" , "IPAddr" , "MX" , "NS" , "NetIP" , "SRV" , "TXT" }
2288
+ query := func (t string , req string ) error {
2289
+ switch t {
2290
+ case "CNAME" :
2291
+ _ , err := r .LookupCNAME (context .Background (), req )
2292
+ return err
2293
+ case "Host" :
2294
+ _ , err := r .LookupHost (context .Background (), req )
2295
+ return err
2296
+ case "IP" :
2297
+ _ , err := r .LookupIP (context .Background (), "ip" , req )
2298
+ return err
2299
+ case "IPAddr" :
2300
+ _ , err := r .LookupIPAddr (context .Background (), req )
2301
+ return err
2302
+ case "MX" :
2303
+ _ , err := r .LookupMX (context .Background (), req )
2304
+ return err
2305
+ case "NS" :
2306
+ _ , err := r .LookupNS (context .Background (), req )
2307
+ return err
2308
+ case "NetIP" :
2309
+ _ , err := r .LookupNetIP (context .Background (), "ip" , req )
2310
+ return err
2311
+ case "SRV" :
2312
+ const service = "service"
2313
+ const proto = "proto"
2314
+ req = req [len (service )+ len (proto )+ 4 :]
2315
+ _ , _ , err := r .LookupSRV (context .Background (), service , proto , req )
2316
+ return err
2317
+ case "TXT" :
2318
+ _ , err := r .LookupTXT (context .Background (), req )
2319
+ return err
2320
+ }
2321
+ panic ("unknown query method" )
2322
+ }
2323
+
2324
+ for i , v := range longDNSNamesTests {
2325
+ for _ , testName := range methodTests {
2326
+ err := query (testName , v .req )
2327
+ if v .fail {
2328
+ if err == nil {
2329
+ t .Errorf ("%v: Lookup%v: unexpected success" , i , testName )
2330
+ break
2331
+ }
2332
+
2333
+ expectedErr := DNSError {Err : errNoSuchHost .Error (), Name : v .req , IsNotFound : true }
2334
+ var dnsErr * DNSError
2335
+ errors .As (err , & dnsErr )
2336
+ if dnsErr == nil || * dnsErr != expectedErr {
2337
+ t .Errorf ("%v: Lookup%v: unexpected error: %v" , i , testName , err )
2338
+ }
2339
+ break
2340
+ }
2341
+ if err != nil {
2342
+ t .Errorf ("%v: Lookup%v: unexpected error: %v" , i , testName , err )
2343
+ }
2344
+ }
2345
+ }
2346
+ }
0 commit comments