It compiles again, but doesnt work yet
This commit is contained in:
parent
172331a23f
commit
c7dbb1edc2
139
server.go
139
server.go
|
@ -7,7 +7,7 @@
|
||||||
package dns
|
package dns
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
// "io"
|
||||||
"os"
|
"os"
|
||||||
"net"
|
"net"
|
||||||
)
|
)
|
||||||
|
@ -16,8 +16,9 @@ type Handler interface {
|
||||||
ServeDNS(w ResponseWriter, r *Msg)
|
ServeDNS(w ResponseWriter, r *Msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// You can ofcourse make YOUR OWN RESPONSE WRITTER that
|
// TODO(mg): fit axfr responses in here too
|
||||||
// uses TSIG an other cool stuff
|
// A ResponseWriter interface is used by an DNS handler to
|
||||||
|
// construct an DNS response.
|
||||||
type ResponseWriter interface {
|
type ResponseWriter interface {
|
||||||
// RemoteAddr returns the address of the client that sent the current request
|
// RemoteAddr returns the address of the client that sent the current request
|
||||||
RemoteAddr() string
|
RemoteAddr() string
|
||||||
|
@ -34,15 +35,18 @@ type ResponseWriter interface {
|
||||||
|
|
||||||
type conn struct {
|
type conn struct {
|
||||||
remoteAddr net.Addr // address of remote side (sans port)
|
remoteAddr net.Addr // address of remote side (sans port)
|
||||||
|
port int // port of the remote side
|
||||||
handler Handler // request handler
|
handler Handler // request handler
|
||||||
request []byte // bytes read
|
request []byte // bytes read
|
||||||
connUDP *net.UDPConn
|
_UDP *net.UDPConn // i/o connection if UDP was used
|
||||||
connTCP *net.TCPConn
|
_TCP *net.TCPConn // i/o connection if TCP was used
|
||||||
|
hijacked bool // connection has been hijacked by hander TODO(mg)
|
||||||
}
|
}
|
||||||
|
|
||||||
type response struct {
|
type response struct {
|
||||||
conn *conn
|
conn *conn
|
||||||
req *Msg
|
req *Msg
|
||||||
|
xfr bool // {i/a}xfr was requested
|
||||||
}
|
}
|
||||||
|
|
||||||
// ServeMux is an DNS request multiplexer. It matches the
|
// ServeMux is an DNS request multiplexer. It matches the
|
||||||
|
@ -139,44 +143,6 @@ func ListenAndServe(addr string, network string, handler Handler) os.Error {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListenAndServerTCP listens on the TCP network address addr and
|
|
||||||
// then calls HandleTCP with f to handle requests on incoming
|
|
||||||
// connections. The function f may not be nil.
|
|
||||||
func ListenAndServeTCP(addr string, f func(*Conn, *Msg)) os.Error {
|
|
||||||
if f == nil {
|
|
||||||
return ErrHandle
|
|
||||||
}
|
|
||||||
a, err := net.ResolveTCPAddr(addr)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
l, err := net.ListenTCP("tcp", a)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
err = HandleTCP(l, f)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListenAndServerUDP listens on the UDP network address addr and
|
|
||||||
// then calls HandleUDP with f to handle requests on incoming
|
|
||||||
// connections. The function f may not be nil.
|
|
||||||
func ListenAndServeUDP(addr string, f func(*Conn, *Msg)) os.Error {
|
|
||||||
if f == nil {
|
|
||||||
return &Error{Error: "The handle function may not be nil"}
|
|
||||||
}
|
|
||||||
a, err := net.ResolveUDPAddr(addr)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
l, err := net.ListenUDP("udp", a)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
err = HandleUDP(l, f)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func zoneMatch(pattern, zone string) bool {
|
func zoneMatch(pattern, zone string) bool {
|
||||||
if len(pattern) == 0 {
|
if len(pattern) == 0 {
|
||||||
return false
|
return false
|
||||||
|
@ -230,13 +196,22 @@ func HandleFunc(pattern string, handler func(ResponseWriter, *Msg)) {
|
||||||
DefaultServeMux.HandleFunc(pattern, handler)
|
DefaultServeMux.HandleFunc(pattern, handler)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Serve accepts incoming DNS request on the listener l,
|
// Serve accepts incoming DNS request on the TCP listener l,
|
||||||
// creating a new service thread for each. The service threads
|
// creating a new service thread for each. The service threads
|
||||||
// read requests and then call handler to reply to them.
|
// read requests and then call handler to reply to them.
|
||||||
// Handler is typically nil, in which case the DefaultServeMux is used.
|
// Handler is typically nil, in which case the DefaultServeMux is used.
|
||||||
func Serve(l net.Listener, handler Handler) os.Error {
|
func ServeTCP(l *net.TCPListener, handler Handler) os.Error {
|
||||||
srv := &Server{Handler: handler}
|
srv := &Server{Handler: handler, Network: "tcp"}
|
||||||
return srv.Serve(l)
|
return srv.ServeTCP(l)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Serve accepts incoming DNS request on the UDP Conn l,
|
||||||
|
// creating a new service thread for each. The service threads
|
||||||
|
// read requests and then call handler to reply to them.
|
||||||
|
// Handler is typically nil, in which case the DefaultServeMux is used.
|
||||||
|
func ServeUDP(l *net.UDPConn, handler Handler) os.Error {
|
||||||
|
srv := &Server{Handler: handler, Network: "udp"}
|
||||||
|
return srv.ServeUDP(l)
|
||||||
}
|
}
|
||||||
|
|
||||||
// A Server defines parameters for running an HTTP server.
|
// A Server defines parameters for running an HTTP server.
|
||||||
|
@ -285,6 +260,7 @@ func (srv *Server) ServeTCP(l *net.TCPListener) os.Error {
|
||||||
if handler == nil {
|
if handler == nil {
|
||||||
handler = DefaultServeMux
|
handler = DefaultServeMux
|
||||||
}
|
}
|
||||||
|
forever:
|
||||||
for {
|
for {
|
||||||
rw, e := l.AcceptTCP()
|
rw, e := l.AcceptTCP()
|
||||||
if e != nil {
|
if e != nil {
|
||||||
|
@ -296,9 +272,30 @@ func (srv *Server) ServeTCP(l *net.TCPListener) os.Error {
|
||||||
if srv.WriteTimeout != 0 {
|
if srv.WriteTimeout != 0 {
|
||||||
rw.SetWriteTimeout(srv.WriteTimeout)
|
rw.SetWriteTimeout(srv.WriteTimeout)
|
||||||
}
|
}
|
||||||
m := read /* read and set the buffer */
|
l := make([]byte, 2)
|
||||||
d, err := newConn(rw, nil, rw.RemoteAddr(), nil, handler)
|
n, err := rw.Read(l)
|
||||||
d.ReadReqest()
|
if err != nil || n != 2 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
length, _ := unpackUint16(l, 0)
|
||||||
|
if length == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
m := make([]byte, int(length))
|
||||||
|
n, err = rw.Read(m[:int(length)])
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
i := n
|
||||||
|
for i < int(length) {
|
||||||
|
j, err := rw.Read(m[i:int(length)])
|
||||||
|
if err != nil {
|
||||||
|
continue forever
|
||||||
|
}
|
||||||
|
i += j
|
||||||
|
}
|
||||||
|
n = i
|
||||||
|
d, err := newConn(rw, nil, rw.RemoteAddr(), m, handler)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -315,19 +312,19 @@ func (srv *Server) ServeUDP(l *net.UDPConn) os.Error {
|
||||||
}
|
}
|
||||||
for {
|
for {
|
||||||
m := make([]byte, DefaultMsgSize)
|
m := make([]byte, DefaultMsgSize)
|
||||||
c, a, e := l.ReadFromUDP()
|
n, a, e := l.ReadFromUDP(m)
|
||||||
if e != nil {
|
if e != nil {
|
||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
m = m[:n]
|
m = m[:n]
|
||||||
|
|
||||||
if srv.ReadTimeout != 0 {
|
if srv.ReadTimeout != 0 {
|
||||||
rw.SetReadTimeout(srv.ReadTimeout)
|
l.SetReadTimeout(srv.ReadTimeout)
|
||||||
}
|
}
|
||||||
if srv.WriteTimeout != 0 {
|
if srv.WriteTimeout != 0 {
|
||||||
rw.SetWriteTimeout(srv.WriteTimeout)
|
l.SetWriteTimeout(srv.WriteTimeout)
|
||||||
}
|
}
|
||||||
d, err := newConn(rw, nil, addr, m, handler)
|
d, err := newConn(nil, l, a, m, handler)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -339,19 +336,45 @@ func (srv *Server) ServeUDP(l *net.UDPConn) os.Error {
|
||||||
func newConn(t *net.TCPConn, u *net.UDPConn, a net.Addr, buf []byte, handler Handler) (c *conn, err os.Error) {
|
func newConn(t *net.TCPConn, u *net.UDPConn, a net.Addr, buf []byte, handler Handler) (c *conn, err os.Error) {
|
||||||
c = new(conn)
|
c = new(conn)
|
||||||
c.handler = handler
|
c.handler = handler
|
||||||
c.TCPconn = t
|
c._TCP = t
|
||||||
c.UDPconn = u
|
c._UDP = u
|
||||||
c.RemoteAddr = a
|
c.remoteAddr = a
|
||||||
|
c.request = buf
|
||||||
|
if t != nil {
|
||||||
|
c.port = a.(*net.TCPAddr).Port
|
||||||
|
}
|
||||||
|
if u != nil {
|
||||||
|
c.port = a.(*net.UDPAddr).Port
|
||||||
|
}
|
||||||
return c, err
|
return c, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Close the connection.
|
||||||
|
func (c *conn) close() {
|
||||||
|
switch {
|
||||||
|
case c._UDP != nil:
|
||||||
|
c._UDP.Close()
|
||||||
|
c._UDP = nil
|
||||||
|
case c._TCP != nil:
|
||||||
|
c._TCP.Close()
|
||||||
|
c._TCP = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Serve a new connection.
|
||||||
func (c *conn) serve() {
|
func (c *conn) serve() {
|
||||||
// c.ReadRequest
|
// c.ReadRequest
|
||||||
|
|
||||||
// c.Handler.ServeDNS(w, w.req) // this does the writing
|
// c.Handler.ServeDNS(w, w.req) // this does the writing
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *conn) ReadRequest() (w *response, err os.Error) {
|
|
||||||
|
func (c *conn) readRequest() (w *response, err os.Error) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
w = new(response)
|
w = new(response)
|
||||||
return w, nil
|
return w, nil
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue