Skip to content

Commit

Permalink
Add checks during ORCA header parsing to catch error cases gracefully…
Browse files Browse the repository at this point in the history
… handled by util method. (#35868)


Signed-off-by: blake-snyder <blakesnyder@google.com>
  • Loading branch information
blake-snyder authored Aug 29, 2024
1 parent b6ed8f0 commit 5c26e83
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 0 deletions.
7 changes: 7 additions & 0 deletions source/common/orca/orca_parser.cc
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,14 @@ absl::StatusOr<OrcaLoadReport> parseOrcaLoadReportHeaders(const HeaderMap& heade
// Binary protobuf format.
if (const auto header_bin = headers.get(endpointLoadMetricsHeaderBin()); !header_bin.empty()) {
const auto header_value = header_bin[0]->value().getStringView();
if (header_value.empty()) {
return absl::InvalidArgumentError("ORCA binary header value is empty");
}
const std::string decoded_value = Envoy::Base64::decode(header_value);
if (decoded_value.empty()) {
return absl::InvalidArgumentError(
fmt::format("unable to decode ORCA binary header value: {}", header_value));
}
if (!load_report.ParseFromString(decoded_value)) {
return absl::InvalidArgumentError(
fmt::format("unable to parse binaryheader to OrcaLoadReport: {}", header_value));
Expand Down
17 changes: 17 additions & 0 deletions test/common/orca/orca_parser_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,23 @@ TEST(OrcaParserUtilTest, InvalidBinaryHeader) {
testing::HasSubstr("unable to parse binaryheader to OrcaLoadReport")));
}

TEST(OrcaParserUtilTest, BinaryHeaderPopulatedWithReadableString) {
Http::TestRequestHeaderMapImpl headers{
{std::string(kEndpointLoadMetricsHeaderBin), "not-a-valid-binary-proto"}};
EXPECT_THAT(parseOrcaLoadReportHeaders(headers),
StatusHelpers::HasStatus(
absl::StatusCode::kInvalidArgument,
testing::HasSubstr(
"unable to decode ORCA binary header value: not-a-valid-binary-proto")));
}

TEST(OrcaParserUtilTest, EmptyBinaryHeader) {
Http::TestRequestHeaderMapImpl headers{{std::string(kEndpointLoadMetricsHeaderBin), ""}};
EXPECT_THAT(parseOrcaLoadReportHeaders(headers),
StatusHelpers::HasStatus(absl::StatusCode::kInvalidArgument,
testing::HasSubstr("ORCA binary header value is empty")));
}

} // namespace
} // namespace Orca
} // namespace Envoy

0 comments on commit 5c26e83

Please sign in to comment.