diff --git a/pool/client.go b/pool/client.go index 7e6298a..a0b61a7 100644 --- a/pool/client.go +++ b/pool/client.go @@ -205,13 +205,17 @@ func (c *StratumClient) writeJSON(value interface{}) error { } func (c *StratumClient) readLoop() { - reader := bufio.NewReader(c.conn) + reader := bufio.NewReaderSize(c.conn, 16384) for { - line, errorValue := reader.ReadBytes('\n') + line, isPrefix, errorValue := reader.ReadLine() if errorValue != nil { c.notifyDisconnect() return } + if isPrefix { + c.notifyDisconnect() + return + } response := jsonRPCResponse{} if errorValue = json.Unmarshal(line, &response); errorValue != nil { diff --git a/pool/client_test.go b/pool/client_test.go index 9198f32..7b8e783 100644 --- a/pool/client_test.go +++ b/pool/client_test.go @@ -31,6 +31,43 @@ func (l *disconnectCountingListener) Count() int { return l.count } +func TestStratumClient_ReadLoop_Ugly(t *testing.T) { + serverConn, clientConn := net.Pipe() + defer clientConn.Close() + + listener := &disconnectCountingListener{} + client := &StratumClient{ + listener: listener, + conn: serverConn, + } + + go client.readLoop() + + payload := make([]byte, 16385) + for index := range payload { + payload[index] = 'a' + } + payload = append(payload, '\n') + writeErr := make(chan error, 1) + go func() { + _, err := clientConn.Write(payload) + writeErr <- err + }() + + time.Sleep(50 * time.Millisecond) + if got := listener.Count(); got != 1 { + t.Fatalf("expected oversized line to close the connection, got %d disconnect callbacks", got) + } + + select { + case err := <-writeErr: + if err != nil { + t.Fatal(err) + } + default: + } +} + func TestStratumClient_Disconnect_Good(t *testing.T) { serverConn, clientConn := net.Pipe() defer clientConn.Close()