mirror of
https://github.com/alibaba/higress.git
synced 2026-06-08 20:27:31 +08:00
fix: content-type not work in custom response plugin (#833)
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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"(
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user