mirror of
https://github.com/valyala/fasthttp.git
synced 2026-06-14 15:56:44 +03:00
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:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user