aboutsummaryrefslogtreecommitdiff
path: root/client.go
diff options
context:
space:
mode:
Diffstat (limited to 'client.go')
-rw-r--r--client.go25
1 files changed, 21 insertions, 4 deletions
diff --git a/client.go b/client.go
index e2d8ec7..42f0bce 100644
--- a/client.go
+++ b/client.go
@@ -1418,6 +1418,11 @@ func (c *HostClient) doNonNilReqResp(req *Request, resp *Response) (bool, error)
return err == nil, err
}
+ var deadline time.Time
+ if req.timeout > 0 {
+ deadline = time.Now().Add(req.timeout)
+ }
+
cc, err := c.acquireConn(req.timeout, req.ConnectionClose())
if err != nil {
return false, err
@@ -1426,11 +1431,17 @@ func (c *HostClient) doNonNilReqResp(req *Request, resp *Response) (bool, error)
resp.parseNetConn(conn)
+ writeDeadline := deadline
if c.WriteTimeout > 0 {
+ tmpWriteDeadline := time.Now().Add(c.WriteTimeout)
+ if writeDeadline.IsZero() || tmpWriteDeadline.Before(writeDeadline) {
+ writeDeadline = tmpWriteDeadline
+ }
+ }
+ if !writeDeadline.IsZero() {
// Set Deadline every time, since golang has fixed the performance issue
// See https://github.com/golang/go/issues/15133#issuecomment-271571395 for details
- currentTime := time.Now()
- if err = conn.SetWriteDeadline(currentTime.Add(c.WriteTimeout)); err != nil {
+ if err = conn.SetWriteDeadline(writeDeadline); err != nil {
c.closeConn(cc)
return true, err
}
@@ -1459,11 +1470,17 @@ func (c *HostClient) doNonNilReqResp(req *Request, resp *Response) (bool, error)
return true, err
}
+ readDeadline := deadline
if c.ReadTimeout > 0 {
+ tmpReadDeadline := time.Now().Add(c.ReadTimeout)
+ if readDeadline.IsZero() || tmpReadDeadline.Before(readDeadline) {
+ readDeadline = tmpReadDeadline
+ }
+ }
+ if !readDeadline.IsZero() {
// Set Deadline every time, since golang has fixed the performance issue
// See https://github.com/golang/go/issues/15133#issuecomment-271571395 for details
- currentTime := time.Now()
- if err = conn.SetReadDeadline(currentTime.Add(c.ReadTimeout)); err != nil {
+ if err = conn.SetReadDeadline(readDeadline); err != nil {
c.closeConn(cc)
return true, err
}