Skip to content

Commit

Permalink
Fix web service crash if set flag with invalid request parameter (#5566)
Browse files Browse the repository at this point in the history
  • Loading branch information
luyade committed May 31, 2023
1 parent ae43d7d commit 6415db5
Showing 1 changed file with 24 additions and 9 deletions.
33 changes: 24 additions & 9 deletions src/webservice/SetFlagsHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ void SetFlagsHandler::onBody(std::unique_ptr<folly::IOBuf> body) noexcept {

void SetFlagsHandler::onEOM() noexcept {
folly::dynamic flags;
folly::dynamic reply;
try {
if (!body_) {
LOG(ERROR) << "Got an empty body";
Expand All @@ -55,15 +56,19 @@ void SetFlagsHandler::onEOM() noexcept {
}
switch (err_) {
case HttpCode::E_UNSUPPORTED_METHOD:
reply = folly::dynamic::object("errorMessage", "Unsupported method");
ResponseBuilder(downstream_)
.status(WebServiceUtils::to(HttpStatusCode::METHOD_NOT_ALLOWED),
WebServiceUtils::toString(HttpStatusCode::METHOD_NOT_ALLOWED))
.body(folly::toPrettyJson(reply))
.sendWithEOM();
return;
case HttpCode::E_UNPROCESSABLE:
reply = folly::dynamic::object("errorMessage", "Bad request");
ResponseBuilder(downstream_)
.status(WebServiceUtils::to(HttpStatusCode::BAD_REQUEST),
WebServiceUtils::toString(HttpStatusCode::BAD_REQUEST))
.body(folly::toPrettyJson(reply))
.sendWithEOM();
return;
default:
Expand All @@ -72,20 +77,30 @@ void SetFlagsHandler::onEOM() noexcept {

folly::dynamic failedOptions = folly::dynamic::array();
for (auto &item : flags.items()) {
const std::string &name = item.first.asString();
const std::string &value = item.second.asString();
const std::string &newValue = gflags::SetCommandLineOption(name.c_str(), value.c_str());
if (newValue.empty()) {
failedOptions.push_back(name);
try {
const std::string &name = item.first.asString();
const std::string &value = item.second.asString();
const std::string &newValue = gflags::SetCommandLineOption(name.c_str(), value.c_str());
if (newValue.empty()) {
failedOptions.push_back(name);
}
} catch (const std::exception &e) {
LOG(ERROR) << "Fail to update flags: " << e.what();
reply = folly::dynamic::object("errorMessage", "Bad request parameter");
ResponseBuilder(downstream_)
.status(WebServiceUtils::to(HttpStatusCode::BAD_REQUEST),
WebServiceUtils::toString(HttpStatusCode::BAD_REQUEST))
.body(folly::toPrettyJson(reply))
.sendWithEOM();
return;
}
}
folly::dynamic body = failedOptions.empty()
? folly::dynamic::object("errCode", 0)
: folly::dynamic::object("failedOptions", failedOptions);
reply = failedOptions.empty() ? folly::dynamic::object("errCode", 0)
: folly::dynamic::object("failedOptions", failedOptions);
ResponseBuilder(downstream_)
.status(WebServiceUtils::to(HttpStatusCode::OK),
WebServiceUtils::toString(HttpStatusCode::OK))
.body(folly::toPrettyJson(body))
.body(folly::toPrettyJson(reply))
.sendWithEOM();
}

Expand Down

0 comments on commit 6415db5

Please sign in to comment.