示例#1
0
 /// <summary>
 /// Merge two instances of ProtocolHeaders
 /// </summary>
 /// <param name="headers">Protocoleaders object</param>
 public void Merge(ProtocolHeaders headers)
 {
     foreach (var smheader in headers)
     {
         this[smheader.Key] = smheader.Value;
     }
 }
示例#2
0
        public void SendSynReply(Http2Stream stream)
        {
            var headers = new ProtocolHeaders();

            headers[ProtocolHeaders.ContentType] = "text/plain";
            headers[ProtocolHeaders.Status]      = "200";
            headers[ProtocolHeaders.Version]     = "spdy/3";

            this.SendFrame(this.builder.BuildSynReplyFrame(stream, headers));
        }
        /// <summary>
        /// Opens the stream in current session.
        /// </summary>
        /// <param name="headers">The S+M headers.</param>
        /// <param name="isFinal">the final flag.</param>
        /// <returns>The Stream.</returns>
        public Http2Stream OpenStream(ProtocolHeaders headers, bool isFinal)
        {
            int newId = this.GenerateNewStreamId();

            if (this.State == ProtocolSessionState.Opened)
            {
                return(this.OpenStream(newId, headers, isFinal));
            }

            throw new InvalidOperationException("Session is not opened.");
        }
        private byte[] SerializeControlFrameHeaders(ProtocolHeaders frameHeaders)
        {
            var headers = new List <byte>(256);

            headers.AddRange(BinaryHelper.Int32ToBytes(frameHeaders.Count));
            foreach (KeyValuePair <string, string> pair in frameHeaders)
            {
                byte[] nameBin = Encoding.UTF8.GetBytes(pair.Key);

                headers.AddRange(BinaryHelper.Int32ToBytes(nameBin.Length));
                headers.AddRange(nameBin);

                byte[] valBin = Encoding.UTF8.GetBytes(pair.Value);
                headers.AddRange(BinaryHelper.Int32ToBytes(valBin.Length));

                headers.AddRange(valBin);
            }

            return(headers.ToArray());
        }
        /// <summary>
        /// Opens the stream in current session.
        /// </summary>
        /// <param name="id">the stream id.</param>
        /// <param name="headers">The S+M headers.</param>
        /// <param name="isFinal">the final flag.</param>
        /// <returns>The Stream.</returns>
        private Http2Stream OpenStream(int id, ProtocolHeaders headers, bool isFinal)
        {
            if (id <= this.lastSeenStreamId)
            {
                this.End(StatusCode.ProtocolError);
                return(null);
            }

            this.lastSeenStreamId = id;

            // don't have to wait for stream opening
            Http2Stream stream = new Http2Stream(id, this);

            this.streams.Add(stream);

            stream.OnClose += this.OnCloseStream;
            if (IsServer)
            {
                stream.OpenServer(headers, isFinal);

                // Settings must be sent for session once for session
                if (stream.StreamId <= 2)
                {
                    this.protocol.SendSettings(stream);
                }

                this.protocol.SendSynReply(stream);
            }
            else
            {
                stream.OpenClient(headers, isFinal);
            }

            if (this.OnStreamOpened != null)
            {
                this.OnStreamOpened(this, new StreamEventArgs(stream));
            }

            return(stream);
        }
示例#6
0
 /// <summary>
 /// Sends the headers.
 /// </summary>
 /// <param name="stream">The stream.</param>
 /// <param name="headers">The headers.</param>
 /// <param name="isFin">FIN flag.</param>
 public void SendHeaders(Http2Stream stream, ProtocolHeaders headers, bool isFin)
 {
     this.SendFrame(stream, this.builder.BuildHeadersFrame(stream, headers, isFin));
 }