2
0

Fix reading interrupted messages

When an message is received and a timeout occurs after reading the
header but before reading the entire body the connection state could
be corrupted due to the header being consumed. The next read would
consider the body of the previous message as the header for the next.

fixes #348
This commit is contained in:
Jack Christensen
2017-12-16 13:45:22 -06:00
parent ffa9ff2213
commit b3d0cbd0e6
4 changed files with 135 additions and 18 deletions
+37
View File
@@ -0,0 +1,37 @@
package pgproto3_test
import (
"testing"
"github.com/jackc/pgx/pgproto3"
)
func TestBackendReceiveInterrupted(t *testing.T) {
t.Parallel()
server := &interruptReader{}
server.push([]byte{'Q', 0, 0, 0, 6})
backend, err := pgproto3.NewBackend(server, nil)
if err != nil {
t.Fatal(err)
}
msg, err := backend.Receive()
if err == nil {
t.Fatal("expected err")
}
if msg != nil {
t.Fatalf("did not expect msg, but %v", msg)
}
server.push([]byte{'I', 0})
msg, err = backend.Receive()
if err != nil {
t.Fatal(err)
}
if msg, ok := msg.(*pgproto3.Query); !ok || msg.String != "I" {
t.Fatalf("unexpected msg: %v", msg)
}
}