protected byte[] getCloseMessageBytes(Integer aStatus, String aMessage) throws CharacterCodingException { byte[] results = null; if (aMessage != null) { byte[] temp = convertFromStringToBytes(aMessage); if (temp.length + 2 <= getMaxPayloadSize()) { byte[] statusBytes = new byte[] { new Integer(aStatus % 0x100).byteValue(), new Integer(aStatus / 0x100).byteValue() }; results = WebSocketUtil.appendArray(statusBytes, temp); } } else if (aStatus != null && aStatus > 0) { results = new byte[] { new Integer(aStatus % 0x100).byteValue(), new Integer(aStatus / 0x100).byteValue() }; } return results; }
public boolean parseHeader(byte[] aData, int aOffset) { // get header data bits int bufferLength = 14; byte[] data = aData; // do we have an existing fragment to work with if (getFragment() != null) { if (getFragment().length >= bufferLength) { data = getFragment(); } else { byte[] both; if ((aData != null ? aData.length : 0) - aOffset >= bufferLength - getFragment().length) { both = WebSocketUtil.appendPartialArray( getFragment(), aData, aOffset, bufferLength - getFragment().length); } else { both = WebSocketUtil.appendArray(getFragment(), aData); } data = both; } } if (data != null && data.length - aOffset < bufferLength) { bufferLength = data.length - aOffset; } if (bufferLength < 0 || data == null) { return false; } byte[] buffer = WebSocketUtil.copySubArray(data, 0, bufferLength); // determine opcode if (bufferLength > 0) { int index = 0; setFinal((buffer[index] & 0x80) != 0); setRSV1((buffer[index] & 0x40) != 0); setRSV2((buffer[index] & 0x20) != 0); setRSV3((buffer[index] & 0x20) != 0); setOpCode(buffer[index++] & 0x0F); // handle data depending on opcode switch (getOpCode()) { case TEXT: setPayloadType(PayloadType.TEXT); break; case BINARY: setPayloadType(PayloadType.BINARY); break; } // handle content, if any if (bufferLength > 1) { // do we have a mask boolean hasMask = (buffer[index] & 0x80) != 0; // get payload length Long dataLength = new Integer(buffer[index++] & 0x7F).longValue(); if (dataLength == 126) { // exit if we are missing bytes if (bufferLength < 4) { return false; } dataLength = new Integer(WebSocketUtil.convertBytesToShort(buffer, index)).longValue(); index += 2; } else if (dataLength == 127) { // exit if we are missing bytes if (bufferLength < 10) { return false; } dataLength = WebSocketUtil.convertBytesToLong(buffer, index); index += 8; } // if applicable, set mask value if (hasMask) { // exit if we are missing bytes if (bufferLength < index + 4) { return false; } // grab mask setMask(WebSocketUtil.convertBytesToInt(buffer, index)); index += 4; } payloadStart = index; if (dataLength > Integer.MAX_VALUE) { throw new IllegalArgumentException( "Implementation does not support payload lengths in excess of " + Integer.MAX_VALUE + ": " + dataLength); } payloadLength = dataLength.intValue(); return true; } } return false; }
public void appendFragment(byte[] aData) { fragment = WebSocketUtil.appendArray(fragment, aData); }