2
0
mirror of https://github.com/soheilhy/cmux.git synced 2026-08-04 10:03:51 +08:00

Fix a blocking issue in buffer reader

After sniffing and buffering data, if we try to read from
the socket again, bufio.Reader may block. This breaks HTTP handlers
in go1.5.2+ if one tries on browsers or with curl. Go's HTTP client,
however, is not broken. This issue is also there with TeeReader.

Return immediately with the data in the sniffed buffer.
This commit is contained in:
Soheil Hassas Yeganeh
2016-04-24 12:55:13 -04:00
parent 59b6f01712
commit d5924ef0b4
2 changed files with 22 additions and 9 deletions

View File

@@ -279,7 +279,13 @@ func TestHTTP2(t *testing.T) {
t.Fatal(err)
}
var b [len(http2.ClientPreface)]byte
if _, err := muxedConn.Read(b[:]); err != io.EOF {
var n int
// We have the sniffed buffer first...
if n, err = muxedConn.Read(b[:]); err == io.EOF {
t.Fatal(err)
}
// and then we read from the source.
if _, err = muxedConn.Read(b[n:]); err != io.EOF {
t.Fatal(err)
}
if string(b[:]) != http2.ClientPreface {