@Override public void writeSuccess() { if (finished) notifyCallbackSuccess(current.callback); succeeded(); }
@Override public void writeFailed(Throwable x) { notifyCallbackFailure(current.callback,x); // If something went wrong, very likely the compression context // will be invalid, so we need to fail this IteratingCallback. failed(x); } }
public DeflateCompressionMethod() { /* * Specs specify that head/tail of deflate are not to be present. * * So lets not use the wrapped format of bytes. * * Setting nowrap to true prevents the Deflater from writing the head/tail bytes and the Inflater from expecting the head/tail bytes. */ boolean nowrap = true; this.compress = new DeflaterProcess(nowrap); this.decompress = new InflaterProcess(nowrap); }
@Override public synchronized void incomingFrame(Frame frame) { if (frame.getType().isControl() || !frame.isRsv1()) { // Cannot modify incoming control frames or ones with RSV1 set. nextIncomingFrame(frame); return; } ByteBuffer data = frame.getPayload(); method.decompress().input(data); while (!method.decompress().isDone()) { ByteBuffer uncompressed = method.decompress().process(); WebSocketFrame out = new WebSocketFrame(frame).setPayload(uncompressed); if (!method.decompress().isDone()) { out.setFin(false); } out.setRsv1(false); // Unset RSV1 on decompressed frame nextIncomingFrame(out); } // reset on every frame. // method.decompress().end(); }
@Override public synchronized void outgoingFrame(Frame frame, WriteCallback callback) { if (frame.getType().isControl()) { // skip, cannot compress control frames. nextOutgoingFrame(frame,callback); return; } ByteBuffer data = frame.getPayload(); // deflate data method.compress().input(data); while (!method.compress().isDone()) { ByteBuffer buf = method.compress().process(); WebSocketFrame out = new WebSocketFrame(frame).setPayload(buf); out.setRsv1(true); if (!method.compress().isDone()) { out.setFin(false); nextOutgoingFrame(frame,null); // no callback for start/end frames } else { nextOutgoingFrame(out,callback); // pass thru callback } } // reset on every frame. method.compress().end(); }
nextIncomingFrame(frame); return; method.decompress().input(data); while (!method.decompress().isDone()) ByteBuffer uncompressed = method.decompress().process(); if (uncompressed == null) if (!method.decompress().isDone()) nextIncomingFrame(out); method.decompress().end();
public void setBufferSize(int size) { if (size < 64) { throw new IllegalArgumentException("Buffer Size [" + size + "] cannot be less than 64 bytes"); } this.bufferSize = size; this.compress.setBufferSize(bufferSize); this.decompress.setBufferSize(bufferSize); } }
protected void forwardIncoming(Frame frame, ByteAccumulator accumulator) { DataFrame newFrame = new DataFrame(frame); // Unset RSV1 since it's not compressed anymore. newFrame.setRsv1(false); ByteBuffer buffer = getBufferPool().acquire(accumulator.getLength(),false); try { BufferUtil.flipToFill(buffer); accumulator.transferTo(buffer); newFrame.setPayload(buffer); nextIncomingFrame(newFrame); } finally { getBufferPool().release(buffer); } }
@Override public void outgoingFrame(Frame frame, WriteCallback callback, BatchMode batchMode) { // We use a queue and an IteratingCallback to handle concurrency. // We must compress and write atomically, otherwise the compression // context on the other end gets confused. if (flusher.isFailed()) { notifyCallbackFailure(callback,new ZipException()); return; } FrameEntry entry = new FrameEntry(frame,callback,batchMode); if (LOG.isDebugEnabled()) LOG.debug("Queuing {}",entry); offerEntry(entry); flusher.iterate(); }
protected CompressExtension() { tailDrop = getTailDropMode(); rsvUse = getRsvUseMode(); }
protected ByteAccumulator newByteAccumulator() { int maxSize = Math.max(getPolicy().getMaxTextMessageSize(),getPolicy().getMaxBinaryMessageSize()); return new ByteAccumulator(maxSize); }
@Override protected void nextOutgoingFrame(Frame frame, WriteCallback callback, BatchMode batchMode) { if (frame.isFin() && !outgoingContextTakeover) { LOG.debug("Outgoing Context Reset"); getDeflater().reset(); } super.nextOutgoingFrame(frame, callback, batchMode); }
@Override protected void nextIncomingFrame(Frame frame) { if (frame.isFin() && !incomingContextTakeover) { LOG.debug("Incoming Context Reset"); decompressCount.set(0); getInflater().reset(); } super.nextIncomingFrame(frame); }
@Override public void setConfig(ExtensionConfig config) { super.setConfig(config); String methodOptions = config.getParameter("method","deflate"); LOG.debug("Method requested: {}",methodOptions); method = new DeflateCompressionMethod(); }
@Override protected void onCompleteFailure(Throwable x) { // Fail all the frames in the queue. FrameEntry entry; while ((entry = pollEntry()) != null) notifyCallbackFailure(entry.callback,x); }
private void deflate(FrameEntry entry) { Frame frame = entry.frame; BatchMode batchMode = entry.batchMode; if (OpCode.isControlFrame(frame.getOpCode())) { // Do not deflate control frames nextOutgoingFrame(frame,this,batchMode); return; } compress(entry,true); }
@Override public synchronized void incomingFrame(Frame frame) { if (frame.getType().isControl() || !frame.isRsv1()) { // Cannot modify incoming control frames or ones with RSV1 set. nextIncomingFrame(frame); return; } ByteBuffer data = frame.getPayload(); method.decompress().input(data); while (!method.decompress().isDone()) { ByteBuffer uncompressed = method.decompress().process(); WebSocketFrame out = new WebSocketFrame(frame).setPayload(uncompressed); if (!method.decompress().isDone()) { out.setFin(false); } out.setRsv1(false); // Unset RSV1 on decompressed frame nextIncomingFrame(out); } // reset on every frame. // method.decompress().end(); }
public DeflateCompressionMethod() { /* * Specs specify that head/tail of deflate are not to be present. * * So lets not use the wrapped format of bytes. * * Setting nowrap to true prevents the Deflater from writing the head/tail bytes and the Inflater from expecting the head/tail bytes. */ boolean nowrap = true; this.compress = new DeflaterProcess(nowrap); this.decompress = new InflaterProcess(nowrap); }
public void setBufferSize(int size) { if (size < 64) { throw new IllegalArgumentException("Buffer Size [" + size + "] cannot be less than 64 bytes"); } this.bufferSize = size; this.compress.setBufferSize(bufferSize); this.decompress.setBufferSize(bufferSize); } }