net: change SetTimeout to SetDeadline
Previously, a timeout (in int64 nanoseconds) applied to a granularity even smaller than one operation: a 100 byte read with a 1 second timeout could take 100 seconds, if the bytes all arrived on the network 1 second apart. This was confusing. Rather than making the timeout granularity be per-Read/Write, this CL makes callers set an absolute deadline (in time.Time) after which operations will fail. This makes it possible to set deadlines at higher levels, without knowing exactly how many read/write operations will happen in e.g. reading an HTTP request. Fixes #2723 R=r, rsc, dave CC=golang-dev https://golang.org/cl/5555048
This commit is contained in:
parent
68c583995c
commit
afedc6a568
26
conn.go
26
conn.go
@ -15,6 +15,7 @@ import (
|
||||
"io"
|
||||
"net"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
// A Conn represents a secured connection.
|
||||
@ -86,24 +87,23 @@ func (c *Conn) RemoteAddr() net.Addr {
|
||||
return c.conn.RemoteAddr()
|
||||
}
|
||||
|
||||
// SetTimeout sets the read deadline associated with the connection.
|
||||
// SetDeadline sets the read deadline associated with the connection.
|
||||
// There is no write deadline.
|
||||
func (c *Conn) SetTimeout(nsec int64) error {
|
||||
return c.conn.SetTimeout(nsec)
|
||||
// A zero value for t means Read will not time out.
|
||||
func (c *Conn) SetDeadline(t time.Time) error {
|
||||
return c.conn.SetDeadline(t)
|
||||
}
|
||||
|
||||
// SetReadTimeout sets the time (in nanoseconds) that
|
||||
// Read will wait for data before returning a net.Error
|
||||
// with Timeout() == true.
|
||||
// Setting nsec == 0 (the default) disables the deadline.
|
||||
func (c *Conn) SetReadTimeout(nsec int64) error {
|
||||
return c.conn.SetReadTimeout(nsec)
|
||||
// SetReadDeadline sets the read deadline on the underlying connection.
|
||||
// A zero value for t means Read will not time out.
|
||||
func (c *Conn) SetReadDeadline(t time.Time) error {
|
||||
return c.conn.SetReadDeadline(t)
|
||||
}
|
||||
|
||||
// SetWriteTimeout exists to satisfy the net.Conn interface
|
||||
// SetWriteDeadline exists to satisfy the net.Conn interface
|
||||
// but is not implemented by TLS. It always returns an error.
|
||||
func (c *Conn) SetWriteTimeout(nsec int64) error {
|
||||
return errors.New("TLS does not support SetWriteTimeout")
|
||||
func (c *Conn) SetWriteDeadline(t time.Time) error {
|
||||
return errors.New("TLS does not support SetWriteDeadline")
|
||||
}
|
||||
|
||||
// A halfConn represents one direction of the record layer
|
||||
@ -744,7 +744,7 @@ func (c *Conn) Write(b []byte) (n int, err error) {
|
||||
}
|
||||
|
||||
// Read can be made to time out and return a net.Error with Timeout() == true
|
||||
// after a fixed time limit; see SetTimeout and SetReadTimeout.
|
||||
// after a fixed time limit; see SetDeadline and SetReadDeadline.
|
||||
func (c *Conn) Read(b []byte) (n int, err error) {
|
||||
if err = c.Handshake(); err != nil {
|
||||
return
|
||||
|
Loading…
Reference in New Issue
Block a user