All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.firefly.codec.http2.stream.SimpleFlowControlStrategy Maven / Gradle / Ivy

There is a newer version: 4.0.3.2
Show newest version
package com.firefly.codec.http2.stream;

import com.firefly.codec.http2.frame.Frame;
import com.firefly.codec.http2.frame.WindowUpdateFrame;
import com.firefly.utils.concurrent.Callback;

public class SimpleFlowControlStrategy extends AbstractFlowControlStrategy {
	public SimpleFlowControlStrategy() {
		this(DEFAULT_WINDOW_SIZE);
	}

	public SimpleFlowControlStrategy(int initialStreamSendWindow) {
		super(initialStreamSendWindow);
	}

	@Override
	public void onDataConsumed(SessionSPI session, StreamSPI stream, int length) {
		if (length <= 0)
			return;

		// This is the simple algorithm for flow control.
		// This method is called when a whole flow controlled frame has been
		// consumed.
		// We send a WindowUpdate every time, even if the frame was very small.

		WindowUpdateFrame sessionFrame = new WindowUpdateFrame(0, length);
		session.updateRecvWindow(length);
		if (log.isDebugEnabled())
			log.debug("Data consumed, increased session recv window by {} for {}", length, session);

		Frame[] streamFrame = Frame.EMPTY_ARRAY;
		if (stream != null) {
			if (stream.isClosed()) {
				if (log.isDebugEnabled())
					log.debug("Data consumed, ignoring update stream recv window by {} for closed {}", length, stream);
			} else {
				streamFrame = new Frame[1];
				streamFrame[0] = new WindowUpdateFrame(stream.getId(), length);
				stream.updateRecvWindow(length);
				if (log.isDebugEnabled())
					log.debug("Data consumed, increased stream recv window by {} for {}", length, stream);
			}
		}

		session.frames(stream, Callback.NOOP, sessionFrame, streamFrame);
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy