diff --git a/include/envoy/http/filter.h b/include/envoy/http/filter.h index 4157dfc6819f..3fb1210bb110 100644 --- a/include/envoy/http/filter.h +++ b/include/envoy/http/filter.h @@ -411,6 +411,12 @@ class StreamDecoderFilterCallbacks : public virtual StreamFilterCallbacks { */ virtual void encode100ContinueHeaders(ResponseHeaderMapPtr&& headers) PURE; + /** + * Returns the 100-Continue headers provided to encode100ContinueHeaders. Returns absl::nullopt if + * no headers have been provided yet. + */ + virtual ResponseHeaderMapOptRef continueHeaders() const PURE; + /** * Called with headers to be encoded, optionally indicating end of stream. * @@ -427,6 +433,12 @@ class StreamDecoderFilterCallbacks : public virtual StreamFilterCallbacks { virtual void encodeHeaders(ResponseHeaderMapPtr&& headers, bool end_stream, absl::string_view details) PURE; + /** + * Returns the headers provided to encodeHeaders. Returns absl::nullopt if no headers have been + * provided yet. + */ + virtual ResponseHeaderMapOptRef responseHeaders() const PURE; + /** * Called with data to be encoded, optionally indicating end of stream. * @param data supplies the data to be encoded. @@ -440,6 +452,12 @@ class StreamDecoderFilterCallbacks : public virtual StreamFilterCallbacks { */ virtual void encodeTrailers(ResponseTrailerMapPtr&& trailers) PURE; + /** + * Returns the trailers provided to encodeTrailers. Returns absl::nullopt if no headers have been + * provided yet. + */ + virtual ResponseTrailerMapOptRef responseTrailers() const PURE; + /** * Called with metadata to be encoded. * diff --git a/include/envoy/http/header_map.h b/include/envoy/http/header_map.h index 8df40a404e82..e3262e3ecfb0 100644 --- a/include/envoy/http/header_map.h +++ b/include/envoy/http/header_map.h @@ -786,6 +786,7 @@ class ResponseTrailerMap public CustomInlineHeaderBase {}; using ResponseTrailerMapPtr = std::unique_ptr; using ResponseTrailerMapOptRef = OptRef; +using ResponseTrailerMapOptConstRef = OptRef; /** * Convenient container type for storing Http::LowerCaseString and std::string key/value pairs. diff --git a/source/common/http/async_client_impl.h b/source/common/http/async_client_impl.h index 00fc7d09a5dc..9cee1e0399e7 100644 --- a/source/common/http/async_client_impl.h +++ b/source/common/http/async_client_impl.h @@ -31,6 +31,7 @@ #include "envoy/upstream/load_balancer.h" #include "envoy/upstream/upstream.h" +#include "common/common/assert.h" #include "common/common/empty_string.h" #include "common/common/linked_object.h" #include "common/http/message_impl.h" @@ -398,10 +399,13 @@ class AsyncStreamImpl : public AsyncClient::Stream, // The async client won't pause if sending an Expect: 100-Continue so simply // swallows any incoming encode100Continue. void encode100ContinueHeaders(ResponseHeaderMapPtr&&) override {} + ResponseHeaderMapOptRef continueHeaders() const override { NOT_IMPLEMENTED_GCOVR_EXCL_LINE; } void encodeHeaders(ResponseHeaderMapPtr&& headers, bool end_stream, absl::string_view details) override; + ResponseHeaderMapOptRef responseHeaders() const override { NOT_IMPLEMENTED_GCOVR_EXCL_LINE; } void encodeData(Buffer::Instance& data, bool end_stream) override; void encodeTrailers(ResponseTrailerMapPtr&& trailers) override; + ResponseTrailerMapOptRef responseTrailers() const override { NOT_IMPLEMENTED_GCOVR_EXCL_LINE; } void encodeMetadata(MetadataMapPtr&&) override {} void onDecoderFilterAboveWriteBufferHighWatermark() override { ++high_watermark_calls_; } void onDecoderFilterBelowWriteBufferLowWatermark() override { diff --git a/source/common/http/filter_manager.cc b/source/common/http/filter_manager.cc index fe579cebefdd..4a4e355da3f6 100644 --- a/source/common/http/filter_manager.cc +++ b/source/common/http/filter_manager.cc @@ -368,6 +368,10 @@ void ActiveStreamDecoderFilter::encode100ContinueHeaders(ResponseHeaderMapPtr&& } } +ResponseHeaderMapOptRef ActiveStreamDecoderFilter::continueHeaders() const { + return parent_.filter_manager_callbacks_.continueHeaders(); +} + void ActiveStreamDecoderFilter::encodeHeaders(ResponseHeaderMapPtr&& headers, bool end_stream, absl::string_view details) { parent_.stream_info_.setResponseCodeDetails(details); @@ -375,6 +379,10 @@ void ActiveStreamDecoderFilter::encodeHeaders(ResponseHeaderMapPtr&& headers, bo parent_.encodeHeaders(nullptr, *parent_.filter_manager_callbacks_.responseHeaders(), end_stream); } +ResponseHeaderMapOptRef ActiveStreamDecoderFilter::responseHeaders() const { + return parent_.filter_manager_callbacks_.responseHeaders(); +} + void ActiveStreamDecoderFilter::encodeData(Buffer::Instance& data, bool end_stream) { parent_.encodeData(nullptr, data, end_stream, FilterManager::FilterIterationStartState::CanStartFromCurrent); @@ -385,6 +393,10 @@ void ActiveStreamDecoderFilter::encodeTrailers(ResponseTrailerMapPtr&& trailers) parent_.encodeTrailers(nullptr, *parent_.filter_manager_callbacks_.responseTrailers()); } +ResponseTrailerMapOptRef ActiveStreamDecoderFilter::responseTrailers() const { + return parent_.filter_manager_callbacks_.responseTrailers(); +} + void ActiveStreamDecoderFilter::encodeMetadata(MetadataMapPtr&& metadata_map_ptr) { parent_.encodeMetadata(nullptr, std::move(metadata_map_ptr)); } diff --git a/source/common/http/filter_manager.h b/source/common/http/filter_manager.h index 2493bd2edaff..b3bac91a6d53 100644 --- a/source/common/http/filter_manager.h +++ b/source/common/http/filter_manager.h @@ -284,10 +284,13 @@ struct ActiveStreamDecoderFilter : public ActiveStreamFilterBase, const absl::optional grpc_status, absl::string_view details) override; void encode100ContinueHeaders(ResponseHeaderMapPtr&& headers) override; + ResponseHeaderMapOptRef continueHeaders() const override; void encodeHeaders(ResponseHeaderMapPtr&& headers, bool end_stream, absl::string_view details) override; + ResponseHeaderMapOptRef responseHeaders() const override; void encodeData(Buffer::Instance& data, bool end_stream) override; void encodeTrailers(ResponseTrailerMapPtr&& trailers) override; + ResponseTrailerMapOptRef responseTrailers() const override; void encodeMetadata(MetadataMapPtr&& metadata_map_ptr) override; void onDecoderFilterAboveWriteBufferHighWatermark() override; void onDecoderFilterBelowWriteBufferLowWatermark() override; diff --git a/test/mocks/http/mocks.h b/test/mocks/http/mocks.h index 5505b702ea04..d4743d7c6c54 100644 --- a/test/mocks/http/mocks.h +++ b/test/mocks/http/mocks.h @@ -219,12 +219,15 @@ class MockStreamDecoderFilterCallbacks : public StreamDecoderFilterCallbacks, void encode100ContinueHeaders(ResponseHeaderMapPtr&& headers) override { encode100ContinueHeaders_(*headers); } + MOCK_METHOD(ResponseHeaderMapOptRef, continueHeaders, (), (const)); void encodeHeaders(ResponseHeaderMapPtr&& headers, bool end_stream, absl::string_view details) override { stream_info_.setResponseCodeDetails(details); encodeHeaders_(*headers, end_stream); } + MOCK_METHOD(ResponseHeaderMapOptRef, responseHeaders, (), (const)); void encodeTrailers(ResponseTrailerMapPtr&& trailers) override { encodeTrailers_(*trailers); } + MOCK_METHOD(ResponseTrailerMapOptRef, responseTrailers, (), (const)); void encodeMetadata(MetadataMapPtr&& metadata_map) override { encodeMetadata_(std::move(metadata_map)); } @@ -374,9 +377,12 @@ class MockStreamFilter : public StreamFilter { // Http::MockStreamEncoderFilter MOCK_METHOD(FilterHeadersStatus, encode100ContinueHeaders, (ResponseHeaderMap & headers)); + MOCK_METHOD(ResponseHeaderMapOptRef, continueHeaders, (), (const)); MOCK_METHOD(FilterHeadersStatus, encodeHeaders, (ResponseHeaderMap & headers, bool end_stream)); + MOCK_METHOD(ResponseHeaderMapOptRef, responseHeaders, (), (const)); MOCK_METHOD(FilterDataStatus, encodeData, (Buffer::Instance & data, bool end_stream)); MOCK_METHOD(FilterTrailersStatus, encodeTrailers, (ResponseTrailerMap & trailers)); + MOCK_METHOD(ResponseTrailerMapOptRef, responseTrailers, (), (const)); MOCK_METHOD(FilterMetadataStatus, encodeMetadata, (MetadataMap & metadata_map)); MOCK_METHOD(void, setEncoderFilterCallbacks, (StreamEncoderFilterCallbacks & callbacks));