aboutsummaryrefslogtreecommitdiff
path: root/server.go
diff options
context:
space:
mode:
authorGravatar Y.Horie <u5.horie@gmail.com> 2022-06-21 04:42:05 +0900
committerGravatar GitHub <noreply@github.com> 2022-06-20 21:42:05 +0200
commitbc24f9d68352215b1f4aa6bddbffacd42cea8f73 (patch)
tree8655d26014967c96fe811fea6cc8d1f5667ecea2 /server.go
parentAdd `ConnPoolStrategy` field to client (#1317) (diff)
downloadfasthttp-bc24f9d68352215b1f4aa6bddbffacd42cea8f73.tar.gz
fasthttp-bc24f9d68352215b1f4aa6bddbffacd42cea8f73.tar.bz2
fasthttp-bc24f9d68352215b1f4aa6bddbffacd42cea8f73.zip
Consolidate TCPKeepalive in server.Serve (#1320) (#1324)
Diffstat (limited to 'server.go')
-rw-r--r--server.go71
1 files changed, 21 insertions, 50 deletions
diff --git a/server.go b/server.go
index 5e10887..3c90455 100644
--- a/server.go
+++ b/server.go
@@ -1554,34 +1554,6 @@ func (s *Server) getNextProto(c net.Conn) (proto string, err error) {
return
}
-// tcpKeepAliveListener sets TCP keep-alive timeouts on accepted
-// connections. It's used by ListenAndServe, ListenAndServeTLS and
-// ListenAndServeTLSEmbed so dead TCP connections (e.g. closing laptop mid-download)
-// eventually go away.
-type tcpKeepaliveListener struct {
- *net.TCPListener
- keepalive bool
- keepalivePeriod time.Duration
-}
-
-func (ln tcpKeepaliveListener) Accept() (net.Conn, error) {
- tc, err := ln.AcceptTCP()
- if err != nil {
- return nil, err
- }
- if err := tc.SetKeepAlive(ln.keepalive); err != nil {
- tc.Close() //nolint:errcheck
- return nil, err
- }
- if ln.keepalivePeriod > 0 {
- if err := tc.SetKeepAlivePeriod(ln.keepalivePeriod); err != nil {
- tc.Close() //nolint:errcheck
- return nil, err
- }
- }
- return tc, nil
-}
-
// ListenAndServe serves HTTP requests from the given TCP4 addr.
//
// Pass custom listener to Serve if you need listening on non-TCP4 media
@@ -1593,13 +1565,6 @@ func (s *Server) ListenAndServe(addr string) error {
if err != nil {
return err
}
- if tcpln, ok := ln.(*net.TCPListener); ok {
- return s.Serve(tcpKeepaliveListener{
- TCPListener: tcpln,
- keepalive: s.TCPKeepalive,
- keepalivePeriod: s.TCPKeepalivePeriod,
- })
- }
return s.Serve(ln)
}
@@ -1638,13 +1603,6 @@ func (s *Server) ListenAndServeTLS(addr, certFile, keyFile string) error {
if err != nil {
return err
}
- if tcpln, ok := ln.(*net.TCPListener); ok {
- return s.ServeTLS(tcpKeepaliveListener{
- TCPListener: tcpln,
- keepalive: s.TCPKeepalive,
- keepalivePeriod: s.TCPKeepalivePeriod,
- }, certFile, keyFile)
- }
return s.ServeTLS(ln, certFile, keyFile)
}
@@ -1664,13 +1622,6 @@ func (s *Server) ListenAndServeTLSEmbed(addr string, certData, keyData []byte) e
if err != nil {
return err
}
- if tcpln, ok := ln.(*net.TCPListener); ok {
- return s.ServeTLSEmbed(tcpKeepaliveListener{
- TCPListener: tcpln,
- keepalive: s.TCPKeepalive,
- keepalivePeriod: s.TCPKeepalivePeriod,
- }, certData, keyData)
- }
return s.ServeTLSEmbed(ln, certData, keyData)
}
@@ -1910,7 +1861,27 @@ func (s *Server) Shutdown() error {
func acceptConn(s *Server, ln net.Listener, lastPerIPErrorTime *time.Time) (net.Conn, error) {
for {
- c, err := ln.Accept()
+ var c net.Conn
+ var err error
+ if tl, ok := ln.(*net.TCPListener); ok && s.TCPKeepalive {
+ tc, err := tl.AcceptTCP()
+ if err != nil {
+ return nil, err
+ }
+ if err := tc.SetKeepAlive(s.TCPKeepalive); err != nil {
+ tc.Close() //nolint:errcheck
+ return nil, err
+ }
+ if s.TCPKeepalivePeriod > 0 {
+ if err := tc.SetKeepAlivePeriod(s.TCPKeepalivePeriod); err != nil {
+ tc.Close() //nolint:errcheck
+ return nil, err
+ }
+ }
+ c = tc
+ } else {
+ c, err = ln.Accept()
+ }
if err != nil {
if c != nil {
panic("BUG: net.Listener returned non-nil conn and non-nil error")