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));