/// <summary>
 /// Merge two instances of SMHeaders
 /// </summary>
 /// <param name="headers">SMHeaders object</param>
 public void Merge(SMHeaders headers)
 {
     foreach (var smheader in headers)
     {
         this[smheader.Key] = smheader.Value;
     }
 }
示例#2
0
        /// <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 SMStream OpenStream(int id, SMHeaders headers, bool isFinal)
        {
            if (id <= this.lastSeenStreamId)
            {
                this.End(StatusCode.ProtocolError);
                return(null);
            }

            this.lastSeenStreamId = id;

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

            stream.OnClose += this.OnCloseStream;
            stream.Open(headers, isFinal);

            this.streams.Add(stream);

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

            return(stream);
        }
示例#3
0
        private byte[] SerializeControlFrameHeaders(SMHeaders frameHeaders)
        {
            var headers = new List <byte>();

            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());
        }
示例#4
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(SMStream stream, SMHeaders headers, bool isFin)
 {
     this.SendFrame(stream, this.builder.BuildHeadersFrame(stream, headers, isFin));
 }
示例#5
0
 /// <summary>
 /// Sends the syn stream request.
 /// </summary>
 /// <param name="stream">The stream.</param>
 /// <param name="headers">The headers.</param>
 /// <param name="isFin">FIN flag.</param>
 public void SendSynStream(SMStream stream, SMHeaders headers, bool isFin)
 {
     this.SendFrame(this.builder.BuildSynStreamFrame(stream, headers, isFin));
 }
示例#6
0
 /// <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 SMStream OpenStream(SMHeaders headers, bool isFinal)
 {
     return(this.OpenStream(this.GenerateNewStreamId(), headers, isFinal));
 }