Exemplo n.º 1
0
  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;
  }
Exemplo n.º 2
0
  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;
  }
Exemplo n.º 3
0
 public void appendFragment(byte[] aData) {
   fragment = WebSocketUtil.appendArray(fragment, aData);
 }