diff --git a/ex/reflect/reflect.go b/ex/reflect/reflect.go index 2ef054b1..097818b6 100644 --- a/ex/reflect/reflect.go +++ b/ex/reflect/reflect.go @@ -91,6 +91,8 @@ func handleReflect(w dns.ResponseWriter, r *dns.Msg) { 3600)`) c <- &dns.XfrToken{RR: []dns.RR{soa, t, rr, soa}} close(c) + w.Hijack() + w.Close() return case dns.TypeTXT: m.Answer = append(m.Answer, t) diff --git a/server.go b/server.go index 88f6a33f..42092c84 100644 --- a/server.go +++ b/server.go @@ -43,12 +43,12 @@ type conn struct { request []byte // bytes read _UDP *net.UDPConn // i/o connection if UDP was used _TCP *net.TCPConn // i/o connection if TCP was used - hijacked bool // connection has been hijacked by hander TODO(mg) tsigSecret map[string]string // the tsig secrets } type response struct { conn *conn + hijacked bool // connection has been hijacked by handler req *Msg tsigStatus error tsigTimersOnly bool @@ -336,7 +336,7 @@ func (c *conn) serve() { } w.req = req c.handler.ServeDNS(w, w.req) // this does the writing back to the client - if c.hijacked { + if w.hijacked { // client takes care of the connection, i.e. calls Close() return } diff --git a/xfr.go b/xfr.go index f7686019..037f53b1 100644 --- a/xfr.go +++ b/xfr.go @@ -156,6 +156,7 @@ func checkXfrSOA(in *Msg, first bool) bool { // c := make(chan *XfrToken) // var e *error // err := XfrSend(w, q, c, e) +// w.Hijack() // for _, rrset := range rrsets { // rrset is a []RR // c <- &{XfrToken{RR: rrset} // if e != nil { @@ -163,6 +164,7 @@ func checkXfrSOA(in *Msg, first bool) bool { // break // } // } +// w.Close() func XfrSend(w ResponseWriter, q *Msg, c chan *XfrToken, e *error) error { switch q.Question[0].Qtype { case TypeAXFR, TypeIXFR: @@ -181,7 +183,6 @@ func axfrSend(w ResponseWriter, req *Msg, c chan *XfrToken, e *error) { rep.MsgHdr.Authoritative = true for x := range c { - println("got some", len(x.RR)) // assume it fits rep.Answer = append(rep.Answer, x.RR...) println(rep.String()) @@ -192,5 +193,4 @@ func axfrSend(w ResponseWriter, req *Msg, c chan *XfrToken, e *error) { w.TsigTimersOnly(true) rep.Answer = nil } - w.Close() // Hijack }