-
-
Save artyom/10259100 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package nettimeout | |
import ( | |
"net" | |
"time" | |
) | |
// Listener wraps a net.Listener, and gives a place to store the timeout | |
// parameters. On Accept, it will wrap the net.Conn with our own Conn for us. | |
type Listener struct { | |
net.Listener | |
ReadTimeout time.Duration | |
WriteTimeout time.Duration | |
} | |
func (l *Listener) Accept() (net.Conn, error) { | |
c, err := l.Listener.Accept() | |
if err != nil { | |
return nil, err | |
} | |
tc := &Conn{ | |
Conn: c, | |
ReadTimeout: l.ReadTimeout, | |
WriteTimeout: l.WriteTimeout, | |
} | |
return tc, nil | |
} | |
// Conn wraps a net.Conn, and sets a deadline for every read | |
// and write operation. | |
type Conn struct { | |
net.Conn | |
ReadTimeout time.Duration | |
WriteTimeout time.Duration | |
} | |
func (c *Conn) Read(b []byte) (int, error) { | |
err := c.Conn.SetReadDeadline(time.Now().Add(c.ReadTimeout)) | |
if err != nil { | |
return 0, err | |
} | |
return c.Conn.Read(b) | |
} | |
func (c *Conn) Write(b []byte) (int, error) { | |
err := c.Conn.SetWriteDeadline(time.Now().Add(c.WriteTimeout)) | |
if err != nil { | |
return 0, err | |
} | |
return c.Conn.Write(b) | |
} | |
func NewListener(addr string, readTimeout, writeTimeout time.Duration) (net.Listener, error) { | |
l, err := net.Listen("tcp", addr) | |
if err != nil { | |
return nil, err | |
} | |
tl := &Listener{ | |
Listener: l, | |
ReadTimeout: readTimeout, | |
WriteTimeout: writeTimeout, | |
} | |
return tl, nil | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment