]> source.dussan.org Git - gitea.git/commitdiff
Add timeout to writing to responses (#15831)
authorzeripath <art27@cantab.net>
Fri, 14 May 2021 12:26:03 +0000 (13:26 +0100)
committerGitHub <noreply@github.com>
Fri, 14 May 2021 12:26:03 +0000 (13:26 +0100)
In #15826 it has become apparent that there are a few occasions when a response can
hang during writing, and because there is no timeout go will happily just block
interminably. This PR adds a fixed 5 second timeout to all writes to a connection.

Fix #15826

Signed-off-by: Andrew Thornton <art27@cantab.net>
modules/graceful/server.go

index c5021a9ba5d5e9c6e66f076a028c6933f6015d55..26195c63227d21f3e560c0c84d4be43e7ecc921e 100644 (file)
@@ -28,6 +28,9 @@ var (
        DefaultMaxHeaderBytes int
 )
 
+// PerWriteWriteTimeout timeout for writes
+const PerWriteWriteTimeout = 5 * time.Second
+
 func init() {
        DefaultMaxHeaderBytes = 0 // use http.DefaultMaxHeaderBytes - which currently is 1 << 20 (1MB)
 }
@@ -250,6 +253,13 @@ type wrappedConn struct {
        closed *int32
 }
 
+func (w wrappedConn) Write(p []byte) (n int, err error) {
+       if PerWriteWriteTimeout > 0 {
+               _ = w.Conn.SetWriteDeadline(time.Now().Add(PerWriteWriteTimeout))
+       }
+       return w.Conn.Write(p)
+}
+
 func (w wrappedConn) Close() error {
        if atomic.CompareAndSwapInt32(w.closed, 0, 1) {
                defer func() {