package com.webpieces.http2engine.impl.shared; import org.webpieces.javasm.api.Memento; import com.webpieces.http2engine.api.client.Http2ResponseListener; import com.webpieces.http2engine.api.client.PushPromiseListener; import com.webpieces.http2engine.api.server.StreamReference; import com.webpieces.http2parser.api.ParseFailReason; import com.webpieces.http2parser.api.StreamException; public class Stream { private Memento currentState; private Http2ResponseListener responseListener; private PushPromiseListener pushListener; private int streamId; private long remoteWindowSize; private long localWindowSize; private long remoteInitialWindowSize; private volatile boolean isClosed = false; private StreamReference streamWriter; private boolean headersSent; public Stream( int streamId, Memento currentState, Http2ResponseListener responseListener, PushPromiseListener pushListener, long localInitialWindowSize, long remoteInitialWindowSize ) { this.streamId = streamId; this.currentState = currentState; this.responseListener = responseListener; this.pushListener = pushListener; localWindowSize = localInitialWindowSize; remoteWindowSize = remoteInitialWindowSize; this.remoteInitialWindowSize = remoteInitialWindowSize; } public int getStreamId() { return streamId; } public Memento getCurrentState() { return currentState; } public Http2ResponseListener getResponseListener() { return responseListener; } public PushPromiseListener getPushListener() { return pushListener; } public long incrementRemoteWindow(long windowSizeIncrement) { remoteWindowSize+= windowSizeIncrement; if(remoteWindowSize > Integer.MAX_VALUE) { throw new StreamException(ParseFailReason.FLOW_CONTROL_ERROR, streamId, "(remote end bad)remoteWindowSize too large="+remoteWindowSize+" from windows increment="+windowSizeIncrement+" streamId="+streamId); } return remoteWindowSize; } public long getRemoteWindowSize() { return remoteWindowSize; } public void updateInitialWindow(long initialWindow) { long difference = initialWindow - remoteInitialWindowSize; remoteInitialWindowSize = initialWindow; //reset this streams initial window size in case it changes again remoteWindowSize += difference; } public long getLocalWindowSize() { return localWindowSize; } public void incrementLocalWindow(long windowSizeIncrement) { localWindowSize += windowSizeIncrement; if(localWindowSize > Integer.MAX_VALUE) { throw new IllegalStateException("Bug, somehow local window got too large"); } } public void setIsClosed(boolean b) { isClosed = b; } public boolean isClosed() { return isClosed; } public void setStreamWriter(StreamReference writer) { this.streamWriter = writer; } public StreamReference getStreamWriter() { return streamWriter; } public boolean isPushStream() { return streamId % 2 == 0; } public boolean isHeadersSent() { return headersSent; } public void setHeadersSent(boolean b) { headersSent = b; } }