Example #1
0
  @Override
  public void onReset(ResetFrame frame) {
    if (LOG.isDebugEnabled()) LOG.debug("Received {}", frame);

    IStream stream = getStream(frame.getStreamId());
    if (stream != null) stream.process(frame, Callback.NOOP);
    else notifyReset(this, frame);
  }
  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);
    flush();

    if (stream != null) removeStream(stream);
  }
 private void processData(final IStream stream, DataFrame frame, ByteBuffer data) {
   ByteBufferDataInfo dataInfo =
       new ByteBufferDataInfo(data, frame.isClose()) {
         @Override
         public void consume(int delta) {
           super.consume(delta);
           flowControlStrategy.onDataConsumed(StandardSession.this, stream, this, delta);
         }
       };
   flowControlStrategy.onDataReceived(this, stream, dataInfo);
   stream.process(dataInfo);
   if (stream.isClosed()) removeStream(stream);
 }
Example #4
0
  @Override
  public void onWindowUpdate(WindowUpdateFrame frame) {
    if (LOG.isDebugEnabled()) LOG.debug("Received {}", frame);

    int streamId = frame.getStreamId();
    if (streamId > 0) {
      IStream stream = getStream(streamId);
      if (stream != null) {
        stream.process(frame, Callback.NOOP);
        onWindowUpdate(stream, frame);
      }
    } else {
      onWindowUpdate(null, frame);
    }
  }
 @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);
       removeStream(stream);
     }
   }
 }
Example #6
0
  @Override
  public void onData(final DataFrame frame) {
    if (LOG.isDebugEnabled()) LOG.debug("Received {}", frame);

    int streamId = frame.getStreamId();
    final IStream stream = getStream(streamId);

    // SPEC: the session window must be updated even if the stream is null.
    // The flow control length includes the padding bytes.
    final int flowControlLength = frame.remaining() + frame.padding();
    flowControl.onDataReceived(this, stream, flowControlLength);

    if (stream != null) {
      if (getRecvWindow() < 0) {
        close(ErrorCode.FLOW_CONTROL_ERROR.code, "session_window_exceeded", Callback.NOOP);
      } else {
        stream.process(
            frame,
            new Callback() {
              @Override
              public void succeeded() {
                complete();
              }

              @Override
              public void failed(Throwable x) {
                // Consume also in case of failures, to free the
                // session flow control window for other streams.
                complete();
              }

              private void complete() {
                notIdle();
                stream.notIdle();
                flowControl.onDataConsumed(HTTP2Session.this, stream, flowControlLength);
              }
            });
      }
    } else {
      if (LOG.isDebugEnabled()) LOG.debug("Ignoring {}, stream #{} not found", frame, streamId);
      // We must enlarge the session flow control window,
      // otherwise other requests will be stalled.
      flowControl.onDataConsumed(this, null, flowControlLength);
    }
  }
 private void processSyn(SessionFrameListener listener, IStream stream, SynStreamFrame frame) {
   stream.process(frame);
   // Update the last stream id before calling the application (which may send a GO_AWAY)
   updateLastStreamId(stream);
   StreamFrameListener streamListener;
   if (stream.isUnidirectional()) {
     PushInfo pushInfo = new PushInfo(frame.getHeaders(), frame.isClose());
     streamListener =
         notifyOnPush(stream.getAssociatedStream().getStreamFrameListener(), stream, pushInfo);
   } else {
     SynInfo synInfo = new SynInfo(frame.getHeaders(), frame.isClose(), frame.getPriority());
     streamListener = notifyOnSyn(listener, stream, synInfo);
   }
   stream.setStreamFrameListener(streamListener);
   flush();
   // The onSyn() listener may have sent a frame that closed the stream
   if (stream.isClosed()) removeStream(stream);
 }
 private void processHeaders(IStream stream, HeadersFrame frame) {
   stream.process(frame);
   if (stream.isClosed()) removeStream(stream);
 }
 private void processReply(IStream stream, SynReplyFrame frame) {
   stream.process(frame);
   if (stream.isClosed()) removeStream(stream);
 }