forked from mirror/websocket
Do not mask bytes when reading on the client.
- The bytes were masked with zero, a nop. - Add test for control messages.
This commit is contained in:
parent
411599d366
commit
0e7b5f878f
4
conn.go
4
conn.go
|
@ -615,8 +615,10 @@ func (c *Conn) advanceFrame() (int, error) {
|
||||||
if _, err := io.ReadFull(c.br, payload); err != nil {
|
if _, err := io.ReadFull(c.br, payload); err != nil {
|
||||||
return noFrame, err
|
return noFrame, err
|
||||||
}
|
}
|
||||||
|
if c.isServer {
|
||||||
maskBytes(c.readMaskKey, 0, payload)
|
maskBytes(c.readMaskKey, 0, payload)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 7. Process control frame payload.
|
// 7. Process control frame payload.
|
||||||
|
|
||||||
|
@ -698,7 +700,9 @@ func (r messageReader) Read(b []byte) (n int, err error) {
|
||||||
}
|
}
|
||||||
n, err := r.c.br.Read(b)
|
n, err := r.c.br.Read(b)
|
||||||
r.c.readErr = hideTempErr(err)
|
r.c.readErr = hideTempErr(err)
|
||||||
|
if r.c.isServer {
|
||||||
r.c.readMaskPos = maskBytes(r.c.readMaskKey, r.c.readMaskPos, b[:n])
|
r.c.readMaskPos = maskBytes(r.c.readMaskKey, r.c.readMaskPos, b[:n])
|
||||||
|
}
|
||||||
r.c.readRemaining -= int64(n)
|
r.c.readRemaining -= int64(n)
|
||||||
return n, r.c.readErr
|
return n, r.c.readErr
|
||||||
}
|
}
|
||||||
|
|
36
conn_test.go
36
conn_test.go
|
@ -107,6 +107,42 @@ func TestFraming(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestControl(t *testing.T) {
|
||||||
|
const message = "this is a ping/pong messsage"
|
||||||
|
for _, isServer := range []bool{true, false} {
|
||||||
|
for _, isWriteControl := range []bool{true, false} {
|
||||||
|
name := fmt.Sprintf("s:%v, wc:%v", isServer, isWriteControl)
|
||||||
|
var connBuf bytes.Buffer
|
||||||
|
wc := newConn(fakeNetConn{Reader: nil, Writer: &connBuf}, isServer, 1024, 1024)
|
||||||
|
rc := newConn(fakeNetConn{Reader: &connBuf, Writer: nil}, !isServer, 1024, 1024)
|
||||||
|
if isWriteControl {
|
||||||
|
wc.WriteControl(PongMessage, []byte(message), time.Now().Add(time.Second))
|
||||||
|
} else {
|
||||||
|
w, err := wc.NextWriter(PongMessage)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("%s: wc.NextWriter() returned %v", name, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if _, err := w.Write([]byte(message)); err != nil {
|
||||||
|
t.Errorf("%s: w.Write() returned %v", name, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if err := w.Close(); err != nil {
|
||||||
|
t.Errorf("%s: w.Close() returned %v", name, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
var actualMessage string
|
||||||
|
rc.SetPongHandler(func(s string) error { actualMessage = s; return nil })
|
||||||
|
rc.NextReader()
|
||||||
|
if actualMessage != message {
|
||||||
|
t.Errorf("%s: pong=%q, want %q", name, actualMessage, message)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestReadLimit(t *testing.T) {
|
func TestReadLimit(t *testing.T) {
|
||||||
|
|
||||||
const readLimit = 512
|
const readLimit = 512
|
||||||
|
|
Loading…
Reference in New Issue