public void Http3FrameSending(string connectionId, long streamId, Http3RawFrame frame) { if (_http3Logger.IsEnabled(LogLevel.Trace)) { Http3FrameSending(_http3Logger, connectionId, Http3Formatting.ToFormattedType(frame.Type), streamId, frame.Length); } }
public void Http3FrameReceived(string connectionId, long streamId, Http3RawFrame frame) { if (_logger.IsEnabled(LogLevel.Trace)) { _http3FrameReceived(_logger, connectionId, Http3Formatting.ToFormattedType(frame.Type), streamId, frame.Length, null); } }
internal async Task SendDataAsync(Memory <byte> data) { var outputWriter = _pair.Application.Output; var frame = new Http3RawFrame(); frame.PrepareData(); frame.Length = data.Length; Http3FrameWriter.WriteHeader(frame, outputWriter); await SendAsync(data.Span); }
//private int _unflushedBytes; public Http3FrameWriter(PipeWriter output, ConnectionContext connectionContext, ITimeoutControl timeoutControl, MinDataRate minResponseDataRate, string connectionId, MemoryPool <byte> memoryPool, IKestrelTrace log) { _outputWriter = output; _connectionContext = connectionContext; _timeoutControl = timeoutControl; _minResponseDataRate = minResponseDataRate; _memoryPool = memoryPool; _log = log; _outgoingFrame = new Http3RawFrame(); _flusher = new TimingPipeFlusher(_outputWriter, timeoutControl, log); _headerEncodingBuffer = new byte[_maxFrameSize]; }
internal async Task SendDataAsync(Memory <byte> data, bool endStream = false) { var outputWriter = _pair.Application.Output; var frame = new Http3RawFrame(); frame.PrepareData(); frame.Length = data.Length; Http3FrameWriter.WriteHeader(frame, outputWriter); await SendAsync(data.Span); if (endStream) { await _pair.Application.Output.CompleteAsync(); } }
public async Task <bool> SendHeadersAsync(IEnumerable <KeyValuePair <string, string> > headers) { var outputWriter = _pair.Application.Output; var frame = new Http3RawFrame(); frame.PrepareHeaders(); var buffer = _headerEncodingBuffer.AsMemory(); var done = _qpackEncoder.BeginEncode(headers, buffer.Span, out var length); frame.Length = length; // TODO may want to modify behavior of input frames to mock different client behavior (client can send anything). Http3FrameWriter.WriteHeader(frame, outputWriter); await SendAsync(buffer.Span.Slice(0, length)); return(done); }
public async Task ControlStream_UnexpectedFrameType_ConnectionError(string frameType) { await InitializeConnectionAsync(_noopApplication); var controlStream = await CreateControlStream(); var frame = new Http3RawFrame(); frame.Type = Enum.Parse <Http3FrameType>(frameType); await controlStream.SendFrameAsync(frame, Memory <byte> .Empty); await WaitForConnectionErrorAsync <Http3ConnectionErrorException>( ignoreNonGoAwayFrames : true, expectedLastStreamId : 0, expectedErrorCode : Http3ErrorCode.UnexpectedFrame, expectedErrorMessage : CoreStrings.FormatHttp3ErrorUnsupportedFrameOnControlStream(Http3Formatting.ToFormattedType(frame.Type))); }
/* https://quicwg.org/base-drafts/draft-ietf-quic-http.html#frame-layout * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type (i) ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Length (i) ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Frame Payload (*) ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ internal static bool TryReadFrame(ref ReadOnlySequence <byte> readableBuffer, Http3RawFrame frame, out ReadOnlySequence <byte> framePayload) { framePayload = ReadOnlySequence <byte> .Empty; SequencePosition consumed; SequencePosition examined; var type = VariableLengthIntegerHelper.GetInteger(readableBuffer, out consumed, out examined); if (type == -1) { return(false); } var firstLengthBuffer = readableBuffer.Slice(consumed); var length = VariableLengthIntegerHelper.GetInteger(firstLengthBuffer, out consumed, out examined); // Make sure the whole frame is buffered if (length == -1) { return(false); } var startOfFramePayload = readableBuffer.Slice(consumed); if (startOfFramePayload.Length < length) { return(false); } frame.Length = length; frame.Type = (Http3FrameType)type; // The remaining payload minus the extra fields framePayload = startOfFramePayload.Slice(0, length); readableBuffer = readableBuffer.Slice(framePayload.End); return(true); }
//private int _unflushedBytes; public Http3FrameWriter(PipeWriter output, ConnectionContext connectionContext, ITimeoutControl timeoutControl, MinDataRate?minResponseDataRate, string connectionId, MemoryPool <byte> memoryPool, IKestrelTrace log, IStreamIdFeature streamIdFeature, Http3PeerSettings clientPeerSettings, IHttp3Stream http3Stream) { _outputWriter = output; _connectionContext = connectionContext; _timeoutControl = timeoutControl; _minResponseDataRate = minResponseDataRate; _connectionId = connectionId; _memoryPool = memoryPool; _log = log; _streamIdFeature = streamIdFeature; _http3Stream = http3Stream; _outgoingFrame = new Http3RawFrame(); _flusher = new TimingPipeFlusher(_outputWriter, timeoutControl, log); _headerEncodingBuffer = new byte[_maxFrameSize]; // Note that max total header size value doesn't react to settings change during a stream. // Unlikely to be a problem in practice: // - Settings rarely change after the start of a connection. // - Response header size limits are a best-effort requirement in the spec. _maxTotalHeaderSize = clientPeerSettings.MaxRequestHeaderFieldSectionSize > int.MaxValue ? int.MaxValue : (int)clientPeerSettings.MaxRequestHeaderFieldSectionSize; }
public void Http3FrameSending(string connectionId, long streamId, Http3RawFrame frame) { }
public void Http3FrameReceived(string connectionId, long streamId, Http3RawFrame frame) { }
public void Http3FrameSending(string connectionId, long streamId, Http3RawFrame frame) { _trace1.Http3FrameSending(connectionId, streamId, frame); _trace2.Http3FrameSending(connectionId, streamId, frame); }
public void Http3FrameReceived(string connectionId, long streamId, Http3RawFrame frame) { _trace1.Http3FrameReceived(connectionId, streamId, frame); _trace1.Http3FrameReceived(connectionId, streamId, frame); }
public void Http3FrameSending(string connectionId, long streamId, Http3RawFrame frame) { _http3FrameSending(_logger, connectionId, frame.Type, streamId, frame.Length, null); }