package main import ( "fmt" "log" "net" "time" ) type empty struct{} type protoHandler func(net.Conn, time.Duration) func protocolHandler(proto string) (protoHandler, uint16, error) { switch proto { case "ssh": return sshHandler, 22, nil case "http": return httpHandler, 80, nil default: return nil, 0, fmt.Errorf("unknown protocol '%s'", proto) } } func connHandler(proto string, handler protoHandler, conn net.Conn, delay time.Duration) { defer conn.Close() start := time.Now() log.Printf("%s handling %s", conn.RemoteAddr().String(), proto) handler(conn, delay) duration := time.Since(start) log.Printf("%s ended %s lasted for %s", conn.RemoteAddr().String(), proto, duration) }