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