private String payloadToString() { if (this.payload == null) { return "null"; } else { final StringBuilder sb = new StringBuilder(); sb.append('[').append(this.payload.length).append("b] "); if (getOpCode() == OpCode.Text) { String text = getTextPayload(); if (text.length() > 100) { sb.append(text.substring(0, 100)).append("..."); } else { sb.append(text); } } else { sb.append("0x"); for (int i = 0; i < Math.min(this.payload.length, 50); ++i) { sb.append(Integer.toHexString(this.payload[i] & 0xFF)); } if (this.payload.length > 50) { sb.append("..."); } } return sb.toString(); } }
@Override protected void onMessage(WebSocketFrame message) { try { message.setUnmasked(); if(message.getTextPayload().equalsIgnoreCase("exit")) { context.broadcast(Orchid.Events.END_SESSION); } else if(message.getTextPayload().equalsIgnoreCase("rebuild")) { context.broadcast(Orchid.Events.FORCE_REBUILD); } sendFrame(message); } catch (IOException e) { throw new RuntimeException(e); } }
private void handleFrameFragment(WebSocketFrame frame) throws IOException { if (frame.getOpCode() != OpCode.Continuation) { // First if (this.continuousOpCode != null) { throw new WebSocketException(CloseCode.ProtocolError, "Previous continuous frame sequence not completed."); } this.continuousOpCode = frame.getOpCode(); this.continuousFrames.clear(); this.continuousFrames.add(frame); } else if (frame.isFin()) { // Last if (this.continuousOpCode == null) { throw new WebSocketException(CloseCode.ProtocolError, "Continuous frame sequence was not started."); } this.continuousFrames.add(frame); onMessage(new WebSocketFrame(this.continuousOpCode, this.continuousFrames)); this.continuousOpCode = null; this.continuousFrames.clear(); } else if (this.continuousOpCode == null) { // Unexpected throw new WebSocketException(CloseCode.ProtocolError, "Continuous frame sequence was not started."); } else { // Intermediate this.continuousFrames.add(frame); } }
out.write(header); this._payloadLength = getBinaryPayload().length; if (this._payloadLength <= 125) { out.write(isMasked() ? 0x80 | (byte) this._payloadLength : (byte) this._payloadLength); } else if (this._payloadLength <= 0xFFFF) { out.write(isMasked() ? 0xFE : 126); out.write(this._payloadLength >>> 8); out.write(this._payloadLength); } else { out.write(isMasked() ? 0xFF : 127); out.write(this._payloadLength >>> 56 & 0); // integer only if (isMasked()) { out.write(this.maskingKey); for (int i = 0; i < this._payloadLength; i++) { out.write(getBinaryPayload()[i] ^ this.maskingKey[i % 4]); out.write(getBinaryPayload());
private void readPayloadInfo(InputStream in) throws IOException { byte b = (byte) checkedRead(in.read()); boolean masked = (b & 0x80) != 0; if (this._payloadLength == 126) { this._payloadLength = (checkedRead(in.read()) << 8 | checkedRead(in.read())) & 0xFFFF; if (this._payloadLength < 126) { throw new WebSocketException(CloseCode.ProtocolError, "Invalid data frame 2byte length. (not using minimal length encoding)"); (long) checkedRead(in.read()) << 56 | (long) checkedRead(in.read()) << 48 | (long) checkedRead(in.read()) << 40 | (long) checkedRead(in.read()) << 32 | checkedRead(in.read()) << 24 | checkedRead(in.read()) << 16 | checkedRead(in.read()) << 8 | checkedRead(in.read()); if (_payloadLength < 65536) { throw new WebSocketException(CloseCode.ProtocolError, "Invalid data frame 4byte length. (not using minimal length encoding)"); int read = 0; while (read < this.maskingKey.length) { read += checkedRead(in.read(this.maskingKey, read, this.maskingKey.length - read));
public static WebSocketFrame read(InputStream in) throws IOException { byte head = (byte) checkedRead(in.read()); boolean fin = (head & 0x80) != 0; OpCode opCode = OpCode.find((byte) (head & 0x0F)); if ((head & 0x70) != 0) { throw new WebSocketException(CloseCode.ProtocolError, "The reserved bits (" + Integer.toBinaryString(head & 0x70) + ") must be 0."); } if (opCode == null) { throw new WebSocketException(CloseCode.ProtocolError, "Received frame with reserved/unknown opcode " + (head & 0x0F) + "."); } else if (opCode.isControlFrame() && !fin) { throw new WebSocketException(CloseCode.ProtocolError, "Fragmented control frame."); } WebSocketFrame frame = new WebSocketFrame(opCode, fin); frame.readPayloadInfo(in); frame.readPayload(in); if (frame.getOpCode() == OpCode.Close) { return new CloseFrame(frame); } else { return frame; } }
@Override public void onMessage(final NanoWSD.WebSocket webSocket, final NanoWSD.WebSocketFrame message) { String jsonText = message.getTextPayload(); if (jsonText == null || jsonText.length() == 0) { sendMessage(webSocket, "{\"result\":1}"); return; } try { JSONObject jsonObject = new JSONObject(jsonText); String at = jsonObject.getString("accessToken"); if (!accessToken.equals(at)) { sendMessage(webSocket, "{\"result\":1}"); return; } sendMessage(webSocket, "{\"result\":0}"); } catch (JSONException e) { sendMessage(webSocket, "{\"result\":1}"); } }
@Override public void onMessage(final NanoWSD.WebSocket webSocket, final NanoWSD.WebSocketFrame message) { String jsonText = message.getTextPayload(); if (jsonText == null || jsonText.length() == 0) { sendMessage(webSocket, "{\"result\":1}"); return; } try { JSONObject jsonObject = new JSONObject(jsonText); String at = jsonObject.getString("accessToken"); if (!accessToken.equals(at)) { sendMessage(webSocket, "{\"result\":1}"); return; } webSocket1[0] = webSocket; sendMessage(webSocket, "{\"result\":0}"); } catch (JSONException e) { sendMessage(webSocket, "{\"result\":1}"); } }
public WebSocketFrame(OpCode opCode, List<WebSocketFrame> fragments) throws WebSocketException { setOpCode(opCode); setFin(true); long _payloadLength = 0; for (WebSocketFrame inter : fragments) { _payloadLength += inter.getBinaryPayload().length; } if (_payloadLength < 0 || _payloadLength > Integer.MAX_VALUE) { throw new WebSocketException(CloseCode.MessageTooBig, "Max frame length has been exceeded."); } this._payloadLength = (int) _payloadLength; byte[] payload = new byte[this._payloadLength]; int offset = 0; for (WebSocketFrame inter : fragments) { System.arraycopy(inter.getBinaryPayload(), 0, payload, offset, inter.getBinaryPayload().length); offset += inter.getBinaryPayload().length; } setBinaryPayload(payload); }
private void handleWebsocketFrame(WebSocketFrame frame) throws IOException { debugFrameReceived(frame); if (frame.getOpCode() == OpCode.Close) { handleCloseFrame(frame); } else if (frame.getOpCode() == OpCode.Ping) { sendFrame(new WebSocketFrame(OpCode.Pong, true, frame.getBinaryPayload())); } else if (frame.getOpCode() == OpCode.Pong) { onPong(frame); } else if (!frame.isFin() || frame.getOpCode() == OpCode.Continuation) { handleFrameFragment(frame); } else if (this.continuousOpCode != null) { throw new WebSocketException(CloseCode.ProtocolError, "Continuous frame sequence not completed."); } else if (frame.getOpCode() == OpCode.Text || frame.getOpCode() == OpCode.Binary) { onMessage(frame); } else { throw new WebSocketException(CloseCode.ProtocolError, "Non control or continuous frame expected."); } }
private void readPayload(InputStream in) throws IOException { this.payload = new byte[this._payloadLength]; int read = 0; while (read < this._payloadLength) { read += checkedRead(in.read(this.payload, read, this._payloadLength - read)); } if (isMasked()) { for (int i = 0; i < this.payload.length; i++) { this.payload[i] ^= this.maskingKey[i % 4]; } } // Test for Unicode errors if (getOpCode() == OpCode.Text) { this._payloadString = binary2Text(getBinaryPayload()); } }
public void send(String payload) throws IOException { sendFrame(new WebSocketFrame(OpCode.Text, true, payload)); }
public void ping(byte[] payload) throws IOException { sendFrame(new WebSocketFrame(OpCode.Ping, true, payload)); }
@Override protected void onMessage(WebSocketFrame message) { try { message.setUnmasked(); if(message.getTextPayload().equalsIgnoreCase("exit")) { context.broadcast(Orchid.Lifecycle.EndSession.fire(this)); } else if(message.getTextPayload().equalsIgnoreCase("rebuild")) { context.build(); } sendFrame(message); } catch (IOException e) { throw new RuntimeException(e); } }
public void send(byte[] payload) throws IOException { sendFrame(new WebSocketFrame(OpCode.Binary, true, payload)); }
private CloseFrame(WebSocketFrame wrap) throws CharacterCodingException { super(wrap); assert wrap.getOpCode() == OpCode.Close; if (wrap.getBinaryPayload().length >= 2) { this._closeCode = CloseCode.find((wrap.getBinaryPayload()[0] & 0xFF) << 8 | wrap.getBinaryPayload()[1] & 0xFF); this._closeReason = binary2Text(getBinaryPayload(), 2, getBinaryPayload().length - 2); } }
public WebSocketFrame(WebSocketFrame clone) { setOpCode(clone.getOpCode()); setFin(clone.isFin()); setBinaryPayload(clone.getBinaryPayload()); setMaskingKey(clone.getMaskingKey()); }
public String getTextPayload() { if (this._payloadString == null) { try { this._payloadString = binary2Text(getBinaryPayload()); } catch (CharacterCodingException e) { throw new RuntimeException("Undetected CharacterCodingException", e); } } return this._payloadString; }