fix: content-type not work in custom response plugin (#833)

This commit is contained in:
澄潭
2024-02-21 14:00:43 +08:00
committed by GitHub
parent b652f3e666
commit f537a1c3ea
3 changed files with 60 additions and 13 deletions

View File

@@ -74,9 +74,7 @@ bool PluginRootContext::parsePluginConfig(const json& configuration,
} }
if (absl::AsciiStrToLower(pair[0]) == if (absl::AsciiStrToLower(pair[0]) ==
Wasm::Common::Http::Header::ContentType) { Wasm::Common::Http::Header::ContentType) {
rule.content_type = pair[1];
has_content_type = true; has_content_type = true;
return true;
} }
rule.headers.emplace_back(pair[0], pair[1]); rule.headers.emplace_back(pair[0], pair[1]);
return true; return true;
@@ -105,13 +103,11 @@ bool PluginRootContext::parsePluginConfig(const json& configuration,
if (!rule.body.empty() && !has_content_type) { if (!rule.body.empty() && !has_content_type) {
auto try_decode_json = Wasm::Common::JsonParse(rule.body); auto try_decode_json = Wasm::Common::JsonParse(rule.body);
if (try_decode_json.has_value()) { if (try_decode_json.has_value()) {
rule.content_type = "application/json; charset=utf-8"; rule.headers.emplace_back(Wasm::Common::Http::Header::ContentType,
// rule.headers.emplace_back(Wasm::Common::Http::Header::ContentType, "application/json; charset=utf-8");
// "application/json; charset=utf-8");
} else { } else {
rule.content_type = "text/plain; charset=utf-8"; rule.headers.emplace_back(Wasm::Common::Http::Header::ContentType,
// rule.headers.emplace_back(Wasm::Common::Http::Header::ContentType, "text/plain; charset=utf-8");
// "text/plain; charset=utf-8");
} }
} }
return true; return true;
@@ -139,8 +135,6 @@ FilterHeadersStatus PluginRootContext::onResponse(
if (!hit) { if (!hit) {
return FilterHeadersStatus::Continue; return FilterHeadersStatus::Continue;
} }
replaceResponseHeader(Wasm::Common::Http::Header::ContentType,
rule.content_type);
sendLocalResponse(rule.status_code, "", rule.body, rule.headers); sendLocalResponse(rule.status_code, "", rule.body, rule.headers);
return FilterHeadersStatus::StopIteration; return FilterHeadersStatus::StopIteration;
} }

View File

@@ -40,7 +40,6 @@ namespace custom_response {
struct CustomResponseConfigRule { struct CustomResponseConfigRule {
std::vector<std::string> enable_on_status; std::vector<std::string> enable_on_status;
std::vector<std::pair<std::string, std::string>> headers; std::vector<std::pair<std::string, std::string>> headers;
std::string content_type;
int32_t status_code = 200; int32_t status_code = 200;
std::string body; std::string body;
}; };

View File

@@ -146,12 +146,66 @@ TEST_F(CustomResponseTest, EnableOnStatus) {
status_code_ = "429"; status_code_ = "429";
EXPECT_EQ(context_->onRequestHeaders(0, false), EXPECT_EQ(context_->onRequestHeaders(0, false),
FilterHeadersStatus::Continue); FilterHeadersStatus::Continue);
EXPECT_CALL(*mock_context_, sendLocalResponse(233, testing::_, testing::_, EXPECT_CALL(
testing::_, testing::_)); *mock_context_,
sendLocalResponse(
233, testing::_,
testing::ElementsAre(
testing::Pair("abc", "123"), testing::Pair("zty", "test"),
testing::Pair("content-type", "application/json; charset=utf-8")),
testing::_, testing::_));
EXPECT_EQ(context_->onResponseHeaders(0, false), EXPECT_EQ(context_->onResponseHeaders(0, false),
FilterHeadersStatus::StopIteration); FilterHeadersStatus::StopIteration);
} }
TEST_F(CustomResponseTest, ContentTypePlain) {
std::string configuration = R"(
{
"status_code": 200,
"body": "abc"
})";
BufferBase buffer;
buffer.set({configuration.data(), configuration.size()});
EXPECT_CALL(*mock_context_, getBuffer(WasmBufferType::PluginConfiguration))
.WillOnce([&buffer](WasmBufferType) { return &buffer; });
EXPECT_TRUE(root_context_->configure(configuration.size()));
EXPECT_CALL(
*mock_context_,
sendLocalResponse(200, testing::_,
testing::ElementsAre(testing::Pair(
"content-type", "text/plain; charset=utf-8")),
testing::_, testing::_));
EXPECT_EQ(context_->onRequestHeaders(0, false),
FilterHeadersStatus::StopIteration);
}
TEST_F(CustomResponseTest, ContentTypeCustom) {
std::string configuration = R"(
{
"status_code": 200,
"headers": ["content-type=application/custom"],
"body": "abc"
})";
BufferBase buffer;
buffer.set({configuration.data(), configuration.size()});
EXPECT_CALL(*mock_context_, getBuffer(WasmBufferType::PluginConfiguration))
.WillOnce([&buffer](WasmBufferType) { return &buffer; });
EXPECT_TRUE(root_context_->configure(configuration.size()));
EXPECT_CALL(*mock_context_,
sendLocalResponse(200, testing::_,
testing::ElementsAre(testing::Pair(
"content-type", "application/custom")),
testing::_, testing::_));
EXPECT_EQ(context_->onRequestHeaders(0, false),
FilterHeadersStatus::StopIteration);
}
TEST_F(CustomResponseTest, NoGlobalRule) { TEST_F(CustomResponseTest, NoGlobalRule) {
std::string configuration = R"( std::string configuration = R"(
{ {