Esempio n. 1
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);
        }