/* (non-Javadoc) * @see org.eclipse.jetty.websocket.AbstractExtension#onFrame(byte, byte, org.eclipse.jetty.io.Buffer) */ @Override public void onFrame(byte flags, byte opcode, Buffer buffer) { if (getConnection().isControl(opcode) || !isFlag(flags, 1)) { super.onFrame(flags, opcode, buffer); return; } if (buffer.array() == null) buffer = buffer.asMutableBuffer(); int length = 0xff & buffer.get(); if (length >= 0x7e) { int b = (length == 0x7f) ? 8 : 2; length = 0; while (b-- > 0) length = 0x100 * length + (0xff & buffer.get()); } // TODO check a max framesize _inflater.setInput(buffer.array(), buffer.getIndex(), buffer.length()); ByteArrayBuffer buf = new ByteArrayBuffer(length); try { while (_inflater.getRemaining() > 0) { int inflated = _inflater.inflate(buf.array(), buf.putIndex(), buf.space()); if (inflated == 0) throw new DataFormatException("insufficient data"); buf.setPutIndex(buf.putIndex() + inflated); } super.onFrame(clearFlag(flags, 1), opcode, buf); } catch (DataFormatException e) { LOG.warn(e); getConnection().close(WebSocketConnectionRFC6455.CLOSE_BAD_PAYLOAD, e.toString()); } }