Skip to content

Commit e801a8b

Browse files
wbpcodephlax
authored andcommitted
fix startup crash (#41608)
Signed-off-by: WangBaiping <[email protected]>
1 parent ce0755f commit e801a8b

File tree

4 files changed

+56
-18
lines changed

4 files changed

+56
-18
lines changed

changelogs/current.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ minor_behavior_changes:
88

99
bug_fixes:
1010
# *Changes expected to improve the state of the world and are unlikely to have negative effects*
11+
- area: bootstrap
12+
change: |
13+
Fixed an issue where the custom
14+
:ref:`header_prefix <envoy_v3_api_field_config.bootstrap.v3.Bootstrap.header_prefix>`
15+
will result in crash at startup.
1116
1217
removed_config_or_runtime:
1318
# *Normally occurs at the end of the* :ref:`deprecation period <deprecated>`

envoy/http/header_map.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -683,7 +683,7 @@ template <CustomInlineHeaderRegistry::Type type> class RegisterCustomInlineHeade
683683
RegisterCustomInlineHeader(const LowerCaseString& header)
684684
: handle_(CustomInlineHeaderRegistry::registerInlineHeader<type>(header)) {}
685685

686-
typename CustomInlineHeaderRegistry::Handle<type> handle() { return handle_; }
686+
typename CustomInlineHeaderRegistry::Handle<type> handle() const { return handle_; }
687687

688688
private:
689689
const typename CustomInlineHeaderRegistry::Handle<type> handle_;

source/extensions/filters/http/compressor/compressor_filter.cc

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,6 @@ Http::RegisterCustomInlineHeader<Http::CustomInlineHeaderRegistry::Type::Respons
3131
etag_handle(Http::CustomHeaders::get().Etag);
3232
Http::RegisterCustomInlineHeader<Http::CustomInlineHeaderRegistry::Type::ResponseHeaders>
3333
vary_handle(Http::CustomHeaders::get().Vary);
34-
Http::RegisterCustomInlineHeader<Http::CustomInlineHeaderRegistry::Type::ResponseHeaders>
35-
compression_status_handle(Http::Headers::get().EnvoyCompressionStatus);
36-
3734
Http::RegisterCustomInlineHeader<Http::CustomInlineHeaderRegistry::Type::RequestHeaders>
3835
request_content_encoding_handle(Http::CustomHeaders::get().ContentEncoding);
3936
Http::RegisterCustomInlineHeader<Http::CustomInlineHeaderRegistry::Type::ResponseHeaders>
@@ -795,8 +792,7 @@ void CompressorFilter::insertEnvoyCompressionStatusHeader(
795792
absl::string_view status_to_set, absl::optional<absl::string_view> original_length) {
796793
std::string status_value =
797794
createEnvoyCompressionStatusHeaderValue(encoding_type, status_to_set, original_length);
798-
headers.appendInline(compression_status_handle.handle(), status_value,
799-
Http::Headers::get().EnvoyCompressionStatusValues.ValueSeparator);
795+
headers.addReferenceKey(Http::Headers::get().EnvoyCompressionStatus, status_value);
800796
}
801797

802798
void CompressorFilter::insertVaryHeader(Http::ResponseHeaderMap& headers) {

test/extensions/filters/http/compressor/compressor_filter_test.cc

Lines changed: 49 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include <sys/types.h>
22

3+
#include "source/common/http/header_utility.h"
34
#include "source/extensions/filters/http/compressor/compressor_filter.h"
45

56
#include "test/extensions/filters/http/compressor/compressor_filter_testing_peer.h"
@@ -183,7 +184,7 @@ class CompressorFilterTest : public testing::Test {
183184
std::unique_ptr<CompressorFilter> filter_;
184185
Buffer::OwnedImpl data_;
185186
std::string expected_str_;
186-
std::string response_stats_prefix_{};
187+
std::string response_stats_prefix_;
187188
Stats::TestUtil::TestStore stats_;
188189
NiceMock<Runtime::MockLoader> runtime_;
189190
NiceMock<Http::MockStreamDecoderFilterCallbacks> decoder_callbacks_;
@@ -1373,7 +1374,11 @@ TEST_F(CompressorFilterTest, EnvoyCompressionStatusHeaderContentLength) {
13731374
doRequestNoCompression({{":method", "get"}, {"accept-encoding", "test, deflate"}});
13741375
Http::TestResponseHeaderMapImpl headers{{":method", "get"}, {"content-length", "10"}};
13751376
doResponse(headers, false, false);
1376-
EXPECT_EQ(headers.get_("x-envoy-compression-status"), "test;ContentLengthTooSmall");
1377+
EXPECT_EQ(Http::HeaderUtility::getAllOfHeaderAsString(
1378+
headers.get(Http::Headers::get().EnvoyCompressionStatus))
1379+
.result()
1380+
.value(),
1381+
"test;ContentLengthTooSmall");
13771382
}
13781383

13791384
TEST_F(CompressorFilterTest, EnvoyCompressionStatusHeaderContentType) {
@@ -1397,7 +1402,11 @@ TEST_F(CompressorFilterTest, EnvoyCompressionStatusHeaderContentType) {
13971402
Http::TestResponseHeaderMapImpl headers{
13981403
{":method", "get"}, {"content-length", "256"}, {"content-type", "image/jpeg"}};
13991404
doResponse(headers, false, false);
1400-
EXPECT_EQ(headers.get_("x-envoy-compression-status"), "test;ContentTypeNotAllowed");
1405+
EXPECT_EQ(Http::HeaderUtility::getAllOfHeaderAsString(
1406+
headers.get(Http::Headers::get().EnvoyCompressionStatus))
1407+
.result()
1408+
.value(),
1409+
"test;ContentTypeNotAllowed");
14011410
}
14021411

14031412
TEST_F(CompressorFilterTest, EnvoyCompressionStatusHeaderEtag) {
@@ -1421,7 +1430,11 @@ TEST_F(CompressorFilterTest, EnvoyCompressionStatusHeaderEtag) {
14211430
Http::TestResponseHeaderMapImpl headers{
14221431
{":method", "get"}, {"content-length", "256"}, {"etag", "12345"}};
14231432
doResponse(headers, false, false);
1424-
EXPECT_EQ(headers.get_("x-envoy-compression-status"), "test;EtagNotAllowed");
1433+
EXPECT_EQ(Http::HeaderUtility::getAllOfHeaderAsString(
1434+
headers.get(Http::Headers::get().EnvoyCompressionStatus))
1435+
.result()
1436+
.value(),
1437+
"test;EtagNotAllowed");
14251438
}
14261439

14271440
TEST_F(CompressorFilterTest, EnvoyCompressionStatusHeaderStatusCode) {
@@ -1447,7 +1460,11 @@ TEST_F(CompressorFilterTest, EnvoyCompressionStatusHeaderStatusCode) {
14471460
Http::TestResponseHeaderMapImpl headers{
14481461
{":method", "get"}, {"content-length", "256"}, {":status", "206"}};
14491462
doResponse(headers, false, false);
1450-
EXPECT_EQ(headers.get_("x-envoy-compression-status"), "test;StatusCodeNotAllowed");
1463+
EXPECT_EQ(Http::HeaderUtility::getAllOfHeaderAsString(
1464+
headers.get(Http::Headers::get().EnvoyCompressionStatus))
1465+
.result()
1466+
.value(),
1467+
"test;StatusCodeNotAllowed");
14511468
}
14521469

14531470
TEST_F(CompressorFilterTest, EnvoyCompressionStatusHeaderCompressed) {
@@ -1469,7 +1486,11 @@ TEST_F(CompressorFilterTest, EnvoyCompressionStatusHeaderCompressed) {
14691486
doRequestNoCompression({{":method", "get"}, {"accept-encoding", "test, deflate"}});
14701487
Http::TestResponseHeaderMapImpl headers{{":method", "get"}, {"content-length", "256"}};
14711488
doResponse(headers, true, false);
1472-
EXPECT_EQ(headers.get_("x-envoy-compression-status"), "test;Compressed;OriginalLength=256");
1489+
EXPECT_EQ(Http::HeaderUtility::getAllOfHeaderAsString(
1490+
headers.get(Http::Headers::get().EnvoyCompressionStatus))
1491+
.result()
1492+
.value(),
1493+
"test;Compressed;OriginalLength=256");
14731494
}
14741495

14751496
class IsMinimumContentLengthTest
@@ -1888,7 +1909,10 @@ TEST_F(MultipleFiltersTest, BothFiltersFail) {
18881909
Http::TestResponseHeaderMapImpl headers{{":method", "get"}, {"content-length", "10"}};
18891910
EXPECT_EQ(Http::FilterHeadersStatus::Continue, filter1_->encodeHeaders(headers, false));
18901911
EXPECT_EQ(Http::FilterHeadersStatus::Continue, filter2_->encodeHeaders(headers, false));
1891-
EXPECT_EQ(headers.get_("x-envoy-compression-status"),
1912+
EXPECT_EQ(Http::HeaderUtility::getAllOfHeaderAsString(
1913+
headers.get(Http::Headers::get().EnvoyCompressionStatus))
1914+
.result()
1915+
.value(),
18921916
"test1;ContentLengthTooSmall,test2;ContentLengthTooSmall");
18931917
}
18941918

@@ -1938,7 +1962,10 @@ TEST_F(MultipleFiltersTest, OneFilterFailsOneSucceeds) {
19381962
{":method", "get"}, {"content-length", "256"}, {"content-type", "text/plain"}};
19391963
EXPECT_EQ(Http::FilterHeadersStatus::Continue, filter1_->encodeHeaders(headers, false));
19401964
EXPECT_EQ(Http::FilterHeadersStatus::Continue, filter2_->encodeHeaders(headers, false));
1941-
EXPECT_EQ(headers.get_("x-envoy-compression-status"),
1965+
EXPECT_EQ(Http::HeaderUtility::getAllOfHeaderAsString(
1966+
headers.get(Http::Headers::get().EnvoyCompressionStatus))
1967+
.result()
1968+
.value(),
19421969
"test1;ContentTypeNotAllowed,test2;Compressed;OriginalLength=256");
19431970
}
19441971

@@ -1958,7 +1985,11 @@ TEST_F(MultipleFiltersTest, FirstFilterSucceedsSecondSkips) {
19581985
EXPECT_EQ(Http::FilterHeadersStatus::Continue, filter1_->encodeHeaders(headers, false));
19591986
// The second filter should not compress because the content-encoding header is already set.
19601987
EXPECT_EQ(Http::FilterHeadersStatus::Continue, filter2_->encodeHeaders(headers, false));
1961-
EXPECT_EQ(headers.get_("x-envoy-compression-status"), "test1;Compressed;OriginalLength=256");
1988+
EXPECT_EQ(Http::HeaderUtility::getAllOfHeaderAsString(
1989+
headers.get(Http::Headers::get().EnvoyCompressionStatus))
1990+
.result()
1991+
.value(),
1992+
"test1;Compressed;OriginalLength=256");
19621993
EXPECT_EQ(headers.get_("content-encoding"), "test1");
19631994
}
19641995

@@ -2011,7 +2042,10 @@ TEST_F(MultipleFiltersTest, BothFiltersFailDifferentReasons) {
20112042
{":method", "get"}, {"content-length", "256"}, {"content-type", "text/plain"}};
20122043
EXPECT_EQ(Http::FilterHeadersStatus::Continue, filter1_->encodeHeaders(headers, false));
20132044
EXPECT_EQ(Http::FilterHeadersStatus::Continue, filter2_->encodeHeaders(headers, false));
2014-
EXPECT_EQ(headers.get_("x-envoy-compression-status"),
2045+
EXPECT_EQ(Http::HeaderUtility::getAllOfHeaderAsString(
2046+
headers.get(Http::Headers::get().EnvoyCompressionStatus))
2047+
.result()
2048+
.value(),
20152049
"test1;ContentLengthTooSmall,test2;ContentTypeNotAllowed");
20162050
}
20172051

@@ -2060,7 +2094,10 @@ TEST_F(MultipleFiltersTest, BothFiltersFailEtagAndStatusCode) {
20602094
{":method", "get"}, {"content-length", "256"}, {"etag", "12345"}, {":status", "206"}};
20612095
EXPECT_EQ(Http::FilterHeadersStatus::Continue, filter1_->encodeHeaders(headers, false));
20622096
EXPECT_EQ(Http::FilterHeadersStatus::Continue, filter2_->encodeHeaders(headers, false));
2063-
EXPECT_EQ(headers.get_("x-envoy-compression-status"),
2097+
EXPECT_EQ(Http::HeaderUtility::getAllOfHeaderAsString(
2098+
headers.get(Http::Headers::get().EnvoyCompressionStatus))
2099+
.result()
2100+
.value(),
20642101
"test1;EtagNotAllowed,test2;StatusCodeNotAllowed");
20652102
}
20662103

@@ -2175,7 +2212,7 @@ class ChooseFirstTest : public MultipleFiltersTest,
21752212

21762213
Buffer::OwnedImpl data_;
21772214
std::string expected_str_;
2178-
std::string response_stats_prefix_{};
2215+
std::string response_stats_prefix_;
21792216
NiceMock<Http::MockStreamEncoderFilterCallbacks> encoder_callbacks_;
21802217
};
21812218

0 commit comments

Comments
 (0)