public Task WriteResponseTrailers(int streamId, HttpResponseTrailers headers)
        {
            lock (_writeLock)
            {
                if (_completed)
                {
                    return(Task.CompletedTask);
                }

                try
                {
                    _outgoingFrame.PrepareHeaders(Http2HeadersFrameFlags.END_STREAM, streamId);
                    var buffer = _headerEncodingBuffer.AsSpan();
                    var done   = _hpackEncoder.BeginEncode(EnumerateHeaders(headers), buffer, out var payloadLength);
                    FinishWritingHeaders(streamId, payloadLength, done);
                }
                catch (HPackEncodingException hex)
                {
                    _log.HPackEncodingError(_connectionId, streamId, hex);
                    _http2Connection.Abort(new ConnectionAbortedException(hex.Message, hex));
                }

                return(TimeFlushUnsynchronizedAsync());
            }
        }
        public void Initialize_ChangeHeadersSource_EnumeratorUsesNewSource()
        {
            var responseHeaders = new HttpResponseHeaders();

            responseHeaders.Append("Name1", "Value1");
            responseHeaders.Append("Name2", "Value2-1");
            responseHeaders.Append("Name2", "Value2-2");

            var e = new Http2HeadersEnumerator();

            e.Initialize(responseHeaders);

            Assert.True(e.MoveNext());
            Assert.Equal("Name1", e.Current.Key);
            Assert.Equal("Value1", e.Current.Value);
            Assert.Equal(-1, e.HPackStaticTableId);

            Assert.True(e.MoveNext());
            Assert.Equal("Name2", e.Current.Key);
            Assert.Equal("Value2-1", e.Current.Value);
            Assert.Equal(-1, e.HPackStaticTableId);

            Assert.True(e.MoveNext());
            Assert.Equal("Name2", e.Current.Key);
            Assert.Equal("Value2-2", e.Current.Value);
            Assert.Equal(-1, e.HPackStaticTableId);

            var responseTrailers = new HttpResponseTrailers
            {
                HeaderGrpcStatus = "1"
            };

            responseTrailers.Append("Name1", "Value1");
            responseTrailers.Append("Name2", "Value2-1");
            responseTrailers.Append("Name2", "Value2-2");

            e.Initialize(responseTrailers);

            Assert.True(e.MoveNext());
            Assert.Equal("Grpc-Status", e.Current.Key);
            Assert.Equal("1", e.Current.Value);
            Assert.Equal(-1, e.HPackStaticTableId);

            Assert.True(e.MoveNext());
            Assert.Equal("Name1", e.Current.Key);
            Assert.Equal("Value1", e.Current.Value);
            Assert.Equal(-1, e.HPackStaticTableId);

            Assert.True(e.MoveNext());
            Assert.Equal("Name2", e.Current.Key);
            Assert.Equal("Value2-1", e.Current.Value);
            Assert.Equal(-1, e.HPackStaticTableId);

            Assert.True(e.MoveNext());
            Assert.Equal("Name2", e.Current.Key);
            Assert.Equal("Value2-2", e.Current.Value);
            Assert.Equal(-1, e.HPackStaticTableId);

            Assert.False(e.MoveNext());
        }
 public void Initialize(HttpResponseTrailers headers)
 {
     EncodingSelector    = headers.EncodingSelector;
     _trailersEnumerator = headers.GetEnumerator();
     _headersType        = HeadersType.Trailers;
     _hasMultipleValues  = false;
 }
        public void CanIterateOverResponseTrailers()
        {
            var responseTrailers = new HttpResponseTrailers
            {
                ContentLength = 9,
                HeaderETag    = "ETag!"
            };

            responseTrailers.Append("Name1", "Value1");
            responseTrailers.Append("Name2", "Value2-1");
            responseTrailers.Append("Name2", "Value2-2");
            responseTrailers.Append("Name3", "Value3");

            var e = new Http2HeadersEnumerator();

            e.Initialize(responseTrailers);

            var headers = GetNormalizedHeaders(e);

            Assert.Equal(new[]
            {
                CreateHeaderResult(H2StaticTable.ETag, "ETag", "ETag!"),
                CreateHeaderResult(-1, "Name1", "Value1"),
                CreateHeaderResult(-1, "Name2", "Value2-1"),
                CreateHeaderResult(-1, "Name2", "Value2-2"),
                CreateHeaderResult(-1, "Name3", "Value3"),
            }, headers);
        }
Beispiel #5
0
        public void CanIterateOverResponseTrailers()
        {
            var responseTrailers = new HttpResponseTrailers
            {
                ContentLength = 9,
                HeaderETag    = "ETag!"
            };

            responseTrailers.Append("Name1", "Value1");
            responseTrailers.Append("Name2", "Value2-1");
            responseTrailers.Append("Name2", "Value2-2");
            responseTrailers.Append("Name3", "Value3");

            var e = new Http2HeadersEnumerator();

            e.Initialize(responseTrailers);

            var headers = GetNormalizedHeaders(e);

            Assert.Equal(new[]
            {
                new KeyValuePair <string, string>("ETag", "ETag!"),
                new KeyValuePair <string, string>("Name1", "Value1"),
                new KeyValuePair <string, string>("Name2", "Value2-1"),
                new KeyValuePair <string, string>("Name2", "Value2-2"),
                new KeyValuePair <string, string>("Name3", "Value3"),
            }, headers);
        }
        public static HttpHeaders GetResponseTrailers(HttpResponseMessage response)
        {
#if NETSTANDARD2_1 || UNITTEST
            return(response.TrailingHeaders);
#else
            HttpResponseTrailers responseTrailers = new HttpResponseTrailers();
            response.RequestMessage.Properties[RequestMessagePropertyName] = responseTrailers;
            return(responseTrailers);
#endif
        }
Beispiel #7
0
        public void Initialize(HttpResponseTrailers headers)
        {
            _headersEnumerator  = default;
            _trailersEnumerator = headers.GetEnumerator();
            _genericEnumerator  = null;
            _isTrailers         = true;

            _stringValuesEnumerator = default;
            Current = default;
        }
 internal Enumerator(HttpResponseTrailers collection)
 {
     _collection        = collection;
     _currentBits       = collection._bits;
     _next              = _currentBits != 0 ? BitOperations.TrailingZeroCount(_currentBits) : -1;
     _current           = default;
     _currentKnownType  = default;
     _hasUnknown        = collection.MaybeUnknown != null;
     _unknownEnumerator = _hasUnknown
         ? collection.MaybeUnknown !.GetEnumerator()
         : default;