Skip to content

Commit 43c7b83

Browse files
authored
We cannot avoid continuing to call SetReadDeadline and similar methods after the connection is closed. (#1835)
In the current implementation, there are several places where it's assumed that SetReadDeadline and similar functions logically won't affect a closed connection. However, these assumptions may not hold in certain specific situations. Therefore, instead of asserting that such errors will never occur, simply return the errors encountered during the execution of these methods.
1 parent d29a2b9 commit 43c7b83

File tree

1 file changed

+15
-15
lines changed

1 file changed

+15
-15
lines changed

server.go

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1597,14 +1597,14 @@ func (s *Server) NextProto(key string, nph ServeHandler) {
15971597
func (s *Server) getNextProto(c net.Conn) (proto string, err error) {
15981598
if tlsConn, ok := c.(connTLSer); ok {
15991599
if s.ReadTimeout > 0 {
1600-
if err := c.SetReadDeadline(time.Now().Add(s.ReadTimeout)); err != nil {
1601-
panic(fmt.Sprintf("BUG: error in SetReadDeadline(%v): %v", s.ReadTimeout, err))
1600+
if err = c.SetReadDeadline(time.Now().Add(s.ReadTimeout)); err != nil {
1601+
return
16021602
}
16031603
}
16041604

16051605
if s.WriteTimeout > 0 {
1606-
if err := c.SetWriteDeadline(time.Now().Add(s.WriteTimeout)); err != nil {
1607-
panic(fmt.Sprintf("BUG: error in SetWriteDeadline(%v): %v", s.WriteTimeout, err))
1606+
if err = c.SetWriteDeadline(time.Now().Add(s.WriteTimeout)); err != nil {
1607+
return
16081608
}
16091609
}
16101610

@@ -2137,8 +2137,8 @@ func (s *Server) serveConn(c net.Conn) (err error) {
21372137
// Remove read or write deadlines that might have previously been set.
21382138
// The next handler is responsible for setting its own deadlines.
21392139
if s.ReadTimeout > 0 || s.WriteTimeout > 0 {
2140-
if err := c.SetDeadline(zeroTime); err != nil {
2141-
panic(fmt.Sprintf("BUG: error in SetDeadline(zeroTime): %v", err))
2140+
if err = c.SetDeadline(zeroTime); err != nil {
2141+
return
21422142
}
21432143
}
21442144

@@ -2177,7 +2177,7 @@ func (s *Server) serveConn(c net.Conn) (err error) {
21772177
// If this is a keep-alive connection set the idle timeout.
21782178
if connRequestNum > 1 {
21792179
if d := s.idleTimeout(); d > 0 {
2180-
if err := c.SetReadDeadline(time.Now().Add(d)); err != nil {
2180+
if err = c.SetReadDeadline(time.Now().Add(d)); err != nil {
21812181
break
21822182
}
21832183
}
@@ -2221,13 +2221,13 @@ func (s *Server) serveConn(c net.Conn) (err error) {
22212221
s.setState(c, StateActive)
22222222

22232223
if s.ReadTimeout > 0 {
2224-
if err := c.SetReadDeadline(time.Now().Add(s.ReadTimeout)); err != nil {
2224+
if err = c.SetReadDeadline(time.Now().Add(s.ReadTimeout)); err != nil {
22252225
break
22262226
}
22272227
} else if s.IdleTimeout > 0 && connRequestNum > 1 {
22282228
// If this was an idle connection and the server has an IdleTimeout but
22292229
// no ReadTimeout then we should remove the ReadTimeout.
2230-
if err := c.SetReadDeadline(zeroTime); err != nil {
2230+
if err = c.SetReadDeadline(zeroTime); err != nil {
22312231
break
22322232
}
22332233
}
@@ -2261,8 +2261,8 @@ func (s *Server) serveConn(c net.Conn) (err error) {
22612261
reqConf := onHdrRecv(&ctx.Request.Header)
22622262
if reqConf.ReadTimeout > 0 {
22632263
deadline := time.Now().Add(reqConf.ReadTimeout)
2264-
if err := c.SetReadDeadline(deadline); err != nil {
2265-
panic(fmt.Sprintf("BUG: error in SetReadDeadline(%v): %v", deadline, err))
2264+
if err = c.SetReadDeadline(deadline); err != nil {
2265+
break
22662266
}
22672267
}
22682268
switch {
@@ -2401,14 +2401,14 @@ func (s *Server) serveConn(c net.Conn) (err error) {
24012401
ctx.hijackNoResponse = false
24022402

24032403
if writeTimeout > 0 {
2404-
if err := c.SetWriteDeadline(time.Now().Add(writeTimeout)); err != nil {
2405-
panic(fmt.Sprintf("BUG: error in SetWriteDeadline(%v): %v", writeTimeout, err))
2404+
if err = c.SetWriteDeadline(time.Now().Add(writeTimeout)); err != nil {
2405+
break
24062406
}
24072407
previousWriteTimeout = writeTimeout
24082408
} else if previousWriteTimeout > 0 {
24092409
// We don't want a write timeout but we previously set one, remove it.
2410-
if err := c.SetWriteDeadline(zeroTime); err != nil {
2411-
panic(fmt.Sprintf("BUG: error in SetWriteDeadline(zeroTime): %v", err))
2410+
if err = c.SetWriteDeadline(zeroTime); err != nil {
2411+
break
24122412
}
24132413
previousWriteTimeout = 0
24142414
}

0 commit comments

Comments
 (0)