Beispiel #1
0
 //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;
 }
Beispiel #2
0
        //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++;
        }
Beispiel #3
0
        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;
        }
Beispiel #4
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);
        }
Beispiel #5
0
        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;
                }
            }
        }
Beispiel #6
0
        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);
        }
Beispiel #7
0
 //Incoming
 internal Http2Stream(HeadersList headers, int id,
                      WriteQueue writeQueue, FlowControlManager flowCrtlManager, int priority = Constants.DefaultStreamPriority)
     : this(id, writeQueue, flowCrtlManager, priority)
 {
     Headers = headers;
 }
Beispiel #8
0
        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);
        }