Esempio n. 1
0
 public void Http3FrameSending(string connectionId, long streamId, Http3RawFrame frame)
 {
     if (_http3Logger.IsEnabled(LogLevel.Trace))
     {
         Http3FrameSending(_http3Logger, connectionId, Http3Formatting.ToFormattedType(frame.Type), streamId, frame.Length);
     }
 }
Esempio n. 2
0
 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);
     }
 }
Esempio n. 3
0
            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];
        }
Esempio n. 5
0
            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();
                }
            }
Esempio n. 6
0
            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);
            }
Esempio n. 7
0
        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)));
        }
Esempio n. 8
0
    /* 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);
    }
Esempio n. 9
0
        //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;
        }
Esempio n. 10
0
 public void Http3FrameSending(string connectionId, long streamId, Http3RawFrame frame)
 {
 }
Esempio n. 11
0
 public void Http3FrameReceived(string connectionId, long streamId, Http3RawFrame frame)
 {
 }
Esempio n. 12
0
 public void Http3FrameSending(string connectionId, long streamId, Http3RawFrame frame)
 {
     _trace1.Http3FrameSending(connectionId, streamId, frame);
     _trace2.Http3FrameSending(connectionId, streamId, frame);
 }
Esempio n. 13
0
 public void Http3FrameReceived(string connectionId, long streamId, Http3RawFrame frame)
 {
     _trace1.Http3FrameReceived(connectionId, streamId, frame);
     _trace1.Http3FrameReceived(connectionId, streamId, frame);
 }
Esempio n. 14
0
 public void Http3FrameSending(string connectionId, long streamId, Http3RawFrame frame)
 {
     _http3FrameSending(_logger, connectionId, frame.Type, streamId, frame.Length, null);
 }