Search in sources :

Example 1 with CloseFrame

use of org.java_websocket.framing.CloseFrame in project quorrabot by GloriousEggroll.

the class WebSocketImpl method decodeFrames.

private void decodeFrames(ByteBuffer socketBuffer) {
    List<Framedata> frames;
    try {
        frames = draft.translateFrame(socketBuffer);
        for (Framedata f : frames) {
            if (DEBUG) {
                System.out.println("matched frame: " + f);
            }
            Opcode curop = f.getOpcode();
            boolean fin = f.isFin();
            if (curop == Opcode.CLOSING) {
                int code = CloseFrame.NOCODE;
                String reason = "";
                if (f instanceof CloseFrame) {
                    CloseFrame cf = (CloseFrame) f;
                    code = cf.getCloseCode();
                    reason = cf.getMessage();
                }
                if (readystate == READYSTATE.CLOSING) {
                    // complete the close handshake by disconnecting
                    closeConnection(code, reason, true);
                } else // echo close handshake
                if (draft.getCloseHandshakeType() == CloseHandshakeType.TWOWAY) {
                    close(code, reason, true);
                } else {
                    flushAndClose(code, reason, false);
                }
                continue;
            } else if (curop == Opcode.PING) {
                wsl.onWebsocketPing(this, f);
                continue;
            } else if (curop == Opcode.PONG) {
                wsl.onWebsocketPong(this, f);
                continue;
            } else if (!fin || curop == Opcode.CONTINUOUS) {
                if (curop != Opcode.CONTINUOUS) {
                    if (current_continuous_frame_opcode != null) {
                        throw new InvalidDataException(CloseFrame.PROTOCOL_ERROR, "Previous continuous frame sequence not completed.");
                    }
                    current_continuous_frame_opcode = curop;
                } else if (fin) {
                    if (current_continuous_frame_opcode == null) {
                        throw new InvalidDataException(CloseFrame.PROTOCOL_ERROR, "Continuous frame sequence was not started.");
                    }
                    current_continuous_frame_opcode = null;
                } else if (current_continuous_frame_opcode == null) {
                    throw new InvalidDataException(CloseFrame.PROTOCOL_ERROR, "Continuous frame sequence was not started.");
                }
                try {
                    wsl.onWebsocketMessageFragment(this, f);
                } catch (RuntimeException e) {
                    wsl.onWebsocketError(this, e);
                }
            } else if (current_continuous_frame_opcode != null) {
                throw new InvalidDataException(CloseFrame.PROTOCOL_ERROR, "Continuous frame sequence not completed.");
            } else if (curop == Opcode.TEXT) {
                try {
                    wsl.onWebsocketMessage(this, Charsetfunctions.stringUtf8(f.getPayloadData()));
                } catch (RuntimeException e) {
                    wsl.onWebsocketError(this, e);
                }
            } else if (curop == Opcode.BINARY) {
                try {
                    wsl.onWebsocketMessage(this, f.getPayloadData());
                } catch (RuntimeException e) {
                    wsl.onWebsocketError(this, e);
                }
            } else {
                throw new InvalidDataException(CloseFrame.PROTOCOL_ERROR, "non control or continious frame expected");
            }
        }
    } catch (InvalidDataException e1) {
        wsl.onWebsocketError(this, e1);
        close(e1);
        return;
    }
}
Also used : Framedata(org.java_websocket.framing.Framedata) InvalidDataException(org.java_websocket.exceptions.InvalidDataException) Opcode(org.java_websocket.framing.Framedata.Opcode) CloseFrame(org.java_websocket.framing.CloseFrame)

Aggregations

InvalidDataException (org.java_websocket.exceptions.InvalidDataException)1 CloseFrame (org.java_websocket.framing.CloseFrame)1 Framedata (org.java_websocket.framing.Framedata)1 Opcode (org.java_websocket.framing.Framedata.Opcode)1