@Override public String toString() { IStream stream = getStream(); long streamId = stream == null ? -1 : stream.getId(); return String.format("%s#%d", super.toString(), streamId); }
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); }
private void sendTrailersFrame(MetaData metaData, Callback callback) { if (LOG.isDebugEnabled()) { LOG.debug("HTTP2 Response #{}/{}: trailers", stream.getId(), Integer.toHexString(stream.getSession().hashCode())); } HeadersFrame frame = new HeadersFrame(stream.getId(), metaData, null, true); stream.headers(frame, callback); }
public void setStream(IStream stream) { if (LOG.isDebugEnabled()) LOG.debug("{} setStream {}", this, stream.getId()); this.stream = stream; }
@Override public void abort(Throwable failure) { IStream stream = this.stream; if (LOG.isDebugEnabled()) LOG.debug("HTTP2 Response #{}/{} aborted", stream == null ? -1 : stream.getId(), stream == null ? -1 : Integer.toHexString(stream.getSession().hashCode())); if (stream != null) stream.reset(new ResetFrame(stream.getId(), ErrorCode.INTERNAL_ERROR.code), Callback.NOOP); }
private void sendHeadersFrame(MetaData.Response info, boolean endStream, Callback callback) { if (LOG.isDebugEnabled()) { LOG.debug("HTTP2 Response #{}/{}:{}{} {}{}{}", stream.getId(), Integer.toHexString(stream.getSession().hashCode()), System.lineSeparator(), HttpVersion.HTTP_2, info.getStatus(), System.lineSeparator(), info.getFields()); } HeadersFrame frame = new HeadersFrame(stream.getId(), info, null, endStream); stream.headers(frame, callback); }
@Override public void close() { IStream stream = getStream(); if (LOG.isDebugEnabled()) LOG.debug("HTTP2 Request #{}/{} rejected", stream.getId(), Integer.toHexString(stream.getSession().hashCode())); stream.reset(new ResetFrame(stream.getId(), ErrorCode.ENHANCE_YOUR_CALM_ERROR.code), Callback.NOOP); // Consume the existing queued data frames to // avoid stalling the session flow control. consumeInput(); } }
@Override public void removeStream(IStream stream) { IStream removed = streams.remove(stream.getId()); if (removed != null) { onStreamClosed(stream); flowControl.onStreamDestroyed(stream); if (LOG.isDebugEnabled()) LOG.debug("Removed {} {}", stream.isLocal() ? "local" : "remote", stream); } }
@Override public void removeStream(IStream stream) { IStream removed = streams.remove(stream.getId()); if (removed != null) { onStreamClosed(stream); flowControl.onStreamDestroyed(stream); if (LOG.isDebugEnabled()) LOG.debug("Removed {} {}", stream.isLocal() ? "local" : "remote", stream); } }
@Override public void succeeded() { boolean commit; Callback callback = null; synchronized (this) { commit = this.commit; if (state == State.WRITING) { this.state = State.IDLE; callback = this.callback; this.callback = null; this.commit = false; } } if (LOG.isDebugEnabled()) LOG.debug("HTTP2 Response #{}/{} {} {}", stream.getId(), Integer.toHexString(stream.getSession().hashCode()), commit ? "commit" : "flush", callback == null ? "failure" : "success"); if (callback != null) callback.succeeded(); }
private boolean onIdleTimeout(Throwable failure) { boolean result; Callback callback = null; synchronized (this) { // Ignore idle timeouts if not writing, // as the application may be suspended. result = state == State.WRITING; if (result) { this.state = State.TIMEOUT; callback = this.callback; this.callback = null; this.failure = failure; } } if (LOG.isDebugEnabled()) LOG.debug(String.format("HTTP2 Response #%d/%h idle timeout", stream.getId(), stream.getSession()), failure); if (result) callback.failed(failure); return result; } }
@Override public void onCompleted() { // If the stream is not closed, it is still reading the request content. // Send a reset to the other end so that it stops sending data. if (!stream.isClosed()) { if (LOG.isDebugEnabled()) LOG.debug("HTTP2 Response #{}: unconsumed request content, resetting stream", stream.getId()); stream.reset(new ResetFrame(stream.getId(), ErrorCode.CANCEL_STREAM_ERROR.code), Callback.NOOP); } // Consume the existing queued data frames to // avoid stalling the session flow control. HttpChannelOverHTTP2 channel = (HttpChannelOverHTTP2)stream.getAttachment(); if (channel != null) channel.consumeInput(); }
@Override public void failed(Throwable failure) { boolean commit; Callback callback = null; synchronized (this) { commit = this.commit; // Only fail pending writes, as we // may need to write an error page. if (state == State.WRITING) { this.state = State.FAILED; callback = this.callback; this.callback = null; this.failure = failure; } } if (LOG.isDebugEnabled()) LOG.debug(String.format("HTTP2 Response #%d/%h %s %s", stream.getId(), stream.getSession(), commit ? "commit" : "flush", callback == null ? "ignored" : "failed"), failure); if (callback != null) callback.failed(failure); }
if (LOG.isDebugEnabled()) LOG.debug("Data consumed, {} bytes, updated stream recv window by {}/{} for {}", length, level, maxLevel, stream); session.frames(stream, Callback.NOOP, new WindowUpdateFrame(stream.getId(), level), Frame.EMPTY_ARRAY);
if (LOG.isDebugEnabled()) LOG.debug("Data consumed, {} bytes, updated stream recv window by {}/{} for {}", length, level, maxLevel, stream); session.frames(stream, Callback.NOOP, new WindowUpdateFrame(stream.getId(), level), Frame.EMPTY_ARRAY);
@Override public void push(final MetaData.Request request) { if (!stream.getSession().isPushEnabled()) { if (LOG.isDebugEnabled()) LOG.debug("HTTP/2 Push disabled for {}", request); return; } if (LOG.isDebugEnabled()) LOG.debug("HTTP/2 Push {}", request); stream.push(new PushPromiseFrame(stream.getId(), 0, request), new Promise<Stream>() { @Override public void succeeded(Stream pushStream) { connection.push(connector, (IStream)pushStream, request); } @Override public void failed(Throwable x) { if (LOG.isDebugEnabled()) LOG.debug("Could not push " + request, x); } }, new Stream.Listener.Adapter()); // TODO: handle reset from the client ? }
streamFrame[0] = new WindowUpdateFrame(stream.getId(), length); stream.updateRecvWindow(length); if (LOG.isDebugEnabled())
streamFrame[0] = new WindowUpdateFrame(stream.getId(), length); stream.updateRecvWindow(length); if (LOG.isDebugEnabled())