graceful/graceful.go
2016-09-06 19:55:16 +02:00

53 lines
1 KiB
Go

// Package graceful provides a graceful tcp handling library
package graceful
import (
"errors"
"net"
"time"
)
const network = "tcp"
var ErrInterfaceConversion = errors.New("interface conversion failed")
// Listener is a wrapper for net.TCPListener
type Listener struct {
*net.TCPListener
keepAlive time.Duration
}
// New wraps Listener around net.TCPListener
func New(laddr string, keepAlive time.Duration) (*Listener, error) {
l, err := net.Listen(network, laddr)
if err != nil {
return nil, err
}
tcpl, ok := l.(*net.TCPListener)
if !ok {
return nil, ErrInterfaceConversion
}
return &Listener{
TCPListener: tcpl,
keepAlive: keepAlive,
}, nil
}
// Accept wraps net.TCPListener.AcceptTCP method
func (l *Listener) Accept() (net.Conn, error) {
conn, err := l.AcceptTCP()
if err != nil {
return conn, err
}
if l.keepAlive > 0 {
conn.SetKeepAlive(true)
conn.SetKeepAlivePeriod(l.keepAlive)
}
return conn, nil
}
// Stop stops the listener
func (l *Listener) Stop() {
l.TCPListener.Close()
}