Skip to content

Commit 8a8f2f3

Browse files
Rickypcopybara-github
authored andcommitted
Update Indeterminate Length BHTTP methods to accept Span<const T>.
The IndeterminateLength methods in BinaryHttpRequest and BinaryHttpResponse do not mutate the elements of the containers, they are used as read-only interfaces to the elements, so they now take absl::Span<const T>. This allows for more natural usage with containers and removes the need for explicit absl::MakeSpan in many cases. PiperOrigin-RevId: 861931703
1 parent e95839a commit 8a8f2f3

File tree

3 files changed

+59
-64
lines changed

3 files changed

+59
-64
lines changed

quiche/binary_http/binary_http_message.cc

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ uint64_t StringPieceVarInt62Len(absl::string_view s) {
208208
}
209209

210210
absl::StatusOr<std::string> EncodeBodyChunksImpl(
211-
absl::Span<absl::string_view> body_chunks, bool body_chunks_done) {
211+
absl::Span<const absl::string_view> body_chunks, bool body_chunks_done) {
212212
uint64_t total_length = 0;
213213
for (const auto& body_chunk : body_chunks) {
214214
uint8_t body_chunk_var_int_length =
@@ -333,10 +333,8 @@ absl::Status DecodeContentTerminatedBodyChunkSection(
333333
return absl::OkStatus();
334334
}
335335

336-
} // namespace
337-
338336
absl::StatusOr<uint64_t> GetFieldSectionLength(
339-
absl::Span<BinaryHttpMessage::FieldView> fields) {
337+
absl::Span<const BinaryHttpMessage::FieldView> fields) {
340338
uint64_t field_section_length = 0;
341339
for (const auto& field : fields) {
342340
uint8_t var_int_length =
@@ -357,7 +355,7 @@ absl::StatusOr<uint64_t> GetFieldSectionLength(
357355
return field_section_length;
358356
}
359357

360-
absl::Status EncodeFields(absl::Span<BinaryHttpMessage::FieldView> fields,
358+
absl::Status EncodeFields(absl::Span<const BinaryHttpMessage::FieldView> fields,
361359
quiche::QuicheDataWriter& writer) {
362360
for (const auto& field : fields) {
363361
if (!writer.WriteStringPieceVarInt62(absl::AsciiStrToLower(field.name))) {
@@ -373,6 +371,8 @@ absl::Status EncodeFields(absl::Span<BinaryHttpMessage::FieldView> fields,
373371
return absl::OkStatus();
374372
}
375373

374+
} // namespace
375+
376376
void BinaryHttpMessage::Fields::AddField(BinaryHttpMessage::Field field) {
377377
fields_.push_back(std::move(field));
378378
}
@@ -749,7 +749,7 @@ absl::Status BinaryHttpRequest::IndeterminateLengthDecoder::Decode(
749749

750750
absl::StatusOr<std::string>
751751
BinaryHttpRequest::IndeterminateLengthEncoder::EncodeFieldSection(
752-
absl::Span<FieldView> fields) {
752+
absl::Span<const FieldView> fields) {
753753
absl::StatusOr<uint64_t> field_section_length = GetFieldSectionLength(fields);
754754
if (!field_section_length.ok()) {
755755
return field_section_length.status();
@@ -817,7 +817,7 @@ BinaryHttpRequest::IndeterminateLengthEncoder::EncodeControlData(
817817

818818
absl::StatusOr<std::string>
819819
BinaryHttpRequest::IndeterminateLengthEncoder::EncodeHeaders(
820-
absl::Span<FieldView> headers) {
820+
absl::Span<const FieldView> headers) {
821821
if (current_section_ != IndeterminateLengthMessageSection::kHeader) {
822822
current_section_ = IndeterminateLengthMessageSection::kEnd;
823823
return absl::InvalidArgumentError("EncodeHeaders called in wrong section.");
@@ -833,7 +833,7 @@ BinaryHttpRequest::IndeterminateLengthEncoder::EncodeHeaders(
833833

834834
absl::StatusOr<std::string>
835835
BinaryHttpRequest::IndeterminateLengthEncoder::EncodeBodyChunks(
836-
absl::Span<absl::string_view> body_chunks, bool body_chunks_done) {
836+
absl::Span<const absl::string_view> body_chunks, bool body_chunks_done) {
837837
if (current_section_ != IndeterminateLengthMessageSection::kBody) {
838838
current_section_ = IndeterminateLengthMessageSection::kEnd;
839839
return absl::InvalidArgumentError(
@@ -853,7 +853,7 @@ BinaryHttpRequest::IndeterminateLengthEncoder::EncodeBodyChunks(
853853

854854
absl::StatusOr<std::string>
855855
BinaryHttpRequest::IndeterminateLengthEncoder::EncodeTrailers(
856-
absl::Span<FieldView> trailers) {
856+
absl::Span<const FieldView> trailers) {
857857
if (current_section_ != IndeterminateLengthMessageSection::kTrailer) {
858858
current_section_ = IndeterminateLengthMessageSection::kEnd;
859859
return absl::InvalidArgumentError(
@@ -879,7 +879,7 @@ absl::StatusOr<BinaryHttpResponse> BinaryHttpResponse::Create(
879879

880880
absl::StatusOr<std::string>
881881
BinaryHttpResponse::IndeterminateLengthEncoder::EncodeFieldSection(
882-
std::optional<uint16_t> status_code, absl::Span<FieldView> fields) {
882+
std::optional<uint16_t> status_code, absl::Span<const FieldView> fields) {
883883
absl::StatusOr<uint64_t> field_section_length = GetFieldSectionLength(fields);
884884
if (!field_section_length.ok()) {
885885
return field_section_length.status();
@@ -945,7 +945,7 @@ BinaryHttpResponse::IndeterminateLengthEncoder::GetMessageSectionString(
945945

946946
absl::StatusOr<std::string>
947947
BinaryHttpResponse::IndeterminateLengthEncoder::EncodeInformationalResponse(
948-
uint16_t status_code, absl::Span<FieldView> fields) {
948+
uint16_t status_code, absl::Span<const FieldView> fields) {
949949
if (current_section_ !=
950950
IndeterminateLengthMessageSection::kFramingIndicator &&
951951
current_section_ !=
@@ -973,7 +973,7 @@ BinaryHttpResponse::IndeterminateLengthEncoder::EncodeInformationalResponse(
973973

974974
absl::StatusOr<std::string>
975975
BinaryHttpResponse::IndeterminateLengthEncoder::EncodeHeaders(
976-
uint16_t status_code, absl::Span<FieldView> headers) {
976+
uint16_t status_code, absl::Span<const FieldView> headers) {
977977
if (current_section_ !=
978978
IndeterminateLengthMessageSection::kFramingIndicator &&
979979
current_section_ !=
@@ -1000,7 +1000,7 @@ BinaryHttpResponse::IndeterminateLengthEncoder::EncodeHeaders(
10001000

10011001
absl::StatusOr<std::string>
10021002
BinaryHttpResponse::IndeterminateLengthEncoder::EncodeBodyChunks(
1003-
absl::Span<absl::string_view> body_chunks, bool body_chunks_done) {
1003+
absl::Span<const absl::string_view> body_chunks, bool body_chunks_done) {
10041004
if (current_section_ != IndeterminateLengthMessageSection::kBody) {
10051005
current_section_ = IndeterminateLengthMessageSection::kEnd;
10061006
return absl::InvalidArgumentError(
@@ -1021,7 +1021,7 @@ BinaryHttpResponse::IndeterminateLengthEncoder::EncodeBodyChunks(
10211021

10221022
absl::StatusOr<std::string>
10231023
BinaryHttpResponse::IndeterminateLengthEncoder::EncodeTrailers(
1024-
absl::Span<FieldView> trailers) {
1024+
absl::Span<const FieldView> trailers) {
10251025
if (current_section_ != IndeterminateLengthMessageSection::kTrailer) {
10261026
current_section_ = IndeterminateLengthMessageSection::kEnd;
10271027
return absl::InvalidArgumentError(

quiche/binary_http/binary_http_message.h

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -284,19 +284,22 @@ class QUICHE_EXPORT BinaryHttpRequest::IndeterminateLengthEncoder {
284284
absl::StatusOr<std::string> EncodeControlData(
285285
const ControlData& control_data);
286286
// Encodes the specified headers and its content terminator.
287-
absl::StatusOr<std::string> EncodeHeaders(absl::Span<FieldView> headers);
287+
absl::StatusOr<std::string> EncodeHeaders(
288+
absl::Span<const FieldView> headers);
288289
// Encodes the specified body chunks. This can be called multiple times but
289290
// it needs to be called exactly once with `body_chunks_done` set to true at
290291
// the end to properly set the content terminator. Encoding body chunks is
291292
// optional since valid chunked messages can be truncated.
292293
absl::StatusOr<std::string> EncodeBodyChunks(
293-
absl::Span<absl::string_view> body_chunks, bool body_chunks_done);
294+
absl::Span<const absl::string_view> body_chunks, bool body_chunks_done);
294295
// Encodes the specified trailers and its content terminator. Encoding
295296
// trailers is optional since valid chunked messages can be truncated.
296-
absl::StatusOr<std::string> EncodeTrailers(absl::Span<FieldView> trailers);
297+
absl::StatusOr<std::string> EncodeTrailers(
298+
absl::Span<const FieldView> trailers);
297299

298300
private:
299-
absl::StatusOr<std::string> EncodeFieldSection(absl::Span<FieldView> fields);
301+
absl::StatusOr<std::string> EncodeFieldSection(
302+
absl::Span<const FieldView> fields);
300303

301304
IndeterminateLengthMessageSection current_section_ =
302305
IndeterminateLengthMessageSection::kControlData;
@@ -504,23 +507,24 @@ class QUICHE_EXPORT BinaryHttpResponse::IndeterminateLengthEncoder {
504507
// Encodes the specified informational response status code, fields, and its
505508
// content terminator.
506509
absl::StatusOr<std::string> EncodeInformationalResponse(
507-
uint16_t status_code, absl::Span<FieldView> fields);
510+
uint16_t status_code, absl::Span<const FieldView> fields);
508511
// Encodes the specified status code, headers, and its content terminator.
509-
absl::StatusOr<std::string> EncodeHeaders(uint16_t status_code,
510-
absl::Span<FieldView> headers);
512+
absl::StatusOr<std::string> EncodeHeaders(
513+
uint16_t status_code, absl::Span<const FieldView> headers);
511514
// Encodes the specified body chunks. This can be called multiple times but
512515
// it needs to be called exactly once with `body_chunks_done` set to true at
513516
// the end to properly set the content terminator. Encoding body chunks is
514517
// optional since valid chunked messages can be truncated.
515518
absl::StatusOr<std::string> EncodeBodyChunks(
516-
absl::Span<absl::string_view> body_chunks, bool body_chunks_done);
519+
absl::Span<const absl::string_view> body_chunks, bool body_chunks_done);
517520
// Encodes the specified trailers and its content terminator. Encoding
518521
// trailers is optional since valid chunked messages can be truncated.
519-
absl::StatusOr<std::string> EncodeTrailers(absl::Span<FieldView> trailers);
522+
absl::StatusOr<std::string> EncodeTrailers(
523+
absl::Span<const FieldView> trailers);
520524

521525
private:
522526
absl::StatusOr<std::string> EncodeFieldSection(
523-
std::optional<uint16_t> status_code, absl::Span<FieldView> fields);
527+
std::optional<uint16_t> status_code, absl::Span<const FieldView> fields);
524528
std::string GetMessageSectionString(
525529
IndeterminateLengthMessageSection section) const;
526530

quiche/binary_http/binary_http_message_test.cc

Lines changed: 31 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -826,22 +826,20 @@ TEST(RequestIndeterminateLengthEncoder, FullRequest) {
826826
encoded_data += *status_or_encoded_data;
827827
}
828828

829-
status_or_encoded_data =
830-
encoder.EncodeHeaders(absl::MakeSpan(test_data.headers));
829+
status_or_encoded_data = encoder.EncodeHeaders(test_data.headers);
831830
QUICHE_EXPECT_OK(status_or_encoded_data);
832831
if (status_or_encoded_data.ok()) {
833832
encoded_data += *status_or_encoded_data;
834833
}
835834

836835
status_or_encoded_data =
837-
encoder.EncodeBodyChunks(absl::MakeSpan(test_data.body_chunks), true);
836+
encoder.EncodeBodyChunks(test_data.body_chunks, true);
838837
QUICHE_EXPECT_OK(status_or_encoded_data);
839838
if (status_or_encoded_data.ok()) {
840839
encoded_data += *status_or_encoded_data;
841840
}
842841

843-
status_or_encoded_data =
844-
encoder.EncodeTrailers(absl::MakeSpan(test_data.trailers));
842+
status_or_encoded_data = encoder.EncodeTrailers(test_data.trailers);
845843
QUICHE_EXPECT_OK(status_or_encoded_data);
846844
if (status_or_encoded_data.ok()) {
847845
encoded_data += *status_or_encoded_data;
@@ -871,8 +869,7 @@ TEST(RequestIndeterminateLengthEncoder, RequestNoBody) {
871869
encoded_data += *status_or_encoded_data;
872870
}
873871

874-
status_or_encoded_data =
875-
encoder.EncodeHeaders(absl::MakeSpan(test_data.headers));
872+
status_or_encoded_data = encoder.EncodeHeaders(test_data.headers);
876873
QUICHE_EXPECT_OK(status_or_encoded_data);
877874
if (status_or_encoded_data.ok()) {
878875
encoded_data += *status_or_encoded_data;
@@ -914,27 +911,26 @@ TEST(RequestIndeterminateLengthEncoder, EncodingChunksMultipleTimes) {
914911
encoded_data += *status_or_encoded_data;
915912
}
916913

917-
status_or_encoded_data =
918-
encoder.EncodeHeaders(absl::MakeSpan(test_data.headers));
914+
status_or_encoded_data = encoder.EncodeHeaders(test_data.headers);
919915
QUICHE_EXPECT_OK(status_or_encoded_data);
920916
if (status_or_encoded_data.ok()) {
921917
encoded_data += *status_or_encoded_data;
922918
}
923919

924-
status_or_encoded_data = encoder.EncodeBodyChunks(
925-
absl::MakeSpan(test_data.body_chunks.data(), 1), false);
920+
status_or_encoded_data =
921+
encoder.EncodeBodyChunks({test_data.body_chunks[0]}, false);
926922
QUICHE_EXPECT_OK(status_or_encoded_data);
927923
if (status_or_encoded_data.ok()) {
928924
encoded_data += *status_or_encoded_data;
929925
}
930-
status_or_encoded_data = encoder.EncodeBodyChunks(
931-
absl::MakeSpan(test_data.body_chunks.data() + 1, 1), false);
926+
status_or_encoded_data =
927+
encoder.EncodeBodyChunks({test_data.body_chunks[1]}, false);
932928
QUICHE_EXPECT_OK(status_or_encoded_data);
933929
if (status_or_encoded_data.ok()) {
934930
encoded_data += *status_or_encoded_data;
935931
}
936-
status_or_encoded_data = encoder.EncodeBodyChunks(
937-
absl::MakeSpan(test_data.body_chunks.data() + 2, 1), false);
932+
status_or_encoded_data =
933+
encoder.EncodeBodyChunks({test_data.body_chunks[2]}, false);
938934
QUICHE_EXPECT_OK(status_or_encoded_data);
939935
if (status_or_encoded_data.ok()) {
940936
encoded_data += *status_or_encoded_data;
@@ -945,8 +941,7 @@ TEST(RequestIndeterminateLengthEncoder, EncodingChunksMultipleTimes) {
945941
encoded_data += *status_or_encoded_data;
946942
}
947943

948-
status_or_encoded_data =
949-
encoder.EncodeTrailers(absl::MakeSpan(test_data.trailers));
944+
status_or_encoded_data = encoder.EncodeTrailers(test_data.trailers);
950945
QUICHE_EXPECT_OK(status_or_encoded_data);
951946
if (status_or_encoded_data.ok()) {
952947
encoded_data += *status_or_encoded_data;
@@ -1712,27 +1707,25 @@ TEST(ResponseIndeterminateLengthEncoder, WithInformationalResponses) {
17121707
std::string encoded_data;
17131708

17141709
absl::StatusOr<std::string> status_or_encoded_data =
1715-
encoder.EncodeInformationalResponse(
1716-
102, absl::MakeSpan(test_data.informationalResponse1));
1710+
encoder.EncodeInformationalResponse(102,
1711+
test_data.informationalResponse1);
17171712
QUICHE_EXPECT_OK(status_or_encoded_data);
17181713
encoded_data += *status_or_encoded_data;
17191714
status_or_encoded_data = encoder.EncodeInformationalResponse(
1720-
103, absl::MakeSpan(test_data.informationalResponse2));
1715+
103, test_data.informationalResponse2);
17211716
QUICHE_EXPECT_OK(status_or_encoded_data);
17221717
encoded_data += *status_or_encoded_data;
17231718

1724-
status_or_encoded_data =
1725-
encoder.EncodeHeaders(200, absl::MakeSpan(test_data.headers));
1719+
status_or_encoded_data = encoder.EncodeHeaders(200, test_data.headers);
17261720
QUICHE_EXPECT_OK(status_or_encoded_data);
17271721
encoded_data += *status_or_encoded_data;
17281722

17291723
status_or_encoded_data =
1730-
encoder.EncodeBodyChunks(absl::MakeSpan(test_data.body_chunks), true);
1724+
encoder.EncodeBodyChunks(test_data.body_chunks, true);
17311725
QUICHE_EXPECT_OK(status_or_encoded_data);
17321726
encoded_data += *status_or_encoded_data;
17331727

1734-
status_or_encoded_data =
1735-
encoder.EncodeTrailers(absl::MakeSpan(test_data.trailers));
1728+
status_or_encoded_data = encoder.EncodeTrailers(test_data.trailers);
17361729
QUICHE_EXPECT_OK(status_or_encoded_data);
17371730
encoded_data += *status_or_encoded_data;
17381731

@@ -1753,17 +1746,16 @@ TEST(ResponseIndeterminateLengthEncoder, NoInformationalResponses) {
17531746
std::string encoded_data;
17541747

17551748
absl::StatusOr<std::string> status_or_encoded_data =
1756-
encoder.EncodeHeaders(200, absl::MakeSpan(test_data.headers));
1749+
encoder.EncodeHeaders(200, test_data.headers);
17571750
QUICHE_EXPECT_OK(status_or_encoded_data);
17581751
encoded_data += *status_or_encoded_data;
17591752

17601753
status_or_encoded_data =
1761-
encoder.EncodeBodyChunks(absl::MakeSpan(test_data.body_chunks), true);
1754+
encoder.EncodeBodyChunks(test_data.body_chunks, true);
17621755
QUICHE_EXPECT_OK(status_or_encoded_data);
17631756
encoded_data += *status_or_encoded_data;
17641757

1765-
status_or_encoded_data =
1766-
encoder.EncodeTrailers(absl::MakeSpan(test_data.trailers));
1758+
status_or_encoded_data = encoder.EncodeTrailers(test_data.trailers);
17671759
QUICHE_EXPECT_OK(status_or_encoded_data);
17681760
encoded_data += *status_or_encoded_data;
17691761

@@ -1784,32 +1776,31 @@ TEST(ResponseIndeterminateLengthEncoder, EncodingChunksMultipleTimes) {
17841776
std::string encoded_data;
17851777

17861778
absl::StatusOr<std::string> status_or_encoded_data =
1787-
encoder.EncodeHeaders(200, absl::MakeSpan(test_data.headers));
1779+
encoder.EncodeHeaders(200, test_data.headers);
17881780
QUICHE_EXPECT_OK(status_or_encoded_data);
17891781
encoded_data += *status_or_encoded_data;
17901782

1791-
status_or_encoded_data = encoder.EncodeBodyChunks(
1792-
absl::MakeSpan(test_data.body_chunks.data(), 1), false);
1783+
status_or_encoded_data =
1784+
encoder.EncodeBodyChunks({test_data.body_chunks[0]}, false);
17931785
QUICHE_EXPECT_OK(status_or_encoded_data);
17941786
encoded_data += *status_or_encoded_data;
1795-
status_or_encoded_data = encoder.EncodeBodyChunks(
1796-
absl::MakeSpan(test_data.body_chunks.data() + 1, 1), false);
1787+
status_or_encoded_data =
1788+
encoder.EncodeBodyChunks({test_data.body_chunks[1]}, false);
17971789
QUICHE_EXPECT_OK(status_or_encoded_data);
17981790
encoded_data += *status_or_encoded_data;
1799-
status_or_encoded_data = encoder.EncodeBodyChunks(
1800-
absl::MakeSpan(test_data.body_chunks.data() + 2, 1), false);
1791+
status_or_encoded_data =
1792+
encoder.EncodeBodyChunks({test_data.body_chunks[2]}, false);
18011793
QUICHE_EXPECT_OK(status_or_encoded_data);
18021794
encoded_data += *status_or_encoded_data;
1803-
status_or_encoded_data = encoder.EncodeBodyChunks(
1804-
absl::MakeSpan(test_data.body_chunks.data() + 3, 1), false);
1795+
status_or_encoded_data =
1796+
encoder.EncodeBodyChunks({test_data.body_chunks[3]}, false);
18051797
QUICHE_EXPECT_OK(status_or_encoded_data);
18061798
encoded_data += *status_or_encoded_data;
18071799
status_or_encoded_data = encoder.EncodeBodyChunks({}, true);
18081800
QUICHE_EXPECT_OK(status_or_encoded_data);
18091801
encoded_data += *status_or_encoded_data;
18101802

1811-
status_or_encoded_data =
1812-
encoder.EncodeTrailers(absl::MakeSpan(test_data.trailers));
1803+
status_or_encoded_data = encoder.EncodeTrailers(test_data.trailers);
18131804
QUICHE_EXPECT_OK(status_or_encoded_data);
18141805
encoded_data += *status_or_encoded_data;
18151806
EXPECT_EQ(encoded_data, expected);

0 commit comments

Comments
 (0)