diff --git a/cmux.go b/cmux.go index 4595878..89cc910 100644 --- a/cmux.go +++ b/cmux.go @@ -197,19 +197,11 @@ func newMuxConn(c net.Conn) *MuxConn { // a non-zero number of bytes at the end of the input stream may // return either err == EOF or err == nil. The next Read should // return 0, EOF. -// -// This function implements the latter behaviour, returning the -// (non-nil) error from the same call. func (m *MuxConn) Read(p []byte) (int, error) { - n1, err := m.buf.Read(p) - if err == nil && m.buf.Len() == 0 { - err = io.EOF + if n, err := m.buf.Read(p); err != io.EOF { + return n, err } - if n1 == len(p) || err != io.EOF { - return n1, err - } - n2, err := m.Conn.Read(p[n1:]) - return n1 + n2, err + return m.Conn.Read(p) } func (m *MuxConn) getSniffer() io.Reader { diff --git a/cmux_test.go b/cmux_test.go index 669b713..90aaab9 100644 --- a/cmux_test.go +++ b/cmux_test.go @@ -278,12 +278,20 @@ func TestHTTP2(t *testing.T) { if err != nil { t.Fatal(err) } - var b [len(http2.ClientPreface)]byte - if _, err := muxedConn.Read(b[:]); err != io.EOF { - t.Fatal(err) + { + var b [len(http2.ClientPreface)]byte + if _, err := muxedConn.Read(b[:]); err != nil { + t.Fatal(err) + } + if string(b[:]) != http2.ClientPreface { + t.Errorf("got unexpected read %s, expected %s", b, http2.ClientPreface) + } } - if string(b[:]) != http2.ClientPreface { - t.Errorf("got unexpected read %s, expected %s", b, http2.ClientPreface) + { + var b [1]byte + if _, err := muxedConn.Read(b[:]); err != io.EOF { + t.Errorf("unexpected error %v, expected %v", err, io.EOF) + } } }