commit - 554ced8329b2f5a7abf40a2131cf5e869c1e17d4
commit + 521607802a026aae130395eb147b81d480b94e34
blob - 84bb734d39653450ad3e041fc53deb0556863a97
blob + 015729f39f39fb70f98b95524ea9c361113fabc9
--- dns.go
+++ dns.go
}
func exchange(msg dnsmessage.Message, conn net.Conn) (dnsmessage.Message, error) {
- if err := send(msg, conn); err != nil {
+ if err := sendMsg(msg, conn); err != nil {
return dnsmessage.Message{}, err
}
rmsg, err := receive(conn)
return rmsg, nil
}
-func send(msg dnsmessage.Message, conn net.Conn) error {
+func sendMsg(msg dnsmessage.Message, conn net.Conn) error {
packed, err := msg.Pack()
if err != nil {
return err
}
+ _, err = send(packed, conn)
+ return err
+}
+
+func send(p []byte, conn net.Conn) (int, error) {
if _, ok := conn.(net.PacketConn); ok {
- if _, err := conn.Write(packed); err != nil {
- return err
- }
- return nil
+ return conn.Write(p)
}
// DNS over TCP requires you to prepend the message with a
// 2-octet length field.
- l := len(packed)
+ l := len(p)
m := make([]byte, 2+l)
m[0] = byte(l >> 8)
m[1] = byte(l)
- copy(m[2:], packed)
- if _, err := conn.Write(m); err != nil {
- return err
- }
- return nil
+ copy(m[2:], p)
+ return conn.Write(m)
}
-func sendPacket(msg dnsmessage.Message, conn net.PacketConn, addr net.Addr) error {
+func sendMsgTo(msg dnsmessage.Message, conn net.PacketConn, addr net.Addr) error {
packed, err := msg.Pack()
if err != nil {
return err
blob - f466d64cb021a02fb3bd2d78a942e323f3a79938
blob + ac93f9f087c23094a08b505f4f7223c263180ef9
--- server.go
+++ server.go
"net"
)
+type Zone struct {
+ Name dnsmessage.Name
+ SOA dnsmessage.SOAResource
+ Resources []dnsmessage.Resource
+}
+
// Server contains settings for running a DNS server. An empty Server
// with a nil Handler is a valid configuration.
type Server struct {
conn net.Conn
}
+func (r *response) Write(p []byte) (n int, err error) {
+ if r.pconn != nil {
+ return r.pconn.WriteTo(p, r.raddr)
+ }
+ return send(p, r.conn)
+}
+
func (r *response) WriteMsg(msg dnsmessage.Message) error {
if r.pconn != nil {
- return sendPacket(msg, r.pconn, r.raddr)
+ return sendMsgTo(msg, r.pconn, r.raddr)
}
- return send(msg, r.conn)
+ return sendMsg(msg, r.conn)
}
// The ResponseWriter interface is used by a Handler to reply to
// DNS requests.
type ResponseWriter interface {
+ // Write writes the data to the underlying connection as a DNS response.
+ Write(p []byte) (n int, err error)
// WriteMsg writes the DNS message to the connection.
WriteMsg(dnsmessage.Message) error
}
var msg dnsmessage.Message
if err := msg.Unpack(buf[:n]); err != nil {
msg.Header.RCode = dnsmessage.RCodeRefused
- sendPacket(msg, conn, raddr)
+ sendMsgTo(msg, conn, raddr)
return
}
resp := &response{raddr: raddr, pconn: conn}