@Override public void onRst(Session serverSession, RstInfo serverRstInfo) { Stream serverStream = serverSession.getStream(serverRstInfo.getStreamId()); if (serverStream != null) { Stream clientStream = (Stream)serverStream.getAttribute(CLIENT_STREAM_ATTRIBUTE); if (clientStream != null) { Session clientSession = clientStream.getSession(); RstInfo clientRstInfo = new RstInfo(clientStream.getId(), serverRstInfo.getStreamStatus()); clientSession.rst(clientRstInfo, Callback.Adapter.INSTANCE); } } }
@Override public void rst(RstInfo rstInfo, Callback callback) { // SPEC v3, 2.2.2 if (goAwaySent.get()) { complete(callback); } else { int streamId = rstInfo.getStreamId(); IStream stream = streams.get(streamId); RstStreamFrame frame = new RstStreamFrame(version, streamId, rstInfo.getStreamStatus().getCode(version)); control(stream, frame, rstInfo.getTimeout(), rstInfo.getUnit(), callback); if (stream != null) { stream.process(frame); flusher.removeFrameBytesFromQueue(stream); removeStream(stream); } } }
@Override public void rst(RstInfo rstInfo) throws InterruptedException, ExecutionException, TimeoutException { FutureCallback result = new FutureCallback(); rst(rstInfo, result); if (rstInfo.getTimeout() > 0) result.get(rstInfo.getTimeout(), rstInfo.getUnit()); else result.get(); }
private void rst(Stream stream) { RstInfo rstInfo = new RstInfo(stream.getId(), StreamStatus.REFUSED_STREAM); stream.getSession().rst(rstInfo, Callback.Adapter.INSTANCE); }
private void rst(Stream stream) { RstInfo rstInfo = new RstInfo(stream.getId(), StreamStatus.REFUSED_STREAM); stream.getSession().rst(rstInfo, Callback.Adapter.INSTANCE); }
@Override public void onRst(Session serverSession, RstInfo serverRstInfo) { Stream serverStream = serverSession.getStream(serverRstInfo.getStreamId()); if (serverStream != null) { Stream clientStream = (Stream)serverStream.getAttribute(CLIENT_STREAM_ATTRIBUTE); if (clientStream != null) { Session clientSession = clientStream.getSession(); RstInfo clientRstInfo = new RstInfo(clientStream.getId(), serverRstInfo.getStreamStatus()); clientSession.rst(clientRstInfo, getTimeout(), TimeUnit.MILLISECONDS, new Handler.Adapter<Void>()); } } }
private void rst(Stream stream) { RstInfo rstInfo = new RstInfo(stream.getId(), StreamStatus.REFUSED_STREAM); stream.getSession().rst(rstInfo); }
@Override public void onStreamException(StreamException x) { notifyOnFailure(listener, x); // TODO: notify StreamFrameListener if exists? rst(new RstInfo(x.getStreamId(), x.getStreamStatus()), Callback.Adapter.INSTANCE); }
private void onReply(SynReplyFrame frame) { int streamId = frame.getStreamId(); IStream stream = streams.get(streamId); if (stream == null) { RstInfo rstInfo = new RstInfo(streamId, StreamStatus.INVALID_STREAM); if (LOG.isDebugEnabled()) LOG.debug("Unknown stream {}", rstInfo); rst(rstInfo, Callback.Adapter.INSTANCE); } else { processReply(stream, frame); } }
private void onHeaders(HeadersFrame frame) { int streamId = frame.getStreamId(); IStream stream = streams.get(streamId); if (stream == null) { RstInfo rstInfo = new RstInfo(streamId, StreamStatus.INVALID_STREAM); if (LOG.isDebugEnabled()) LOG.debug("Unknown stream, {}", rstInfo); rst(rstInfo, Callback.Adapter.INSTANCE); } else { processHeaders(stream, frame); } }
private void rst(Stream stream) { RstInfo rstInfo = new RstInfo(stream.getId(), StreamStatus.REFUSED_STREAM); stream.getSession().rst(rstInfo, getTimeout(), TimeUnit.MILLISECONDS, new Handler.Adapter<Void>()); }
private void onRst(RstStreamFrame frame) { IStream stream = streams.get(frame.getStreamId()); if (stream != null) stream.process(frame); RstInfo rstInfo = new RstInfo(frame.getStreamId(), StreamStatus.from(frame.getVersion(), frame.getStatusCode())); notifyOnRst(listener, rstInfo); if (stream != null) removeStream(stream); }
@Override public void data(DataInfo dataInfo, Callback callback) { notIdle(); if (!canSend()) { session.rst(new RstInfo(getId(), StreamStatus.PROTOCOL_ERROR), new StreamCallback()); throw new IllegalStateException("Protocol violation: cannot send a DATA frame before a SYN_REPLY frame"); } if (isLocallyClosed()) { session.rst(new RstInfo(getId(), StreamStatus.PROTOCOL_ERROR), new StreamCallback()); throw new IllegalStateException("Protocol violation: cannot send a DATA frame on a locally closed stream"); } // Cannot update the close state here, because the data that we send may // be flow controlled, so we need the stream to update the window size. session.data(this, dataInfo, dataInfo.getTimeout(), dataInfo.getUnit(), new StreamCallback(callback)); }
if (stream == null) RstInfo rstInfo = new RstInfo(streamId, StreamStatus.INVALID_STREAM); if (LOG.isDebugEnabled()) LOG.debug("Unknown stream {}", rstInfo);
private void respond(Stream stream, int status) { if (stream.isUnidirectional()) { stream.getSession().rst(new RstInfo(stream.getId(), StreamStatus.INTERNAL_ERROR)); } else { Headers headers = new Headers(); headers.put(HTTPSPDYHeader.STATUS.name(version), String.valueOf(status)); headers.put(HTTPSPDYHeader.VERSION.name(version), "HTTP/1.1"); stream.reply(new ReplyInfo(headers, true)); } }
@Override public void headers(HeadersInfo headersInfo, Callback callback) { notIdle(); if (!canSend()) { session.rst(new RstInfo(getId(), StreamStatus.PROTOCOL_ERROR), new StreamCallback()); throw new IllegalStateException("Protocol violation: cannot send a HEADERS frame before a SYN_REPLY frame"); } if (isLocallyClosed()) { session.rst(new RstInfo(getId(), StreamStatus.PROTOCOL_ERROR), new StreamCallback()); throw new IllegalStateException("Protocol violation: cannot send a HEADERS frame on a closed stream"); } updateCloseState(headersInfo.isClose(), true); HeadersFrame frame = new HeadersFrame(session.getVersion(), headersInfo.getFlags(), getId(), headersInfo.getHeaders()); session.control(this, frame, headersInfo.getTimeout(), headersInfo.getUnit(), new StreamCallback(callback)); }
throw duplicateIdException; RstInfo rstInfo = new RstInfo(streamId, StreamStatus.PROTOCOL_ERROR); if (LOG.isDebugEnabled()) LOG.debug("Duplicate stream, {}", rstInfo);
try clientStream.getSession().rst(new RstInfo(clientStream.getId(), StreamStatus.INTERNAL_ERROR));
@Override public void process(DataInfo dataInfo) { notIdle(); // TODO: in v3 we need to send a rst instead of just ignoring // ignore data frame if this stream is remotelyClosed already if (isRemotelyClosed()) { if (LOG.isDebugEnabled()) LOG.debug("Stream is remotely closed, ignoring {}", dataInfo); return; } if (!canReceive()) { if (LOG.isDebugEnabled()) LOG.debug("Protocol error receiving {}, resetting", dataInfo); session.rst(new RstInfo(getId(), StreamStatus.PROTOCOL_ERROR), Callback.Adapter.INSTANCE); return; } updateCloseState(dataInfo.isClose(), false); notifyOnData(dataInfo); }