From aa06b948700dd2d45113a2122f07dddb85206a32 Mon Sep 17 00:00:00 2001 From: Craig Williams Date: Fri, 16 Oct 2026 15:23:49 +0100 Subject: [PATCH] Removed the message size limit from ws-test dial --- internal/cli/ws/dial.go | 3 +++ internal/cli/ws/dial_test.go | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/internal/cli/ws/dial.go b/internal/cli/ws/dial.go index 462ed28..f4f42cb 100644 --- a/internal/cli/ws/dial.go +++ b/internal/cli/ws/dial.go @@ -344,6 +344,9 @@ func connect( } return nil, fmt.Errorf("dialling %s: %w", settings.url, err) } + // dial shows whatever the server sends, and an event can be large (one + // after a catch-up lists every new opportunity), so there's no limit. + conn.SetReadLimit(-1) fmt.Fprintf(out, "connected (%s)\n", res.Status) //nolint:errcheck // printing only return conn, nil diff --git a/internal/cli/ws/dial_test.go b/internal/cli/ws/dial_test.go index fa67c5d..ac3ae6d 100644 --- a/internal/cli/ws/dial_test.go +++ b/internal/cli/ws/dial_test.go @@ -198,6 +198,41 @@ func TestDialListen(t *testing.T) { waitFor(t, out, "closed by the server (1001)") } +// A pushed message larger than the WebSocket library's default read limit +// (32KiB), as a catch-up event can be, is printed in full. +func TestDialLargeMessage(t *testing.T) { + hub, url := wsServer(t) + out := &syncBuffer{} + + done := make(chan error, 1) + go func() { + done <- dial(context.Background(), nil, out, dialSettings{ + url: url, + messages: []string{ping}, + listen: true, + timeout: time.Second, + }) + }() + + waitFor(t, out, `< {"type":"pong","id":"1"`) + large := strings.Repeat("x", 100_000) + hub.Push("event", map[string]string{"large": large, "end": "here"}) + // encoding/json sorts a map's keys. + waitFor(t, out, `{"end":"here","large":"`+large+`"}}`) + + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + hub.Shutdown(ctx) + select { + case err := <-done: + if err != nil { + t.Fatalf("dial = %v; want nil when the server closes", err) + } + case <-time.After(time.Second): + t.Fatal("dial did not return when the server closed") + } +} + // syncBuffer is a bytes.Buffer safe to write from one goroutine while // another reads it. type syncBuffer struct {