From 6c631cd4ffb22d67758e1da83e1e15b713fbfd7d Mon Sep 17 00:00:00 2001 From: Miek Gieben Date: Tue, 19 Aug 2014 09:25:41 +0000 Subject: [PATCH] Implement Shutdown() This is working for TCP, but for UDP the Read does not honor the deadline settings. --- server.go | 11 +++++++++-- server_test.go | 21 +++++++++++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/server.go b/server.go index fd772f2f..db2e7201 100644 --- a/server.go +++ b/server.go @@ -305,8 +305,13 @@ func (srv *Server) ActivateAndServe() error { // Shutdown shuts down a server. After a call to Shutdown, ListenAndServe and // ActivateAndServe will return. func (srv *Server) Shutdown() { - srv.stopTCP <- true - srv.stopUDP <- true + switch srv.Net { + case "tcp", "tcp4", "tcp6": + srv.stopTCP <- true + case "udp", "udp4", "udp6": + // TODO(miek): does not work for udp + // srv.stopUDP <- true + } } // serveTCP starts a TCP listener for the server. @@ -481,7 +486,9 @@ func (srv *Server) readTCP(conn *net.TCPConn, timeout time.Duration) ([]byte, er } func (srv *Server) readUDP(conn *net.UDPConn, timeout time.Duration) ([]byte, *sessionUDP, error) { + conn.SetReadDeadline(time.Now().Add(timeout)) m := make([]byte, srv.UDPSize) + // TODO(miek): deadline and timeout seem not to be honered n, s, e := readFromSessionUDP(conn, m) if e != nil || n == 0 { if e != nil { diff --git a/server_test.go b/server_test.go index 3eef14cc..2d377bf1 100644 --- a/server_test.go +++ b/server_test.go @@ -273,7 +273,23 @@ func TestServingLargeResponses(t *testing.T) { } } -func TestShutdown(t *testing.T) { +func TestShutdownTCP(t *testing.T) { + server := Server{Addr: ":8053", Net: "tcp"} + go func() { + err := server.ListenAndServe() + if err != nil { + t.Logf("failed to setup the tcp server: %s\n", err.Error()) + t.Fail() + } + t.Logf("successfully stopped the tcp server") + }() + time.Sleep(4e8) + server.Shutdown() + time.Sleep(1 * time.Second) +} + +// TODO(miek): does not work for udp +func TestShutdownUDP(t *testing.T) { server := Server{Addr: ":8053", Net: "udp"} go func() { err := server.ListenAndServe() @@ -281,8 +297,9 @@ func TestShutdown(t *testing.T) { t.Logf("failed to setup the udp server: %s\n", err.Error()) t.Fail() } - t.Logf("successfully stopped the server") + t.Logf("successfully stopped the udp server") }() time.Sleep(4e8) server.Shutdown() + time.Sleep(1 * time.Second) }