Skip to content

Commit cfef683

Browse files
DavidSchinazicopybara-github
authored andcommitted
Allow selecting the binary HTTP encoding in OHTTP test client
PiperOrigin-RevId: 865532368
1 parent 6947d9e commit cfef683

File tree

3 files changed

+46
-37
lines changed

3 files changed

+46
-37
lines changed

quiche/quic/masque/masque_ohttp_client.cc

Lines changed: 29 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -344,21 +344,14 @@ absl::Status MasqueOhttpClient::SendOhttpRequest(
344344
return absl::InternalError(
345345
"Cannot send OHTTP request without OHTTP client");
346346
}
347-
if (pending_request.per_request_config.use_chunked_ohttp()) {
348-
pending_request.chunk_handler = std::make_unique<ChunkHandler>();
349-
absl::StatusOr<ChunkedObliviousHttpClient> chunked_client =
350-
ChunkedObliviousHttpClient::Create(ohttp_client_->GetPublicKey(),
351-
ohttp_client_->GetKeyConfig(),
352-
pending_request.chunk_handler.get());
353-
if (!chunked_client.ok()) {
354-
return absl::InternalError(
355-
absl::StrCat("Failed to create chunked OHTTP client: ",
356-
chunked_client.status().message()));
357-
}
358-
347+
std::string encoded_data;
348+
const bool use_indeterminate_length =
349+
per_request_config.use_indeterminate_length().value_or(
350+
per_request_config.use_chunked_ohttp());
351+
if (use_indeterminate_length) {
359352
BinaryHttpRequest::IndeterminateLengthEncoder encoder;
360353

361-
QUICHE_ASSIGN_OR_RETURN(std::string encoded_data,
354+
QUICHE_ASSIGN_OR_RETURN(encoded_data,
362355
encoder.EncodeControlData(control_data));
363356
std::vector<quiche::BinaryHttpMessage::FieldView> headers;
364357
if (!formatted_token.empty()) {
@@ -393,40 +386,39 @@ absl::Status MasqueOhttpClient::SendOhttpRequest(
393386
QUICHE_ASSIGN_OR_RETURN(std::string encoded_trailers,
394387
encoder.EncodeTrailers(absl::MakeSpan(trailers)));
395388
encoded_data += encoded_trailers;
396-
389+
} else {
390+
BinaryHttpRequest binary_request(control_data);
391+
binary_request.set_body(post_data);
392+
if (!formatted_token.empty()) {
393+
binary_request.AddHeaderField({"authorization", formatted_token});
394+
}
395+
QUICHE_ASSIGN_OR_RETURN(encoded_data, binary_request.Serialize());
396+
}
397+
if (pending_request.per_request_config.use_chunked_ohttp()) {
398+
pending_request.chunk_handler = std::make_unique<ChunkHandler>();
399+
QUICHE_ASSIGN_OR_RETURN(
400+
ChunkedObliviousHttpClient chunked_client,
401+
ChunkedObliviousHttpClient::Create(
402+
ohttp_client_->GetPublicKey(), ohttp_client_->GetKeyConfig(),
403+
pending_request.chunk_handler.get()));
397404
// Intentionally split the data into two chunks to test encryption chunking.
398405
QUICHE_ASSIGN_OR_RETURN(encrypted_data,
399-
chunked_client->EncryptRequestChunk(
406+
chunked_client.EncryptRequestChunk(
400407
absl::string_view(encoded_data).substr(0, 1),
401408
/*is_final_chunk=*/false));
402409
QUICHE_ASSIGN_OR_RETURN(std::string encrypted_data2,
403-
chunked_client->EncryptRequestChunk(
410+
chunked_client.EncryptRequestChunk(
404411
absl::string_view(encoded_data).substr(1),
405412
/*is_final_chunk=*/true));
406413
encrypted_data += encrypted_data2;
407414

408-
pending_request.chunk_handler->SetChunkedClient(std::move(*chunked_client));
415+
pending_request.chunk_handler->SetChunkedClient(std::move(chunked_client));
409416
} else {
410-
BinaryHttpRequest binary_request(control_data);
411-
binary_request.set_body(post_data);
412-
if (!formatted_token.empty()) {
413-
binary_request.AddHeaderField({"authorization", formatted_token});
414-
}
415-
absl::StatusOr<std::string> encoded_request = binary_request.Serialize();
416-
if (!encoded_request.ok()) {
417-
return absl::InternalError(
418-
absl::StrCat("Failed to serialize OHTTP request: ",
419-
encoded_request.status().message()));
420-
}
421-
absl::StatusOr<ObliviousHttpRequest> ohttp_request =
422-
ohttp_client_->CreateObliviousHttpRequest(*encoded_request);
423-
if (!ohttp_request.ok()) {
424-
return absl::InternalError(
425-
absl::StrCat("Failed to create OHTTP request: ",
426-
ohttp_request.status().message()));
427-
}
428-
encrypted_data = ohttp_request->EncapsulateAndSerialize();
429-
pending_request.context.emplace(std::move(*ohttp_request).ReleaseContext());
417+
QUICHE_ASSIGN_OR_RETURN(
418+
ObliviousHttpRequest ohttp_request,
419+
ohttp_client_->CreateObliviousHttpRequest(encoded_data));
420+
encrypted_data = ohttp_request.EncapsulateAndSerialize();
421+
pending_request.context.emplace(std::move(ohttp_request).ReleaseContext());
430422
}
431423
Message request;
432424
request.headers[":method"] = "POST";

quiche/quic/masque/masque_ohttp_client.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ class QUICHE_EXPORT MasqueOhttpClient
4949
void SetUseChunkedOhttp(bool use_chunked_ohttp) {
5050
use_chunked_ohttp_ = use_chunked_ohttp;
5151
}
52+
void SetUseIndeterminateLength(
53+
std::optional<bool> use_indeterminate_length) {
54+
use_indeterminate_length_ = use_indeterminate_length;
55+
}
5256
void SetExpectedGatewayError(const std::string& expected_gateway_error) {
5357
expected_gateway_error_ = expected_gateway_error;
5458
}
@@ -71,6 +75,9 @@ class QUICHE_EXPORT MasqueOhttpClient
7175
std::string post_data() const { return post_data_; }
7276
std::string private_token() const { return private_token_; }
7377
bool use_chunked_ohttp() const { return use_chunked_ohttp_; }
78+
std::optional<bool> use_indeterminate_length() const {
79+
return use_indeterminate_length_;
80+
}
7481
std::optional<std::string> expected_gateway_error() const {
7582
return expected_gateway_error_;
7683
}
@@ -89,6 +96,7 @@ class QUICHE_EXPORT MasqueOhttpClient
8996
std::string post_data_;
9097
std::string private_token_;
9198
bool use_chunked_ohttp_ = false;
99+
std::optional<bool> use_indeterminate_length_;
92100
std::optional<std::string> expected_gateway_error_;
93101
std::optional<uint16_t> expected_gateway_status_code_;
94102
std::optional<uint16_t> expected_encapsulated_status_code_;

quiche/quic/masque/masque_ohttp_client_bin.cc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ DEFINE_QUICHE_COMMAND_LINE_FLAG(
3131
DEFINE_QUICHE_COMMAND_LINE_FLAG(bool, chunked, false,
3232
"If true, use chunked OHTTP.");
3333

34+
DEFINE_QUICHE_COMMAND_LINE_FLAG(std::optional<bool>, indeterminate_length,
35+
std::nullopt,
36+
"If set, overrides whether to use the "
37+
"indeterminate length binary HTTP encoding. If "
38+
"unset, uses the value of --chunked.");
39+
3440
DEFINE_QUICHE_COMMAND_LINE_FLAG(int, address_family, 0,
3541
"IP address family to use. Must be 0, 4 or 6. "
3642
"Defaults to 0 which means any.");
@@ -87,6 +93,8 @@ absl::Status RunMasqueOhttpClient(int argc, char* argv[]) {
8793
quiche::GetQuicheCommandLineFlag(FLAGS_use_mtls_for_key_fetch);
8894
const bool use_chunked_ohttp =
8995
quiche::GetQuicheCommandLineFlag(FLAGS_chunked);
96+
const std::optional<bool> indeterminate_length =
97+
quiche::GetQuicheCommandLineFlag(FLAGS_indeterminate_length);
9098
const std::string client_cert_file =
9199
quiche::GetQuicheCommandLineFlag(FLAGS_client_cert_file);
92100
const std::string client_cert_key_file =
@@ -137,6 +145,7 @@ absl::Status RunMasqueOhttpClient(int argc, char* argv[]) {
137145
MasqueOhttpClient::Config::PerRequestConfig per_request_config(urls[i]);
138146
per_request_config.SetPostData(post_data);
139147
per_request_config.SetUseChunkedOhttp(use_chunked_ohttp);
148+
per_request_config.SetUseIndeterminateLength(indeterminate_length);
140149
per_request_config.SetPrivateToken(private_token);
141150
if (expect_gateway_error.has_value()) {
142151
per_request_config.SetExpectedGatewayError(*expect_gateway_error);

0 commit comments

Comments
 (0)