//Incoming internal Http2Stream(HeadersList headers, int id, WriteQueue writeQueue, FlowControlManager flowCrtlManager, ICompressionProcessor comprProc, Priority priority = Priority.Pri3) : this(id, writeQueue, flowCrtlManager, comprProc, priority) { Headers = headers; }
//Outgoing internal Http2Stream(int id, WriteQueue writeQueue, FlowControlManager flowCrtlManager, int priority = Constants.DefaultStreamPriority) { if (id <= 0) { throw new ArgumentOutOfRangeException("invalid id for stream"); } if (priority < 0 || priority > Constants.MaxPriority) { throw new ArgumentOutOfRangeException("priority out of range"); } _id = id; Priority = priority; _writeQueue = writeQueue; _flowCrtlManager = flowCrtlManager; _unshippedFrames = new Queue <DataFrame>(16); Headers = new HeadersList(); SentDataAmount = 0; ReceivedDataAmount = 0; IsFlowControlBlocked = false; IsFlowControlEnabled = _flowCrtlManager.IsFlowControlEnabled; WindowSize = _flowCrtlManager.StreamsInitialWindowSize; _flowCrtlManager.NewStreamOpenedHandler(this); OnFrameSent += (sender, args) => FramesSent++; }
public Http2Session(SecureSocket sessionSocket, ConnectionEnd end, bool usePriorities, bool useFlowControl, IDictionary <string, object> handshakeResult = null) { _ourEnd = end; _usePriorities = usePriorities; _useFlowControl = useFlowControl; _handshakeHeaders = new Dictionary <string, string>(16); ApplyHandshakeResults(handshakeResult); if (_ourEnd == ConnectionEnd.Client) { _remoteEnd = ConnectionEnd.Server; _lastId = -1; // Streams opened by client are odd } else { _remoteEnd = ConnectionEnd.Client; _lastId = 0; // Streams opened by server are even } _goAwayReceived = false; _settingsManager = new SettingsManager(); _comprProc = new CompressionProcessor(_ourEnd); _sessionSocket = sessionSocket; _frameReader = new FrameReader(_sessionSocket); ActiveStreams = new ActiveStreams(); _writeQueue = new WriteQueue(_sessionSocket, ActiveStreams, _usePriorities); OurMaxConcurrentStreams = 100; //Spec recommends value 100 by default RemoteMaxConcurrentStreams = 100; _flowControlManager = new FlowControlManager(this); if (!_useFlowControl) { _flowControlManager.Options = (byte)FlowControlOptions.DontUseFlowControl; } SessionWindowSize = 0; }
//Outgoing internal Http2Stream(int id, WriteQueue writeQueue, FlowControlManager flowCrtlManager, ICompressionProcessor comprProc, Priority priority = Priority.Pri3) { _id = id; Priority = priority; _writeQueue = writeQueue; _compressionProc = comprProc; _flowCrtlManager = flowCrtlManager; _unshippedFrames = new Queue <DataFrame>(16); SentDataAmount = 0; ReceivedDataAmount = 0; IsFlowControlBlocked = false; IsFlowControlEnabled = _flowCrtlManager.IsStreamsFlowControlledEnabled; WindowSize = _flowCrtlManager.StreamsInitialWindowSize; _flowCrtlManager.NewStreamOpenedHandler(this); }
public void ProcessSettings(SettingsFrame settingsFrame, Http2Session session, FlowControlManager flCtrlManager) { for (int i = 0; i < settingsFrame.EntryCount; i++) { switch (settingsFrame[i].Id) { case SettingsIds.MaxCurrentStreams: session.RemoteMaxConcurrentStreams = settingsFrame[i].Value; break; case SettingsIds.InitialWindowSize: flCtrlManager.StreamsInitialWindowSize = settingsFrame[i].Value; break; case SettingsIds.FlowControlOptions: flCtrlManager.Options = settingsFrame[i].Value; break; } } }
public void ActiveStreamsSuccessful() { var handshakeResult = new Dictionary <string, object>(); var session = new Http2Session(null, ConnectionEnd.Client, true, true, handshakeResult); var testCollection = session.ActiveStreams; var fm = new FlowControlManager(session); testCollection[1] = new Http2Stream(null, 1, null, fm, null); testCollection[2] = new Http2Stream(null, 2, null, fm, null); testCollection[3] = new Http2Stream(null, 3, null, fm, null); testCollection[4] = new Http2Stream(null, 4, null, fm, null); fm.DisableStreamFlowControl(testCollection[2]); fm.DisableStreamFlowControl(testCollection[4]); Assert.Equal(testCollection.NonFlowControlledStreams.Count, 2); Assert.Equal(testCollection.FlowControlledStreams.Count, 2); bool gotException = false; try { testCollection[4] = new Http2Stream(null, 3, null, fm, null); } catch (ArgumentException) { gotException = true; } Assert.Equal(gotException, true); testCollection.Remove(4); Assert.Equal(testCollection.Count, 3); Assert.Equal(testCollection.ContainsKey(4), false); }
//Incoming internal Http2Stream(HeadersList headers, int id, WriteQueue writeQueue, FlowControlManager flowCrtlManager, int priority = Constants.DefaultStreamPriority) : this(id, writeQueue, flowCrtlManager, priority) { Headers = headers; }
public Http2Session(Stream stream, ConnectionEnd end, bool usePriorities, bool useFlowControl, bool isSecure, CancellationToken cancel, int initialWindowSize = Constants.InitialFlowControlWindowSize, int maxConcurrentStreams = Constants.DefaultMaxConcurrentStreams) { if (stream == null) { throw new ArgumentNullException("stream is null"); } if (cancel == null) { throw new ArgumentNullException("cancellation token is null"); } if (maxConcurrentStreams <= 0) { throw new ArgumentOutOfRangeException("maxConcurrentStreams cant be less or equal then 0"); } if (initialWindowSize <= 0 && useFlowControl) { throw new ArgumentOutOfRangeException("initialWindowSize cant be less or equal then 0"); } _ourEnd = end; _usePriorities = usePriorities; _useFlowControl = useFlowControl; _isSecure = isSecure; _cancelSessionToken = cancel; if (_ourEnd == ConnectionEnd.Client) { _remoteEnd = ConnectionEnd.Server; _lastId = -1; // Streams opened by client are odd //if we got unsecure connection then server will respond with id == 1. We cant initiate //new stream with id == 1. if (!(stream is SslStream)) { _lastId = 3; } } else { _remoteEnd = ConnectionEnd.Client; _lastId = 0; // Streams opened by server are even } _goAwayReceived = false; _comprProc = new CompressionProcessor(); _ioStream = stream; _frameReader = new FrameReader(_ioStream); _writeQueue = new WriteQueue(_ioStream, _comprProc, _usePriorities); OurMaxConcurrentStreams = maxConcurrentStreams; RemoteMaxConcurrentStreams = maxConcurrentStreams; InitialWindowSize = initialWindowSize; _flowControlManager = new FlowControlManager(this); if (!_useFlowControl) { _flowControlManager.Options = (byte)FlowControlOptions.DontUseFlowControl; } SessionWindowSize = 0; _headersSequences = new HeadersSequenceList(); _promisedResources = new Dictionary <int, string>(); StreamDictionary = new StreamDictionary(); for (byte i = 0; i < OurMaxConcurrentStreams; i++) { var http2Stream = new Http2Stream(new HeadersList(), i + 1, _writeQueue, _flowControlManager) { Idle = true }; StreamDictionary.Add(new KeyValuePair <int, Http2Stream>(i + 1, http2Stream)); } _flowControlManager.SetStreamDictionary(StreamDictionary); _writeQueue.SetStreamDictionary(StreamDictionary); }