Flatten goroutine inside goroutine in Transfer.In (#890)

* Flatten goroutine inside goroutine in Transfer.In

* Return an error for unknown question types

Previously this would just be silently ignored leaving nothing to close
the returned channel or return an error.
This commit is contained in:
Tom Thorogood 2019-01-04 18:44:40 +10:30 committed by Miek Gieben
parent 09499bd07f
commit 34be74deeb
1 changed files with 16 additions and 10 deletions

26
xfr.go
View File

@ -35,30 +35,36 @@ type Transfer struct {
// channel, err := transfer.In(message, master) // channel, err := transfer.In(message, master)
// //
func (t *Transfer) In(q *Msg, a string) (env chan *Envelope, err error) { func (t *Transfer) In(q *Msg, a string) (env chan *Envelope, err error) {
switch q.Question[0].Qtype {
case TypeAXFR, TypeIXFR:
default:
return nil, &Error{"unsupported question type"}
}
timeout := dnsTimeout timeout := dnsTimeout
if t.DialTimeout != 0 { if t.DialTimeout != 0 {
timeout = t.DialTimeout timeout = t.DialTimeout
} }
if t.Conn == nil { if t.Conn == nil {
t.Conn, err = DialTimeout("tcp", a, timeout) t.Conn, err = DialTimeout("tcp", a, timeout)
if err != nil { if err != nil {
return nil, err return nil, err
} }
} }
if err := t.WriteMsg(q); err != nil { if err := t.WriteMsg(q); err != nil {
return nil, err return nil, err
} }
env = make(chan *Envelope) env = make(chan *Envelope)
go func() { switch q.Question[0].Qtype {
if q.Question[0].Qtype == TypeAXFR { case TypeAXFR:
go t.inAxfr(q, env) go t.inAxfr(q, env)
return case TypeIXFR:
} go t.inIxfr(q, env)
if q.Question[0].Qtype == TypeIXFR { }
go t.inIxfr(q, env)
return
}
}()
return env, nil return env, nil
} }