0
// SetReadLimit sets the maximum size for a message read from the peer. If a
// message exceeds the limit, the connection sends a close message to the peer
// and returns ErrReadLimit to the application.
func (c *Conn) SetReadLimit(limit int64) {
    c.readLimit = limit
}

What is the unit of limit? KB? MB ?

2 Answers 2

2

Based on the sources of gorilla/websocket, it's in bytes.

const readLimit = 512
message := make([]byte, readLimit+1)
.....
rc.SetReadLimit(readLimit)

Here is the full unit test:

func TestReadLimit(t *testing.T) {

    const readLimit = 512
    message := make([]byte, readLimit+1)

    var b1, b2 bytes.Buffer
    wc := newConn(&fakeNetConn{Writer: &b1}, false, 1024, readLimit-2, nil, nil, nil)
    rc := newTestConn(&b1, &b2, true)
    rc.SetReadLimit(readLimit)

    // Send message at the limit with interleaved pong.
    w, _ := wc.NextWriter(BinaryMessage)
    w.Write(message[:readLimit-1])
    wc.WriteControl(PongMessage, []byte("this is a pong"), time.Now().Add(10*time.Second))
    w.Write(message[:1])
    w.Close()

    // Send message larger than the limit.
    wc.WriteMessage(BinaryMessage, message[:readLimit+1])

    op, _, err := rc.NextReader()
    if op != BinaryMessage || err != nil {
        t.Fatalf("1: NextReader() returned %d, %v", op, err)
    }
    op, r, err := rc.NextReader()
    if op != BinaryMessage || err != nil {
        t.Fatalf("2: NextReader() returned %d, %v", op, err)
    }
    _, err = io.Copy(ioutil.Discard, r)
    if err != ErrReadLimit {
        t.Fatalf("io.Copy() returned %v", err)
    }
}
Sign up to request clarification or add additional context in comments.

Comments

0

This does not seem to be well-documented indeed, but according to the corresponding test it is in bytes. I'd assume that to be a default unit anyway.

The relevant test code:

// Send message at the limit with interleaved pong.
w, _ := wc.NextWriter(BinaryMessage)
w.Write(message[:readLimit-1])
wc.WriteControl(PongMessage, []byte("this is a pong"), time.Now().Add(10*time.Second))
w.Write(message[:1])
w.Close()

// Send message larger than the limit.
wc.WriteMessage(BinaryMessage, message[:readLimit+1])

// ...

_, err = io.Copy(ioutil.Discard, r)
if err != ErrReadLimit {
    t.Fatalf("io.Copy() returned %v", err)
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.