@@ -197,12 +197,13 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, d internet.
197
197
if isIPQuery {
198
198
if domain , err := strmatcher .ToDomain (domain ); err == nil {
199
199
go h .handleIPQuery (id , qType , domain , writer )
200
- continue
200
+ } else {
201
+ h .handleDNSError (id , dnsmessage .RCodeFormatError , writer )
201
202
}
203
+ } else {
204
+ h .handleDNSError (id , dnsmessage .RCodeNotImplemented , writer )
202
205
}
203
- }
204
-
205
- if err := connWriter .WriteMessage (b ); err != nil {
206
+ } else if err := connWriter .WriteMessage (b ); err != nil {
206
207
return err
207
208
}
208
209
}
@@ -296,6 +297,35 @@ func (h *Handler) handleIPQuery(id uint16, qType dnsmessage.Type, domain string,
296
297
}
297
298
}
298
299
300
+ func (h * Handler ) handleDNSError (id uint16 , rCode dnsmessage.RCode , writer dns_proto.MessageWriter ) {
301
+ var err error
302
+
303
+ b := buf .New ()
304
+ rawBytes := b .Extend (buf .Size )
305
+ builder := dnsmessage .NewBuilder (rawBytes [:0 ], dnsmessage.Header {
306
+ ID : id ,
307
+ RCode : rCode ,
308
+ RecursionAvailable : true ,
309
+ RecursionDesired : true ,
310
+ Response : true ,
311
+ })
312
+ builder .EnableCompression ()
313
+ common .Must (builder .StartQuestions ())
314
+ common .Must (builder .StartAnswers ())
315
+
316
+ msgBytes , err := builder .Finish ()
317
+ if err != nil {
318
+ newError ("pack message" ).Base (err ).WriteToLog ()
319
+ b .Release ()
320
+ return
321
+ }
322
+ b .Resize (0 , int32 (len (msgBytes )))
323
+
324
+ if err := writer .WriteMessage (b ); err != nil {
325
+ newError ("write IP answer" ).Base (err ).WriteToLog ()
326
+ }
327
+ }
328
+
299
329
type outboundConn struct {
300
330
access sync.Mutex
301
331
dialer func () (internet.Connection , error )
0 commit comments