mirror of
https://github.com/kataras/iris.git
synced 2026-01-09 13:05:56 +00:00
New iris.WithKeepAlive(time.Duration) Configurator is added as a helper to enable TCP listener featured with keep-alive
This commit is contained in:
@@ -70,6 +70,9 @@ type Supervisor struct {
|
||||
|
||||
// See `iris.Configuration.SocketSharding`.
|
||||
SocketSharding bool
|
||||
// If more than zero then tcp keep alive listener is attached instead of the simple TCP listener.
|
||||
// See `iris.Configuration.KeepAlive`
|
||||
KeepAlive time.Duration
|
||||
}
|
||||
|
||||
// New returns a new host supervisor
|
||||
@@ -141,13 +144,17 @@ func (su *Supervisor) isWaiting() bool {
|
||||
}
|
||||
|
||||
func (su *Supervisor) newListener() (net.Listener, error) {
|
||||
// this will not work on "unix" as network
|
||||
// because UNIX doesn't supports the kind of
|
||||
// restarts we may want for the server.
|
||||
//
|
||||
// User still be able to call .Serve instead.
|
||||
// l, err := netutil.TCPKeepAlive(su.Server.Addr, su.SocketSharding)
|
||||
l, err := netutil.TCP(su.Server.Addr, su.SocketSharding)
|
||||
var (
|
||||
l net.Listener
|
||||
err error
|
||||
)
|
||||
|
||||
if su.KeepAlive > 0 {
|
||||
l, err = netutil.TCPKeepAlive(su.Server.Addr, su.SocketSharding, su.KeepAlive)
|
||||
} else {
|
||||
l, err = netutil.TCP(su.Server.Addr, su.SocketSharding)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ import (
|
||||
// A raw copy of standar library.
|
||||
type tcpKeepAliveListener struct {
|
||||
*net.TCPListener
|
||||
keepAliveDur time.Duration
|
||||
}
|
||||
|
||||
// Accept accepts tcp connections aka clients.
|
||||
@@ -32,7 +33,7 @@ func (l tcpKeepAliveListener) Accept() (net.Conn, error) {
|
||||
if err = tc.SetKeepAlive(true); err != nil {
|
||||
return tc, err
|
||||
}
|
||||
if err = tc.SetKeepAlivePeriod(3 * time.Minute); err != nil {
|
||||
if err = tc.SetKeepAlivePeriod(l.keepAliveDur); err != nil {
|
||||
return tc, err
|
||||
}
|
||||
return tc, nil
|
||||
@@ -49,7 +50,7 @@ func TCP(addr string, reuse bool) (net.Listener, error) {
|
||||
}
|
||||
|
||||
// TCPKeepAlive returns a new tcp keep alive Listener and an error on failure.
|
||||
func TCPKeepAlive(addr string, reuse bool) (ln net.Listener, err error) {
|
||||
func TCPKeepAlive(addr string, reuse bool, keepAliveDur time.Duration) (ln net.Listener, err error) {
|
||||
// if strings.HasPrefix(addr, "127.0.0.1") {
|
||||
// // it's ipv4, use ipv4 tcp listener instead of the default ipv6. Don't.
|
||||
// ln, err = net.Listen("tcp4", addr)
|
||||
@@ -61,7 +62,7 @@ func TCPKeepAlive(addr string, reuse bool) (ln net.Listener, err error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return tcpKeepAliveListener{ln.(*net.TCPListener)}, nil
|
||||
return tcpKeepAliveListener{ln.(*net.TCPListener), keepAliveDur}, nil
|
||||
}
|
||||
|
||||
// UNIX returns a new unix(file) Listener.
|
||||
|
||||
@@ -106,7 +106,7 @@ type DirOptions struct {
|
||||
// See `DirListRich` package-level function too.
|
||||
DirList DirListFunc
|
||||
|
||||
// show hidden files or directories or not when `ShowList` is true
|
||||
// Show hidden files or directories or not when `ShowList` is true.
|
||||
ShowHidden bool
|
||||
|
||||
// Files downloaded and saved locally.
|
||||
|
||||
Reference in New Issue
Block a user