From b9c528f99c536ec071b0ea2ea852a9b6e316cb33 Mon Sep 17 00:00:00 2001 From: Michael Haro Date: Tue, 5 May 2015 23:20:46 -0700 Subject: [PATCH] Keep Exchange as it was, but still check ID. --- client.go | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/client.go b/client.go index 49a24a96..0234a524 100644 --- a/client.go +++ b/client.go @@ -46,9 +46,30 @@ type Client struct { // co.Close() // func Exchange(m *Msg, a string) (r *Msg, err error) { - c := Client{} - r, _, err = c.Exchange(m, a) - return + var co *Conn + co, err = DialTimeout("udp", a, dnsTimeout) + if err != nil { + return nil, err + } + + defer co.Close() + co.SetReadDeadline(time.Now().Add(dnsTimeout)) + co.SetWriteDeadline(time.Now().Add(dnsTimeout)) + + opt := m.IsEdns0() + // If EDNS0 is used use that for size. + if opt != nil && opt.UDPSize() >= MinMsgSize { + co.UDPSize = opt.UDPSize() + } + + if err = co.WriteMsg(m); err != nil { + return nil, err + } + r, err = co.ReadMsg() + if err == nil && r.Id != m.Id { + err = ErrId + } + return r, err } // ExchangeConn performs a synchronous query. It sends the message m via the connection