Treat all errors on first header byte read as EOF. This eliminates numerous and useless 'connection reset by peer' log messages for keep-alive connections on busy server

This commit is contained in:
Aliaksandr Valialkin
2015-11-14 12:39:51 +02:00
parent bbcdceaa76
commit 982edd5a7f
2 changed files with 42 additions and 10 deletions
+6 -10
View File
@@ -555,11 +555,9 @@ func (h *ResponseHeader) tryRead(r *bufio.Reader, n int) error {
h.Clear()
b, err := r.Peek(n)
if len(b) == 0 {
if err == io.EOF {
return err
}
if err == nil {
panic("bufio.Reader.Peek() returned nil, nil")
// treat all errors on the first byte read as EOF
if n == 1 || err == io.EOF {
return io.EOF
}
return fmt.Errorf("error when reading response headers: %s", err)
}
@@ -597,11 +595,9 @@ func (h *RequestHeader) tryRead(r *bufio.Reader, n int) error {
h.Clear()
b, err := r.Peek(n)
if len(b) == 0 {
if err == io.EOF {
return err
}
if err == nil {
panic("bufio.Reader.Peek() returned nil, nil")
// treat all errors on the first byte read as EOF
if n == 1 || err == io.EOF {
return io.EOF
}
return fmt.Errorf("error when reading request headers: %s", err)
}
+36
View File
@@ -10,6 +10,42 @@ import (
"testing"
)
func TestResponseHeaderFirstByteReadEOF(t *testing.T) {
var h ResponseHeader
r := &errorReader{fmt.Errorf("non-eof error")}
br := bufio.NewReader(r)
err := h.Read(br)
if err == nil {
t.Fatalf("expecting error")
}
if err != io.EOF {
t.Fatalf("unexpected error %s. Expecting %s", err, io.EOF)
}
}
func TestRequestHeaderFirstByteReadEOF(t *testing.T) {
var h RequestHeader
r := &errorReader{fmt.Errorf("non-eof error")}
br := bufio.NewReader(r)
err := h.Read(br)
if err == nil {
t.Fatalf("expecting error")
}
if err != io.EOF {
t.Fatalf("unexpected error %s. Expecting %s", err, io.EOF)
}
}
type errorReader struct {
err error
}
func (r *errorReader) Read(p []byte) (int, error) {
return 0, r.err
}
func TestRequestHeaderEmptyMethod(t *testing.T) {
var h RequestHeader