Exemple #1
0
        internal async Task WriteFrame(HTTP2Frame frame)
        {
            try
            {
                StringBuilder s = new StringBuilder();
                s.AppendLine("---------------");
                s.AppendLine("Send frame: ");
                s.AppendLine(frame.ToString());
                s.AppendLine("---------------");
                Console.WriteLine(s);
                if (_useSsl)
                {
                    await _sslWriter.FlushAsync();

                    await _sslWriter.WriteAsync(frame.GetBytes(), 0, frame.GetBytes().Length);
                }
                else
                {
                    await _http2Writer.FlushAsync();

                    await _http2Writer.WriteAsync(frame.GetBytes(), 0, frame.GetBytes().Length);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("WriteFrame()\n" + ex);
            }
        }
 internal void SendFrame(HTTP2Frame frame)
 {
     if (OutgoingStreams.Find(x => x.Id == frame.StreamIdentifier)?.State == StreamState.Closed)
     {
         return;
     }
     if (IncomingStreams.Find(x => x.Id == frame.StreamIdentifier)?.State == StreamState.Closed)
     {
         return;
     }
     lock (lockFramesToSend)
     {
         framesToSend.Enqueue(frame);
     }
 }
 private async void SendThread()
 {
     while (sendFramesThreadAlive)
     {
         if (framesToSend.Count > 0)
         {
             // send
             HTTP2Frame frametosend = null;
             lock (this)
             {
                 frametosend = framesToSend.Dequeue();
             }
             await Task.Run(() => owner.WriteFrame(frametosend));
         }
         else
         {
             Thread.Sleep(100); // todo bedre løsning
         }
     }
 }
 public void TestAddSettingsPayload()
 {
     var frame    = new HTTP2Frame(8);
     var settings = new(ushort, uint)[] { (SETTINGS_INITIAL_WINDOW_SIZE, 0x1000), (SETTINGS_ENABLE_PUSH, 0x0) };
 internal void SendFrameImmmediate(HTTP2Frame frame)
 {
     Task.Run(() => owner.WriteFrame(frame));
 }
        internal void AddIncomingFrame(HTTP2Frame frame)
        {
            StringBuilder s = new StringBuilder();

            s.AppendLine("-----------------");
            switch (frame.Type)
            {
            case HTTP2Frame.DATA:
                s.AppendLine("DATA frame received\n" + frame.ToString());
                if (frame.StreamIdentifier == 0)
                {
                    // todo svar med protocol error
                }
                GetIncommingStreams(frame.StreamIdentifier).Frames.Add(frame);
                if (frame.FlagEndStream)
                {
                    EndOfStream(frame.StreamIdentifier);
                    break;
                }
                DataPayload dp = frame.GetDataPayloadDecoded();
                if (dp.Data != null)
                {
                    s.AppendLine(Encoding.ASCII.GetString(dp.Data));
                }
                break;

            case HTTP2Frame.HEADERS:
                s.AppendLine("HEADERS frame received\n" + frame.ToString());
                GetIncommingStreams(frame.StreamIdentifier).Frames.Add(frame);
                if (frame.FlagEndStream)
                {
                    EndOfStream(frame.StreamIdentifier);
                    break;
                }
                //s.AppendLine(frame.ToString());
                break;

            case HTTP2Frame.PRIORITY_TYPE:
                s.AppendLine("PRIORITY_TYPE frame received\n" + frame.ToString());
                break;

            case HTTP2Frame.RST_STREAM:
                s.AppendLine("RST_STREAM frame received\n" + frame.ToString());
                RSTStreamPayload rst = frame.GetRSTStreamPayloadDecoded();
                s.AppendLine($"Error code: {rst.ErrorCode} on stream: {frame.StreamIdentifier}");
                CloseStream(frame.StreamIdentifier);
                break;

            case HTTP2Frame.SETTINGS:
                s.AppendLine("SETTINGS frame received\n" + frame.ToString());
                if (frame.StreamIdentifier != 0)
                {
                    // send protocol error
                    break;
                }
                SettingsPayload sp = frame.GetSettingsPayloadDecoded();
                s.AppendLine(sp.ToString());
                owner.settings.ApplySettings(sp.Settings);
                if (frame.FlagAck)
                {
                    break;
                }
                SendFrame(new HTTP2Frame(0).AddSettingsPayload(new (ushort, uint)[0], true));