Change ParsePriorityFieldValue() return value.
Use std::optional<> instead of homebrew struct with bool.
PiperOrigin-RevId: 495015412
diff --git a/quiche/quic/core/http/quic_receive_control_stream.cc b/quiche/quic/core/http/quic_receive_control_stream.cc
index 87e9bd7..b23fc57 100644
--- a/quiche/quic/core/http/quic_receive_control_stream.cc
+++ b/quiche/quic/core/http/quic_receive_control_stream.cc
@@ -9,6 +9,7 @@
#include "absl/strings/numbers.h"
#include "absl/strings/str_split.h"
#include "absl/strings/string_view.h"
+#include "absl/types/optional.h"
#include "quiche/quic/core/http/http_constants.h"
#include "quiche/quic/core/http/http_decoder.h"
#include "quiche/quic/core/http/quic_spdy_session.h"
@@ -138,10 +139,10 @@
if (GetQuicReloadableFlag(quic_priority_update_structured_headers_parser)) {
QUIC_RELOADABLE_FLAG_COUNT(quic_priority_update_structured_headers_parser);
- const ParsePriorityFieldValueResult result =
+ absl::optional<QuicStreamPriority> priority =
ParsePriorityFieldValue(frame.priority_field_value);
- if (!result.success) {
+ if (!priority.has_value()) {
stream_delegate()->OnStreamError(
QUIC_INVALID_PRIORITY_UPDATE,
"Invalid PRIORITY_UPDATE frame payload.");
@@ -150,7 +151,7 @@
const QuicStreamId stream_id = frame.prioritized_element_id;
return spdy_session_->OnPriorityUpdateForRequestStream(stream_id,
- result.priority);
+ *priority);
}
for (absl::string_view key_value :
diff --git a/quiche/quic/core/quic_stream_priority.cc b/quiche/quic/core/quic_stream_priority.cc
index 9729706..1209258 100644
--- a/quiche/quic/core/quic_stream_priority.cc
+++ b/quiche/quic/core/quic_stream_priority.cc
@@ -38,12 +38,12 @@
return *priority_field_value;
}
-ParsePriorityFieldValueResult ParsePriorityFieldValue(
+absl::optional<QuicStreamPriority> ParsePriorityFieldValue(
absl::string_view priority_field_value) {
absl::optional<quiche::structured_headers::Dictionary> parsed_dictionary =
quiche::structured_headers::ParseDictionary(priority_field_value);
if (!parsed_dictionary.has_value()) {
- return {false, {}};
+ return std::nullopt;
}
uint8_t urgency = QuicStreamPriority::kDefaultUrgency;
@@ -77,7 +77,7 @@
}
}
- return {true, {urgency, incremental}};
+ return QuicStreamPriority{urgency, incremental};
}
} // namespace quic
diff --git a/quiche/quic/core/quic_stream_priority.h b/quiche/quic/core/quic_stream_priority.h
index 33f1183..04db767 100644
--- a/quiche/quic/core/quic_stream_priority.h
+++ b/quiche/quic/core/quic_stream_priority.h
@@ -10,6 +10,7 @@
#include <tuple>
#include "absl/strings/string_view.h"
+#include "absl/types/optional.h"
#include "quiche/quic/platform/api/quic_export.h"
namespace quic {
@@ -43,15 +44,10 @@
QUICHE_EXPORT std::string SerializePriorityFieldValue(
QuicStreamPriority priority);
-// Return type of ParsePriorityFieldValue().
-struct QUICHE_EXPORT ParsePriorityFieldValueResult {
- bool success;
- QuicStreamPriority priority;
-};
-
// Parses the Priority Field Value field of a PRIORITY_UPDATE frame.
-QUICHE_EXPORT ParsePriorityFieldValueResult
-ParsePriorityFieldValue(absl::string_view priority_field_value);
+// Returns nullopt on failure.
+QUICHE_EXPORT absl::optional<QuicStreamPriority> ParsePriorityFieldValue(
+ absl::string_view priority_field_value);
} // namespace quic
diff --git a/quiche/quic/core/quic_stream_priority_test.cc b/quiche/quic/core/quic_stream_priority_test.cc
index 1ebbabb..f379a2a 100644
--- a/quiche/quic/core/quic_stream_priority_test.cc
+++ b/quiche/quic/core/quic_stream_priority_test.cc
@@ -47,70 +47,70 @@
TEST(ParsePriorityFieldValueTest, ParsePriorityFieldValue) {
// Default values
- ParsePriorityFieldValueResult result = ParsePriorityFieldValue("");
- EXPECT_TRUE(result.success);
- EXPECT_EQ(3, result.priority.urgency);
- EXPECT_FALSE(result.priority.incremental);
+ absl::optional<QuicStreamPriority> result = ParsePriorityFieldValue("");
+ ASSERT_TRUE(result.has_value());
+ EXPECT_EQ(3, result->urgency);
+ EXPECT_FALSE(result->incremental);
result = ParsePriorityFieldValue("i=?1");
- EXPECT_TRUE(result.success);
- EXPECT_EQ(3, result.priority.urgency);
- EXPECT_TRUE(result.priority.incremental);
+ ASSERT_TRUE(result.has_value());
+ EXPECT_EQ(3, result->urgency);
+ EXPECT_TRUE(result->incremental);
result = ParsePriorityFieldValue("u=5");
- EXPECT_TRUE(result.success);
- EXPECT_EQ(5, result.priority.urgency);
- EXPECT_FALSE(result.priority.incremental);
+ ASSERT_TRUE(result.has_value());
+ EXPECT_EQ(5, result->urgency);
+ EXPECT_FALSE(result->incremental);
result = ParsePriorityFieldValue("u=5, i");
- EXPECT_TRUE(result.success);
- EXPECT_EQ(5, result.priority.urgency);
- EXPECT_TRUE(result.priority.incremental);
+ ASSERT_TRUE(result.has_value());
+ EXPECT_EQ(5, result->urgency);
+ EXPECT_TRUE(result->incremental);
result = ParsePriorityFieldValue("i, u=1");
- EXPECT_TRUE(result.success);
- EXPECT_EQ(1, result.priority.urgency);
- EXPECT_TRUE(result.priority.incremental);
+ ASSERT_TRUE(result.has_value());
+ EXPECT_EQ(1, result->urgency);
+ EXPECT_TRUE(result->incremental);
// Duplicate values are allowed.
result = ParsePriorityFieldValue("u=5, i=?1, i=?0, u=2");
- EXPECT_TRUE(result.success);
- EXPECT_EQ(2, result.priority.urgency);
- EXPECT_FALSE(result.priority.incremental);
+ ASSERT_TRUE(result.has_value());
+ EXPECT_EQ(2, result->urgency);
+ EXPECT_FALSE(result->incremental);
// Unknown parameters MUST be ignored.
result = ParsePriorityFieldValue("a=42, u=4, i=?0");
- EXPECT_TRUE(result.success);
- EXPECT_EQ(4, result.priority.urgency);
- EXPECT_FALSE(result.priority.incremental);
+ ASSERT_TRUE(result.has_value());
+ EXPECT_EQ(4, result->urgency);
+ EXPECT_FALSE(result->incremental);
// Out-of-range values MUST be ignored.
result = ParsePriorityFieldValue("u=-2, i");
- EXPECT_TRUE(result.success);
- EXPECT_EQ(3, result.priority.urgency);
- EXPECT_TRUE(result.priority.incremental);
+ ASSERT_TRUE(result.has_value());
+ EXPECT_EQ(3, result->urgency);
+ EXPECT_TRUE(result->incremental);
// Values of unexpected types MUST be ignored.
result = ParsePriorityFieldValue("u=4.2, i=\"foo\"");
- EXPECT_TRUE(result.success);
- EXPECT_EQ(3, result.priority.urgency);
- EXPECT_FALSE(result.priority.incremental);
+ ASSERT_TRUE(result.has_value());
+ EXPECT_EQ(3, result->urgency);
+ EXPECT_FALSE(result->incremental);
// Values of the right type but different names are ignored.
result = ParsePriorityFieldValue("a=4, b=?1");
- EXPECT_TRUE(result.success);
- EXPECT_EQ(3, result.priority.urgency);
- EXPECT_FALSE(result.priority.incremental);
+ ASSERT_TRUE(result.has_value());
+ EXPECT_EQ(3, result->urgency);
+ EXPECT_FALSE(result->incremental);
// Cannot be parsed as structured headers.
result = ParsePriorityFieldValue("000");
- EXPECT_FALSE(result.success);
+ EXPECT_FALSE(result.has_value());
// Inner list dictionary values are ignored.
result = ParsePriorityFieldValue("a=(1 2), u=1");
- EXPECT_TRUE(result.success);
- EXPECT_EQ(1, result.priority.urgency);
- EXPECT_FALSE(result.priority.incremental);
+ ASSERT_TRUE(result.has_value());
+ EXPECT_EQ(1, result->urgency);
+ EXPECT_FALSE(result->incremental);
}
} // namespace quic::test