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

View File

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

View File

@@ -146,12 +146,66 @@ TEST_F(CustomResponseTest, EnableOnStatus) {
status_code_ = "429";
EXPECT_EQ(context_->onRequestHeaders(0, false),
FilterHeadersStatus::Continue);
EXPECT_CALL(*mock_context_, sendLocalResponse(233, testing::_, testing::_,
testing::_, testing::_));
EXPECT_CALL(
*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),
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) {
std::string configuration = R"(
{