diff options
| author | Shulhan <ms@kilabit.info> | 2019-03-12 14:18:06 +0700 |
|---|---|---|
| committer | Shulhan <ms@kilabit.info> | 2019-03-12 14:18:06 +0700 |
| commit | d7367ec27c04920fc5cb9ef0b1aad140ceac3080 (patch) | |
| tree | 92433cad5cd34025b9d0a979ce0dca80cfbcef09 | |
| parent | 7233d915b3051ffc996d755dc446563bc94f3a7c (diff) | |
| download | pakakeh.go-d7367ec27c04920fc5cb9ef0b1aad140ceac3080.tar.xz | |
websocket: export the opcode type
The opcode type is required to create new frame and to get the opcode in
continous frames.
| -rw-r--r-- | lib/websocket/client.go | 18 | ||||
| -rw-r--r-- | lib/websocket/client_test.go | 30 | ||||
| -rw-r--r-- | lib/websocket/clientmanager.go | 4 | ||||
| -rw-r--r-- | lib/websocket/frame.go | 28 | ||||
| -rw-r--r-- | lib/websocket/frame_test.go | 40 | ||||
| -rw-r--r-- | lib/websocket/frames.go | 10 | ||||
| -rw-r--r-- | lib/websocket/frames_test.go | 48 | ||||
| -rw-r--r-- | lib/websocket/opcode.go | 34 | ||||
| -rw-r--r-- | lib/websocket/server.go | 42 |
9 files changed, 126 insertions, 128 deletions
diff --git a/lib/websocket/client.go b/lib/websocket/client.go index 5ab94913..05a3f778 100644 --- a/lib/websocket/client.go +++ b/lib/websocket/client.go @@ -256,7 +256,7 @@ func (cl *Client) connect() (err error) { // If handler is nil, no response will be read from server. // func (cl *Client) SendBin(ctx context.Context, bin []byte, handler ClientRecvHandler) error { - return cl.sendData(ctx, bin, opcodeBin, handler) + return cl.sendData(ctx, bin, OpcodeBin, handler) } // @@ -299,7 +299,7 @@ func (cl *Client) SendPong(payload []byte) error { // If handler is nil, no response will be read from server. // func (cl *Client) SendText(ctx context.Context, text []byte, handler ClientRecvHandler) (err error) { - return cl.sendData(ctx, text, opcodeText, handler) + return cl.sendData(ctx, text, OpcodeText, handler) } // @@ -328,11 +328,11 @@ func (cl *Client) Recv() (frames *Frames, err error) { } for _, f := range fs.v { switch f.opcode { - case opcodePing: + case OpcodePing: cl.pingQueue <- f - case opcodePong: + case OpcodePong: // Ignore control PONG frame. - case opcodeClose: + case OpcodeClose: frames.Append(f) goto out default: @@ -377,7 +377,7 @@ func (cl *Client) handleClose(ctx context.Context, packet []byte) error { if f == nil { return fmt.Errorf("websocket: Client.handleClose: empty response") } - if f.opcode != opcodeClose { + if f.opcode != OpcodeClose { return fmt.Errorf("websocket: Client.handleClose: expecting CLOSE frame, got %d", f.opcode) } @@ -393,7 +393,7 @@ func handlePing(ctx context.Context, packet []byte) error { if f == nil { return fmt.Errorf("websocket: Client.handlePing: empty response") } - if f.opcode != opcodePong { + if f.opcode != OpcodePong { return fmt.Errorf("websocket: Client.handlePing: expecting PONG frame, got %d", f.opcode) } @@ -469,7 +469,7 @@ func (cl *Client) send(ctx context.Context, req []byte, handleRaw clientRawHandl return nil } -func (cl *Client) sendData(ctx context.Context, req []byte, opcode opcode, handler ClientRecvHandler) (err error) { +func (cl *Client) sendData(ctx context.Context, req []byte, opcode Opcode, handler ClientRecvHandler) (err error) { cl.Lock() if cl.conn == nil { cl.Unlock() @@ -478,7 +478,7 @@ func (cl *Client) sendData(ctx context.Context, req []byte, opcode opcode, handl var packet []byte - if opcode == opcodeText { + if opcode == OpcodeText { packet = NewFrameText(true, req) } else { packet = NewFrameBin(true, req) diff --git a/lib/websocket/client_test.go b/lib/websocket/client_test.go index dd319a12..239c8529 100644 --- a/lib/websocket/client_test.go +++ b/lib/websocket/client_test.go @@ -232,11 +232,11 @@ func TestClientFragmentation(t *testing.T) { desc: "Two text frames, unmasked", frames: []Frame{{ fin: 0, - opcode: opcodeText, + opcode: OpcodeText, payload: []byte{'H', 'e', 'l'}, }, { fin: frameIsFinished, - opcode: opcodeCont, + opcode: OpcodeCont, payload: []byte{'l', 'o'}, }}, exp: NewFrameClose(false, StatusBadRequest, nil), @@ -245,15 +245,15 @@ func TestClientFragmentation(t *testing.T) { reconnect: true, frames: []Frame{{ fin: 0, - opcode: opcodeText, + opcode: OpcodeText, payload: []byte("Hel"), }, { fin: 0, - opcode: opcodeCont, + opcode: OpcodeCont, payload: []byte("lo, "), }, { fin: frameIsFinished, - opcode: opcodeCont, + opcode: OpcodeCont, payload: []byte("Shulhan"), }}, exp: NewFrameClose(false, StatusBadRequest, nil), @@ -262,17 +262,17 @@ func TestClientFragmentation(t *testing.T) { reconnect: true, frames: []Frame{{ fin: 0, - opcode: opcodeText, + opcode: OpcodeText, masked: frameIsMasked, payload: []byte("Hel"), }, { fin: 0, - opcode: opcodeCont, + opcode: OpcodeCont, masked: frameIsMasked, payload: []byte("lo, "), }, { fin: frameIsFinished, - opcode: opcodeCont, + opcode: OpcodeCont, masked: frameIsMasked, payload: []byte("Shulhan"), }}, @@ -327,22 +327,22 @@ func TestClientFragmentation2(t *testing.T) { frames := []Frame{{ fin: 0, - opcode: opcodeText, + opcode: OpcodeText, masked: frameIsMasked, payload: []byte("Hel"), }, { fin: 0, - opcode: opcodeCont, + opcode: OpcodeCont, masked: frameIsMasked, payload: []byte("lo, "), }, { fin: frameIsFinished, - opcode: opcodePing, + opcode: OpcodePing, masked: frameIsMasked, payload: []byte("PING"), }, { fin: frameIsFinished, - opcode: opcodeCont, + opcode: OpcodeCont, masked: frameIsMasked, payload: []byte("Shulhan"), }} @@ -436,7 +436,7 @@ func TestClientSendBin(t *testing.T) { payload: []byte("Hello"), exp: &Frame{ fin: frameIsFinished, - opcode: opcodeBin, + opcode: OpcodeBin, len: 5, payload: []byte("Hello"), }, @@ -511,7 +511,7 @@ func TestClientSendPing(t *testing.T) { handler: testHandlePing, exp: &Frame{ fin: frameIsFinished, - opcode: opcodePong, + opcode: OpcodePong, len: 0, }, }, { @@ -520,7 +520,7 @@ func TestClientSendPing(t *testing.T) { payload: []byte("Test"), exp: &Frame{ fin: frameIsFinished, - opcode: opcodePong, + opcode: OpcodePong, len: 4, payload: []byte("Test"), }, diff --git a/lib/websocket/clientmanager.go b/lib/websocket/clientmanager.go index 129a98cf..8197e89a 100644 --- a/lib/websocket/clientmanager.go +++ b/lib/websocket/clientmanager.go @@ -101,12 +101,12 @@ func (cls *ClientManager) finFrames(conn int, fin *Frame) (f *Frame) { f = frames.v[0] for x := 1; x < len(frames.v); x++ { - if frames.v[x].opcode == opcodeClose { + if frames.v[x].opcode == OpcodeClose { break } // Ignore control PING or PONG frame. - if frames.v[x].opcode == opcodePing || frames.v[x].opcode == opcodePong { + if frames.v[x].opcode == OpcodePing || frames.v[x].opcode == OpcodePong { continue } diff --git a/lib/websocket/frame.go b/lib/websocket/frame.go index f3c06621..d84aca35 100644 --- a/lib/websocket/frame.go +++ b/lib/websocket/frame.go @@ -27,7 +27,7 @@ type Frame struct { // opcode (4 bits) defines the interpretation of the "Payload data". // If an unknown opcode is received, the receiving endpoint MUST _Fail // the WebSocket Connection_. The following values are defined. - opcode opcode + opcode Opcode // // masked (1 bit) defines whether the "Payload data" is masked. @@ -107,7 +107,7 @@ type Frame struct { // Client frame must be masked. // func NewFrameBin(isMasked bool, payload []byte) []byte { - return NewFrame(opcodeBin, isMasked, payload) + return NewFrame(OpcodeBin, isMasked, payload) } // @@ -129,21 +129,21 @@ func NewFrameClose(isMasked bool, code CloseCode, payload []byte) []byte { binary.BigEndian.PutUint16(packet[:2], uint16(code)) copy(packet[2:], payload) - return newControlFrame(opcodeClose, isMasked, packet) + return newControlFrame(OpcodeClose, isMasked, packet) } // // NewFramePing create a masked PING control frame. // func NewFramePing(isMasked bool, payload []byte) (packet []byte) { - return newControlFrame(opcodePing, isMasked, payload) + return newControlFrame(OpcodePing, isMasked, payload) } // // NewFramePong create a masked PONG control frame to be used by client. // func NewFramePong(isMasked bool, payload []byte) (packet []byte) { - return newControlFrame(opcodePong, isMasked, payload) + return newControlFrame(OpcodePong, isMasked, payload) } // @@ -151,14 +151,14 @@ func NewFramePong(isMasked bool, payload []byte) (packet []byte) { // Client frame must be masked. // func NewFrameText(isMasked bool, payload []byte) []byte { - return NewFrame(opcodeText, isMasked, payload) + return NewFrame(OpcodeText, isMasked, payload) } // // newControlFrame create new control frame with specific operation code and // optional payload. // -func newControlFrame(opcode opcode, isMasked bool, payload []byte) []byte { +func newControlFrame(opcode Opcode, isMasked bool, payload []byte) []byte { if len(payload) > frameSmallPayload { // All control frames MUST have a payload length of 125 bytes // or less and MUST NOT be fragmented. @@ -171,7 +171,7 @@ func newControlFrame(opcode opcode, isMasked bool, payload []byte) []byte { // NewFrame create a single finished frame with specific operation code and // optional payload. // -func NewFrame(opcode opcode, isMasked bool, payload []byte) []byte { +func NewFrame(opcode Opcode, isMasked bool, payload []byte) []byte { f := &Frame{ fin: frameIsFinished, opcode: opcode, @@ -224,7 +224,7 @@ func frameUnpack(in []byte) (f *Frame, rest []byte) { f.rsv1 = in[x] & 0x40 f.rsv2 = in[x] & 0x20 f.rsv3 = in[x] & 0x10 - f.opcode = opcode(in[x] & 0x0F) + f.opcode = Opcode(in[x] & 0x0F) x++ if x >= len(in) { f.chopped = append(f.chopped, in...) @@ -307,7 +307,7 @@ func frameUnpack(in []byte) (f *Frame, rest []byte) { } x += len(f.payload) - if f.opcode == opcodeClose { + if f.opcode == OpcodeClose { switch len(f.payload) { case 0: f.codes = []byte{0, 0} @@ -329,13 +329,13 @@ func frameUnpack(in []byte) (f *Frame, rest []byte) { // IsData return true if frame is either text or binary data frame. // func (f *Frame) IsData() bool { - return f.opcode == opcodeText || f.opcode == opcodeBin + return f.opcode == OpcodeText || f.opcode == OpcodeBin } // // Opcode return the frame operation code. // -func (f *Frame) Opcode() opcode { +func (f *Frame) Opcode() Opcode { return f.opcode } @@ -439,7 +439,7 @@ func (f *Frame) continueUnpack(packet []byte) []byte { f.rsv1 = packet[0] & 0x40 f.rsv2 = packet[0] & 0x20 f.rsv3 = packet[0] & 0x10 - f.opcode = opcode(packet[0] & 0x0F) + f.opcode = Opcode(packet[0] & 0x0F) f.chopped = append(f.chopped, packet[0]) packet = packet[1:] case 1: @@ -493,7 +493,7 @@ func (f *Frame) continueUnpack(packet []byte) []byte { packet = packet[exp:] } - if f.opcode == opcodeClose && len(f.codes) != 2 { + if f.opcode == OpcodeClose && len(f.codes) != 2 { exp := 2 - len(f.codes) if len(packet) < exp { f.codes = append(f.codes, packet...) diff --git a/lib/websocket/frame_test.go b/lib/websocket/frame_test.go index a6bdba56..ea6ae0f8 100644 --- a/lib/websocket/frame_test.go +++ b/lib/websocket/frame_test.go @@ -22,7 +22,7 @@ func TestNewFrameBin(t *testing.T) { //nolint: dupl payload: []byte("Hello!"), exp: &Frame{ fin: frameIsFinished, - opcode: opcodeBin, + opcode: OpcodeBin, payload: []byte("Hello!"), }, }, { @@ -31,7 +31,7 @@ func TestNewFrameBin(t *testing.T) { //nolint: dupl payload: []byte("Hello!"), exp: &Frame{ fin: frameIsFinished, - opcode: opcodeBin, + opcode: OpcodeBin, masked: frameIsMasked, payload: []byte("Hello!"), }, @@ -61,7 +61,7 @@ func TestNewFrameClose(t *testing.T) { payload: []byte("Hello!"), exp: &Frame{ fin: frameIsFinished, - opcode: opcodeClose, + opcode: OpcodeClose, closeCode: StatusBadRequest, masked: frameIsMasked, payload: []byte("Hello!"), @@ -71,7 +71,7 @@ func TestNewFrameClose(t *testing.T) { payload: _dummyPayload256, exp: &Frame{ fin: frameIsFinished, - opcode: opcodeClose, + opcode: OpcodeClose, closeCode: StatusBadRequest, masked: frameIsMasked, payload: _dummyPayload256[:123], @@ -103,7 +103,7 @@ func TestNewFramePing(t *testing.T) { //nolint:dupl payload: []byte("Hello!"), exp: &Frame{ fin: frameIsFinished, - opcode: opcodePing, + opcode: OpcodePing, masked: frameIsMasked, payload: []byte("Hello!"), }, @@ -112,7 +112,7 @@ func TestNewFramePing(t *testing.T) { //nolint:dupl payload: _dummyPayload256, exp: &Frame{ fin: frameIsFinished, - opcode: opcodePing, + opcode: OpcodePing, masked: frameIsMasked, payload: _dummyPayload256[:125], }, @@ -142,7 +142,7 @@ func TestNewFramePong(t *testing.T) { //nolint: dupl payload: []byte("Hello!"), exp: &Frame{ fin: frameIsFinished, - opcode: opcodePong, + opcode: OpcodePong, masked: frameIsMasked, payload: []byte("Hello!"), }, @@ -151,7 +151,7 @@ func TestNewFramePong(t *testing.T) { //nolint: dupl payload: _dummyPayload256, exp: &Frame{ fin: frameIsFinished, - opcode: opcodePong, + opcode: OpcodePong, masked: frameIsMasked, payload: _dummyPayload256[:125], }, @@ -182,7 +182,7 @@ func TestNewFrameText(t *testing.T) { //nolint: dupl payload: []byte("Hello!"), exp: &Frame{ fin: frameIsFinished, - opcode: opcodeText, + opcode: OpcodeText, payload: []byte("Hello!"), }, }, { @@ -191,7 +191,7 @@ func TestNewFrameText(t *testing.T) { //nolint: dupl payload: []byte("Hello!"), exp: &Frame{ fin: frameIsFinished, - opcode: opcodeText, + opcode: OpcodeText, masked: frameIsMasked, payload: []byte("Hello!"), }, @@ -220,7 +220,7 @@ func TestFramePack(t *testing.T) { desc: "A single-frame unmasked text message", f: Frame{ fin: frameIsFinished, - opcode: opcodeText, + opcode: OpcodeText, masked: 0, payload: []byte{'H', 'e', 'l', 'l', 'o'}, }, @@ -229,7 +229,7 @@ func TestFramePack(t *testing.T) { desc: "A single-frame masked text message", f: Frame{ fin: frameIsFinished, - opcode: opcodeText, + opcode: OpcodeText, masked: frameIsMasked, payload: []byte{'H', 'e', 'l', 'l', 'o'}, maskKey: _testMaskKey, @@ -243,7 +243,7 @@ func TestFramePack(t *testing.T) { desc: "A fragmented unmasked text message", f: Frame{ fin: 0, - opcode: opcodeText, + opcode: OpcodeText, masked: 0, payload: []byte{'H', 'e', 'l'}, }, @@ -252,7 +252,7 @@ func TestFramePack(t *testing.T) { desc: "A fragmented unmasked text message", f: Frame{ fin: frameIsFinished, - opcode: opcodeCont, + opcode: OpcodeCont, masked: 0, payload: []byte{'l', 'o'}, }, @@ -261,7 +261,7 @@ func TestFramePack(t *testing.T) { desc: `Unmasked Ping request (contains a body of "Hello")`, f: Frame{ fin: frameIsFinished, - opcode: opcodePing, + opcode: OpcodePing, masked: 0, payload: []byte{'H', 'e', 'l', 'l', 'o'}, }, @@ -270,7 +270,7 @@ func TestFramePack(t *testing.T) { desc: `masked Ping response (Pong)`, f: Frame{ fin: frameIsFinished, - opcode: opcodePong, + opcode: OpcodePong, masked: frameIsMasked, payload: []byte{'H', 'e', 'l', 'l', 'o'}, maskKey: _testMaskKey, @@ -284,7 +284,7 @@ func TestFramePack(t *testing.T) { desc: `256 bytes binary message in a single unmasked frame`, f: Frame{ fin: frameIsFinished, - opcode: opcodeBin, + opcode: OpcodeBin, masked: 0, payload: _dummyPayload256, }, @@ -293,7 +293,7 @@ func TestFramePack(t *testing.T) { desc: `256 bytes binary message in a single masked frame`, f: Frame{ fin: frameIsFinished, - opcode: opcodeBin, + opcode: OpcodeBin, masked: frameIsMasked, payload: _dummyPayload256, maskKey: _testMaskKey, @@ -307,7 +307,7 @@ func TestFramePack(t *testing.T) { desc: `65536 binary message in a single unmasked frame`, f: Frame{ fin: frameIsFinished, - opcode: opcodeBin, + opcode: OpcodeBin, masked: 0, payload: _dummyPayload65536, }, @@ -319,7 +319,7 @@ func TestFramePack(t *testing.T) { desc: `65536 binary message in a single masked frame`, f: Frame{ fin: frameIsFinished, - opcode: opcodeBin, + opcode: OpcodeBin, masked: frameIsMasked, payload: _dummyPayload65536, maskKey: _testMaskKey, diff --git a/lib/websocket/frames.go b/lib/websocket/frames.go index b54346b9..6a71a9ce 100644 --- a/lib/websocket/frames.go +++ b/lib/websocket/frames.go @@ -70,7 +70,7 @@ func (frames *Frames) isClosed() bool { return false } for x := 0; x < len(frames.v); x++ { - if frames.v[x].opcode == opcodeClose { + if frames.v[x].opcode == OpcodeClose { return true } } @@ -80,9 +80,9 @@ func (frames *Frames) isClosed() bool { // // Opcode return the operation code of the first frame. // -func (frames *Frames) Opcode() opcode { +func (frames *Frames) Opcode() Opcode { if len(frames.v) == 0 { - return opcodeCont + return OpcodeCont } return frames.v[0].opcode } @@ -105,12 +105,12 @@ func (frames *Frames) payload() (payload []byte) { } for x := 0; x < len(frames.v); x++ { - if frames.v[x].opcode == opcodeClose { + if frames.v[x].opcode == OpcodeClose { break } // Ignore control PING or PONG frame. - if frames.v[x].opcode == opcodePing || frames.v[x].opcode == opcodePong { + if frames.v[x].opcode == OpcodePing || frames.v[x].opcode == OpcodePong { continue } diff --git a/lib/websocket/frames_test.go b/lib/websocket/frames_test.go index 0912a491..11eac25a 100644 --- a/lib/websocket/frames_test.go +++ b/lib/websocket/frames_test.go @@ -23,7 +23,7 @@ func TestFrameUnpack(t *testing.T) { in: []byte{0x81, 0x05, 0x48, 0x65, 0x6c, 0x6c, 0x6f}, exp: &Frame{ fin: frameIsFinished, - opcode: opcodeText, + opcode: OpcodeText, masked: 0, payload: []byte{'H', 'e', 'l', 'l', 'o'}, len: 5, @@ -37,7 +37,7 @@ func TestFrameUnpack(t *testing.T) { }, exp: &Frame{ fin: frameIsFinished, - opcode: opcodeText, + opcode: OpcodeText, masked: frameIsMasked, payload: []byte{'H', 'e', 'l', 'l', 'o'}, maskKey: _testMaskKey, @@ -48,7 +48,7 @@ func TestFrameUnpack(t *testing.T) { in: []byte{0x01, 0x03, 0x48, 0x65, 0x6c}, exp: &Frame{ fin: 0, - opcode: opcodeText, + opcode: OpcodeText, masked: 0, payload: []byte{'H', 'e', 'l'}, len: 3, @@ -58,7 +58,7 @@ func TestFrameUnpack(t *testing.T) { in: []byte{0x80, 0x02, 0x6c, 0x6f}, exp: &Frame{ fin: frameIsFinished, - opcode: opcodeCont, + opcode: OpcodeCont, masked: 0, payload: []byte{'l', 'o'}, len: 2, @@ -68,7 +68,7 @@ func TestFrameUnpack(t *testing.T) { in: []byte{0x89, 0x05, 0x48, 0x65, 0x6c, 0x6c, 0x6f}, exp: &Frame{ fin: frameIsFinished, - opcode: opcodePing, + opcode: OpcodePing, masked: 0, payload: []byte{'H', 'e', 'l', 'l', 'o'}, len: 5, @@ -81,7 +81,7 @@ func TestFrameUnpack(t *testing.T) { }, exp: &Frame{ fin: frameIsFinished, - opcode: opcodePong, + opcode: OpcodePong, masked: frameIsMasked, maskKey: _testMaskKey, }, @@ -94,7 +94,7 @@ func TestFrameUnpack(t *testing.T) { }, exp: &Frame{ fin: frameIsFinished, - opcode: opcodePong, + opcode: OpcodePong, masked: frameIsMasked, payload: []byte{'H', 'e', 'l', 'l', 'o'}, maskKey: _testMaskKey, @@ -105,7 +105,7 @@ func TestFrameUnpack(t *testing.T) { in: libbytes.Concat([]byte{0x82, 0x7E, 0x01, 0x00}, _dummyPayload256), exp: &Frame{ fin: frameIsFinished, - opcode: opcodeBin, + opcode: OpcodeBin, masked: 0, payload: _dummyPayload256, len: 256, @@ -118,7 +118,7 @@ func TestFrameUnpack(t *testing.T) { }, _dummyPayload256Masked), exp: &Frame{ fin: frameIsFinished, - opcode: opcodeBin, + opcode: OpcodeBin, masked: frameIsMasked, payload: _dummyPayload256, maskKey: _testMaskKey, @@ -132,7 +132,7 @@ func TestFrameUnpack(t *testing.T) { }, _dummyPayload65536), exp: &Frame{ fin: frameIsFinished, - opcode: opcodeBin, + opcode: OpcodeBin, masked: 0, payload: _dummyPayload65536, len: 65536, @@ -146,7 +146,7 @@ func TestFrameUnpack(t *testing.T) { }, _dummyPayload65536Masked), exp: &Frame{ fin: frameIsFinished, - opcode: opcodeBin, + opcode: OpcodeBin, masked: frameIsMasked, payload: _dummyPayload65536, maskKey: _testMaskKey, @@ -180,7 +180,7 @@ func TestFramesAppend(t *testing.T) { }, { desc: "With non nil frames", f: &Frame{ - opcode: opcodeText, + opcode: OpcodeText, payload: []byte("A"), }, expLen: 1, @@ -210,18 +210,18 @@ func TestFramesIsClosed(t *testing.T) { desc: "With no close frames", frames: &Frames{ v: []*Frame{{ - opcode: opcodeText, + opcode: OpcodeText, }}, }, }, { desc: "With close frames at the end", frames: &Frames{ v: []*Frame{{ - opcode: opcodeText, + opcode: OpcodeText, }, { - opcode: opcodeText, + opcode: OpcodeText, }, { - opcode: opcodeClose, + opcode: OpcodeClose, }}, }, exp: true, @@ -247,7 +247,7 @@ func TestFramesPayload(t *testing.T) { fs: &Frames{ v: []*Frame{{ fin: frameIsFinished, - opcode: opcodeClose, + opcode: OpcodeClose, payload: []byte{0, 0}, }}, }, @@ -256,7 +256,7 @@ func TestFramesPayload(t *testing.T) { fs: &Frames{ v: []*Frame{{ fin: 0, - opcode: opcodeText, + opcode: OpcodeText, payload: []byte("Hel"), }, { fin: 0, @@ -274,15 +274,15 @@ func TestFramesPayload(t *testing.T) { fs: &Frames{ v: []*Frame{{ fin: 0, - opcode: opcodeText, + opcode: OpcodeText, payload: []byte("Hel"), }, { fin: frameIsFinished, - opcode: opcodeClose, + opcode: OpcodeClose, payload: []byte("lo "), }, { fin: frameIsFinished, - opcode: opcodeCont, + opcode: OpcodeCont, payload: []byte("world!"), }}, }, @@ -292,15 +292,15 @@ func TestFramesPayload(t *testing.T) { fs: &Frames{ v: []*Frame{{ fin: 0, - opcode: opcodeText, + opcode: OpcodeText, payload: []byte("Hel"), }, { fin: frameIsFinished, - opcode: opcodeCont, + opcode: OpcodeCont, payload: []byte("lo "), }, { fin: frameIsFinished, - opcode: opcodeCont, + opcode: OpcodeCont, payload: []byte("world!"), }}, }, diff --git a/lib/websocket/opcode.go b/lib/websocket/opcode.go index 3e49cf79..635285f2 100644 --- a/lib/websocket/opcode.go +++ b/lib/websocket/opcode.go @@ -4,26 +4,26 @@ package websocket -type opcode byte +type Opcode byte // // List of valid operation code in frame. // const ( - opcodeCont opcode = 0x0 - opcodeText opcode = 0x1 - opcodeBin opcode = 0x2 - opcodeDataRsv3 opcode = 0x3 // %x3-7 are reserved for further non-control frames - opcodeDataRsv4 opcode = 0x4 - opcodeDataRsv5 opcode = 0x5 - opcodeDataRsv6 opcode = 0x6 - opcodeDataRsv7 opcode = 0x7 - opcodeClose opcode = 0x8 - opcodePing opcode = 0x9 - opcodePong opcode = 0xA - opcodeControlRsvB opcode = 0xB // %xB-F are reserved for further control frames - opcodeControlRsvC opcode = 0xC - opcodeControlRsvD opcode = 0xD - opcodeControlRsvE opcode = 0xE - opcodeControlRsvF opcode = 0xF + OpcodeCont Opcode = 0x0 + OpcodeText Opcode = 0x1 + OpcodeBin Opcode = 0x2 + OpcodeDataRsv3 Opcode = 0x3 // %x3-7 are reserved for further non-control frames + OpcodeDataRsv4 Opcode = 0x4 + OpcodeDataRsv5 Opcode = 0x5 + OpcodeDataRsv6 Opcode = 0x6 + OpcodeDataRsv7 Opcode = 0x7 + OpcodeClose Opcode = 0x8 + OpcodePing Opcode = 0x9 + OpcodePong Opcode = 0xA + OpcodeControlRsvB Opcode = 0xB // %xB-F are reserved for further control frames + OpcodeControlRsvC Opcode = 0xC + OpcodeControlRsvD Opcode = 0xD + OpcodeControlRsvE Opcode = 0xE + OpcodeControlRsvF Opcode = 0xF ) diff --git a/lib/websocket/server.go b/lib/websocket/server.go index e4f9434b..6d6d25ec 100644 --- a/lib/websocket/server.go +++ b/lib/websocket/server.go @@ -426,28 +426,28 @@ func (serv *Server) handleChopped(x, conn int, packet []byte) (rest []byte, isCl } switch frame.opcode { - case opcodeText: + case OpcodeText: if !utf8.Valid(frame.payload) { serv.handleInvalidData(conn) isClosing = true } else { go serv.HandleText(conn, frame.payload) } - case opcodeBin: + case OpcodeBin: go serv.HandleBin(conn, frame.payload) - case opcodeDataRsv3, opcodeDataRsv4, opcodeDataRsv5, opcodeDataRsv6, opcodeDataRsv7: + case OpcodeDataRsv3, OpcodeDataRsv4, OpcodeDataRsv5, OpcodeDataRsv6, OpcodeDataRsv7: serv.handleBadRequest(conn) isClosing = true - case opcodeClose: + case OpcodeClose: serv.handleClose(conn, frame) isClosing = true - case opcodePing: + case OpcodePing: serv.handlePing(conn, frame) - case opcodePong: + case OpcodePong: if serv.handlePong != nil { serv.handlePong(conn, frame) } - case opcodeControlRsvB, opcodeControlRsvC, opcodeControlRsvD, opcodeControlRsvE, opcodeControlRsvF: + case OpcodeControlRsvB, OpcodeControlRsvC, OpcodeControlRsvD, OpcodeControlRsvE, OpcodeControlRsvF: if serv.HandleRsvControl != nil { serv.HandleRsvControl(conn, frame) } else { @@ -498,18 +498,16 @@ func (serv *Server) handleFragment(conn int, req *Frame) (isInvalid bool) { if frames == nil { // If a connection does not have continuous frame, then // current frame opcode must not be 0. - if req.opcode == opcodeCont { + if req.opcode == OpcodeCont { serv.handleBadRequest(conn) return true } frames = new(Frames) - } else { // If a connection have continuous frame, the next frame // opcode must be 0. - if req.opcode != opcodeCont { - serv.handleBadRequest(conn) - return true - } + } else if req.opcode != OpcodeCont { + serv.handleBadRequest(conn) + return true } if req.fin == 0 { @@ -531,7 +529,7 @@ func (serv *Server) handleFragment(conn int, req *Frame) (isInvalid bool) { frame := serv.Clients.finFrames(conn, req) - if frame.opcode == opcodeText { + if frame.opcode == OpcodeText { if !utf8.Valid(frame.payload) { serv.handleInvalidData(conn) return true @@ -724,7 +722,7 @@ func (serv *Server) handlePing(conn int, req *Frame) { log.Printf("websocket: Server.handlePing: conn:%d frame:%+v\n", conn, req) } - req.opcode = opcodePong + req.opcode = OpcodePong req.masked = 0 res := req.Pack(false) @@ -819,7 +817,7 @@ func (serv *Server) reader() { isClosing = true break } - if frame.opcode == opcodeClose || frame.opcode == opcodePing || frame.opcode == opcodePong { + if frame.opcode == OpcodeClose || frame.opcode == OpcodePing || frame.opcode == OpcodePong { if frame.fin == 0 { // Control frame must set the fin. serv.handleBadRequest(conn) @@ -835,24 +833,24 @@ func (serv *Server) reader() { } switch frame.opcode { - case opcodeCont, opcodeText, opcodeBin: + case OpcodeCont, OpcodeText, OpcodeBin: isInvalid := serv.handleFragment(conn, frame) if isInvalid { isClosing = true } - case opcodeDataRsv3, opcodeDataRsv4, opcodeDataRsv5, opcodeDataRsv6, opcodeDataRsv7: + case OpcodeDataRsv3, OpcodeDataRsv4, OpcodeDataRsv5, OpcodeDataRsv6, OpcodeDataRsv7: serv.handleBadRequest(conn) isClosing = true - case opcodeClose: + case OpcodeClose: serv.handleClose(conn, frame) isClosing = true - case opcodePing: + case OpcodePing: serv.handlePing(conn, frame) - case opcodePong: + case OpcodePong: if serv.handlePong != nil { go serv.handlePong(conn, frame) } - case opcodeControlRsvB, opcodeControlRsvC, opcodeControlRsvD, opcodeControlRsvE, opcodeControlRsvF: + case OpcodeControlRsvB, OpcodeControlRsvC, OpcodeControlRsvD, OpcodeControlRsvE, OpcodeControlRsvF: if serv.HandleRsvControl != nil { serv.HandleRsvControl(conn, frame) } else { |
