public int generate(ByteBufferPool.Lease lease, DataFrame frame, int maxLength) { return generateData(lease, frame.getStreamId(), frame.getData(), frame.isEndStream(), maxLength); }
private DataEntry(DataFrame frame, IStream stream, Callback callback) { super(frame, stream, callback); // We don't do any padding, so the flow control length is // always the data remaining. This simplifies the handling // of data frames that cannot be completely written due to // the flow control window exhausting, since in that case // we would have to count the padding only once. dataRemaining = frame.remaining(); }
@Override protected Action process() { DataInfo dataInfo; synchronized (this) { dataInfo = queue.poll(); } if (dataInfo == null) { DataInfo prevDataInfo = this.dataInfo; if (prevDataInfo != null && prevDataInfo.frame.isEndStream()) return Action.SUCCEEDED; return Action.IDLE; } this.dataInfo = dataInfo; ByteBuffer buffer = dataInfo.frame.getData(); if (buffer.hasRemaining()) responseContent(dataInfo.exchange, buffer, this); else succeeded(); return Action.SCHEDULED; }
LOG.debug("Received {}", frame); int streamId = frame.getStreamId(); IStream stream = getStream(streamId); int flowControlLength = frame.remaining() + frame.padding(); flowControl.onDataReceived(this, stream, flowControlLength);
private void sendDataFrame(ByteBuffer content, boolean lastContent, boolean endStream, Callback callback) { if (LOG.isDebugEnabled()) { LOG.debug("HTTP2 Response #{}/{}: {} content bytes{}", stream.getId(), Integer.toHexString(stream.getSession().hashCode()), content.remaining(), lastContent ? " (last chunk)" : ""); } DataFrame frame = new DataFrame(stream.getId(), content, endStream); stream.data(frame, callback); }
dataLength -= frame.remaining(); if (frame.isEndStream() && dataLength != 0) if (updateClose(frame.isEndStream(), CloseState.Event.RECEIVED)) session.removeStream(this);
@Override public void succeeded() { bytesWritten.addAndGet(frameBytes); frameBytes = 0; frameRemaining = 0; flowControl.onDataSent(stream, dataBytes); dataBytes = 0; // Do we have more to send ? DataFrame dataFrame = (DataFrame)frame; if (getDataBytesRemaining() == 0) { // Only now we can update the close state // and eventually remove the stream. if (stream.updateClose(dataFrame.isEndStream(), CloseState.Event.AFTER_SEND)) removeStream(stream); super.succeeded(); } } }
@Override public void onData(Stream stream, DataFrame frame, Callback callback) { byte[] bytes = new byte[frame.getData().remaining()]; frame.getData().get(bytes); int duration = (int) TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - startTime); System.out.println("After " + duration + " seconds: " + new String(bytes)); callback.succeeded(); } };
ByteBuffer buffer = frame.getData(); int length = buffer.remaining(); boolean handle = onContent(new HttpInput.Content(buffer) boolean endStream = frame.isEndStream(); if (endStream)
LOG.debug("Received {}", frame); int streamId = frame.getStreamId(); IStream stream = getStream(streamId); int flowControlLength = frame.remaining() + frame.padding(); flowControl.onDataReceived(this, stream, flowControlLength);
private void onData(ByteBuffer buffer, boolean fragment, int padding) { DataFrame frame = new DataFrame(getStreamId(), buffer, !fragment && isEndStream(), padding); notifyData(frame); }
dataLength -= frame.remaining(); if (frame.isEndStream() && dataLength != 0) if (updateClose(frame.isEndStream(), CloseState.Event.RECEIVED)) session.removeStream(this);
@Override public void succeeded() { bytesWritten.addAndGet(frameBytes); frameBytes = 0; frameRemaining = 0; flowControl.onDataSent(stream, dataBytes); dataBytes = 0; // Do we have more to send ? DataFrame dataFrame = (DataFrame)frame; if (getDataBytesRemaining() == 0) { // Only now we can update the close state // and eventually remove the stream. if (stream.updateClose(dataFrame.isEndStream(), CloseState.Event.AFTER_SEND)) removeStream(stream); super.succeeded(); } } }
public int generate(ByteBufferPool.Lease lease, DataFrame frame, int maxLength) { return generateData(lease, frame.getStreamId(), frame.getData(), frame.isEndStream(), maxLength); }
private void onData(ByteBuffer buffer, boolean fragment, int padding) { DataFrame frame = new DataFrame(getStreamId(), buffer, !fragment && isEndStream(), padding); notifyData(frame); }
@Override protected boolean generate(ByteBufferPool.Lease lease) { int dataRemaining = getDataBytesRemaining(); int sessionSendWindow = getSendWindow(); int streamSendWindow = stream.updateSendWindow(0); int window = Math.min(streamSendWindow, sessionSendWindow); if (window <= 0 && dataRemaining > 0) return false; int length = Math.min(dataRemaining, window); // Only one DATA frame is generated. DataFrame dataFrame = (DataFrame)frame; int frameBytes = generator.data(lease, dataFrame, length); this.frameBytes += frameBytes; this.frameRemaining += frameBytes; int dataBytes = frameBytes - Frame.HEADER_LENGTH; this.dataBytes += dataBytes; this.dataRemaining -= dataBytes; if (LOG.isDebugEnabled()) LOG.debug("Generated {}, length/window/data={}/{}/{}", dataFrame, dataBytes, window, dataRemaining); flowControl.onDataSending(stream, dataBytes); stream.updateClose(dataFrame.isEndStream(), CloseState.Event.BEFORE_SEND); return true; }
private DataEntry(DataFrame frame, IStream stream, Callback callback) { super(frame, stream, callback); // We don't do any padding, so the flow control length is // always the data remaining. This simplifies the handling // of data frames that cannot be completely written due to // the flow control window exhausting, since in that case // we would have to count the padding only once. dataRemaining = frame.remaining(); }
@Override protected void sendContent(HttpExchange exchange, HttpContent content, Callback callback) { if (content.isConsumed()) { callback.succeeded(); } else { Stream stream = getHttpChannel().getStream(); Supplier<HttpFields> trailers = exchange.getRequest().getTrailers(); DataFrame frame = new DataFrame(stream.getId(), content.getByteBuffer(), trailers == null && content.isLast()); stream.data(frame, callback); } }
@Override protected boolean generate(ByteBufferPool.Lease lease) { int dataRemaining = getDataBytesRemaining(); int sessionSendWindow = getSendWindow(); int streamSendWindow = stream.updateSendWindow(0); int window = Math.min(streamSendWindow, sessionSendWindow); if (window <= 0 && dataRemaining > 0) return false; int length = Math.min(dataRemaining, window); // Only one DATA frame is generated. DataFrame dataFrame = (DataFrame)frame; int frameBytes = generator.data(lease, dataFrame, length); this.frameBytes += frameBytes; this.frameRemaining += frameBytes; int dataBytes = frameBytes - Frame.HEADER_LENGTH; this.dataBytes += dataBytes; this.dataRemaining -= dataBytes; if (LOG.isDebugEnabled()) LOG.debug("Generated {}, length/window/data={}/{}/{}", dataFrame, dataBytes, window, dataRemaining); flowControl.onDataSending(stream, dataBytes); stream.updateClose(dataFrame.isEndStream(), CloseState.Event.BEFORE_SEND); return true; }
if (advanced || lastContent) DataFrame dataFrame = new DataFrame(stream.getId(), content.getByteBuffer(), lastContent); stream.data(dataFrame, callback); return;