summaryrefslogtreecommitdiff
path: root/app/listener.go
diff options
context:
space:
mode:
Diffstat (limited to 'app/listener.go')
-rw-r--r--app/listener.go37
1 files changed, 37 insertions, 0 deletions
diff --git a/app/listener.go b/app/listener.go
new file mode 100644
index 0000000..a4236d8
--- /dev/null
+++ b/app/listener.go
@@ -0,0 +1,37 @@
+// Instead of using the default new.Listener this file will construct a custom
+// one. The main purpose for this is to have more control over the settings
+// (like keep-alive) and to retrieve the assigned port when using port 0.
+
+package app
+
+import (
+ "fmt"
+ "net"
+ "time"
+)
+
+func newListener(cfg *ServerConfig) (net.Listener, error) {
+ addr := fmt.Sprintf("%s:%d", cfg.Host, cfg.Port)
+ ln, err := net.Listen("tcp", addr)
+ if err != nil {
+ return nil, err
+ }
+ // set actual port on config object (in case original port was 0)
+ cfg.Port = ln.Addr().(*net.TCPAddr).Port
+ return tcpListener{ln.(*net.TCPListener)}, nil
+}
+
+// custom TCP listener with keep-alive timeout
+type tcpListener struct {
+ *net.TCPListener
+}
+
+func (ln tcpListener) Accept() (net.Conn, error) {
+ tc, err := ln.AcceptTCP()
+ if err != nil {
+ return nil, err
+ }
+ tc.SetKeepAlive(true)
+ tc.SetKeepAlivePeriod(3 * time.Minute)
+ return tc, nil
+}