Skip to content

Commit 847fa1b

Browse files
martindukecopybara-github
authored andcommitted
Update messages that will go in SUBSCRIBE_NAMESPACE streams up to draft-16.
REQUEST_OK, REQUEST_ERROR, SUBSCRIBE_NAMESPACE, NAMESPACE, NAMESPACE_DONE. Session-layer processing of SUBSCRIBE_NAMESPACE does not change in this CL. PiperOrigin-RevId: 864976974
1 parent 529ef12 commit 847fa1b

38 files changed

+661
-398
lines changed

quiche/quic/moqt/moqt_bidi_stream.h

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "absl/status/status.h"
1818
#include "absl/strings/string_view.h"
1919
#include "absl/types/span.h"
20+
#include "quiche/quic/core/quic_time.h"
2021
#include "quiche/quic/moqt/moqt_error.h"
2122
#include "quiche/quic/moqt/moqt_framer.h"
2223
#include "quiche/quic/moqt/moqt_key_value_pair.h"
@@ -98,6 +99,13 @@ class MoqtBidiStreamBase : public MoqtControlParserVisitor,
9899
const MoqtPublishNamespaceDone& message) override {
99100
OnParsingError(wrong_message_error_, wrong_message_reason_);
100101
}
102+
virtual void OnNamespaceMessage(const MoqtNamespace& message) override {
103+
OnParsingError(wrong_message_error_, wrong_message_reason_);
104+
}
105+
virtual void OnNamespaceDoneMessage(
106+
const MoqtNamespaceDone& message) override {
107+
OnParsingError(wrong_message_error_, wrong_message_reason_);
108+
}
101109
virtual void OnPublishNamespaceCancelMessage(
102110
const MoqtPublishNamespaceCancel& message) override {
103111
OnParsingError(wrong_message_error_, wrong_message_reason_);
@@ -182,21 +190,27 @@ class MoqtBidiStreamBase : public MoqtControlParserVisitor,
182190
}
183191
SendMessage(std::move(message), fin);
184192
}
185-
void SendRequestOk(uint64_t request_id,
186-
const VersionSpecificParameters& parameters,
193+
void SendRequestOk(uint64_t request_id, const MessageParameters& parameters,
187194
bool fin = false) {
188195
SendOrBufferMessage(
189196
framer_->SerializeRequestOk(MoqtRequestOk{request_id, parameters}),
190197
fin);
191198
}
192199
void SendRequestError(uint64_t request_id, RequestErrorCode error_code,
200+
std::optional<quic::QuicTimeDelta> retry_interval,
193201
absl::string_view reason_phrase, bool fin = false) {
194202
MoqtRequestError request_error;
195203
request_error.request_id = request_id;
196204
request_error.error_code = error_code;
205+
request_error.retry_interval = retry_interval;
197206
request_error.reason_phrase = reason_phrase;
198207
SendOrBufferMessage(framer_->SerializeRequestError(request_error), fin);
199208
}
209+
void SendRequestError(uint64_t request_id, MoqtRequestErrorInfo info,
210+
bool fin = false) {
211+
SendRequestError(request_id, info.error_code, info.retry_interval,
212+
info.reason_phrase, fin);
213+
}
200214
void Fin() {
201215
fin_queued_ = true;
202216
if (pending_messages_.empty()) {

quiche/quic/moqt/moqt_bidi_stream_test.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,8 +214,9 @@ TEST_F(MoqtBidiStreamTest, MessageBufferedThenSent) {
214214
stream_->set_stream(&mock_stream_);
215215
EXPECT_CALL(mock_stream_, CanWrite).WillRepeatedly(Return(false));
216216
EXPECT_CALL(mock_stream_, Writev).Times(0);
217-
stream_->SendRequestOk(0, VersionSpecificParameters());
218-
stream_->SendRequestError(2, RequestErrorCode::kUnauthorized, "bad request");
217+
stream_->SendRequestOk(0, MessageParameters());
218+
stream_->SendRequestError(2, RequestErrorCode::kUnauthorized, std::nullopt,
219+
"bad request");
219220
stream_->Fin();
220221
{
221222
testing::InSequence seq;

quiche/quic/moqt/moqt_error.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@
66
#define QUICHE_QUIC_MOQT_MOQT_ERROR_H_
77

88
#include <cstdint>
9+
#include <optional>
910
#include <string>
1011

1112
#include "absl/status/status.h"
1213
#include "absl/strings/string_view.h"
14+
#include "quiche/quic/core/quic_time.h"
1315
#include "quiche/common/platform/api/quiche_export.h"
1416
#include "quiche/web_transport/web_transport.h"
1517

@@ -70,8 +72,9 @@ enum class QUICHE_EXPORT RequestErrorCode : uint64_t {
7072
kExpiredAuthToken = 0x12,
7173
};
7274

73-
struct MoqtErrorPair {
75+
struct MoqtRequestErrorInfo {
7476
RequestErrorCode error_code;
77+
std::optional<quic::QuicTimeDelta> retry_interval;
7578
std::string reason_phrase;
7679
};
7780

quiche/quic/moqt/moqt_fetch_task.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@
55
#ifndef QUICHE_QUIC_MOQT_MOQT_FETCH_TASK_H_
66
#define QUICHE_QUIC_MOQT_MOQT_FETCH_TASK_H_
77

8+
#include <optional>
89
#include <string>
910
#include <utility>
1011
#include <variant>
1112

1213
#include "absl/status/status.h"
14+
#include "quiche/quic/moqt/moqt_error.h"
1315
#include "quiche/quic/moqt/moqt_messages.h"
1416
#include "quiche/quic/moqt/moqt_object.h"
1517
#include "quiche/common/quiche_callbacks.h"
@@ -76,7 +78,7 @@ class MoqtFailedFetch : public MoqtFetchTask {
7678
ObjectsAvailableCallback /*callback*/) override {}
7779
void SetFetchResponseCallback(FetchResponseCallback callback) override {
7880
MoqtRequestError error{/*request_id=*/0, StatusToRequestErrorCode(status_),
79-
std::string(status_.message())};
81+
std::nullopt, std::string(status_.message())};
8082
std::move(callback)(error);
8183
}
8284

quiche/quic/moqt/moqt_framer.cc

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -511,14 +511,9 @@ quiche::QuicheBuffer MoqtFramer::SerializeServerSetup(
511511

512512
quiche::QuicheBuffer MoqtFramer::SerializeRequestOk(
513513
const MoqtRequestOk& message) {
514-
KeyValuePairList parameters;
515-
if (!FillAndValidateVersionSpecificParameters(
516-
MoqtMessageType::kRequestOk, message.parameters, parameters)) {
517-
return quiche::QuicheBuffer();
518-
};
519-
return SerializeControlMessage(MoqtMessageType::kRequestOk,
520-
WireVarInt62(message.request_id),
521-
WireKeyValuePairList(parameters));
514+
return SerializeControlMessage(
515+
MoqtMessageType::kRequestOk, WireVarInt62(message.request_id),
516+
WireKeyValuePairList(message.parameters.ToKeyValuePairList()));
522517
}
523518

524519
quiche::QuicheBuffer MoqtFramer::SerializeSubscribe(
@@ -548,6 +543,9 @@ quiche::QuicheBuffer MoqtFramer::SerializeRequestError(
548543
return SerializeControlMessage(
549544
MoqtMessageType::kRequestError, WireVarInt62(message.request_id),
550545
WireVarInt62(message.error_code),
546+
WireVarInt62(message.retry_interval.has_value()
547+
? message.retry_interval->ToMilliseconds() + 1
548+
: 0),
551549
WireStringWithVarInt62Length(message.reason_phrase));
552550
}
553551

@@ -600,6 +598,20 @@ quiche::QuicheBuffer MoqtFramer::SerializePublishNamespaceDone(
600598
WireTrackNamespace(message.track_namespace));
601599
}
602600

601+
quiche::QuicheBuffer MoqtFramer::SerializeNamespace(
602+
const MoqtNamespace& message) {
603+
return SerializeControlMessage(
604+
MoqtMessageType::kNamespace,
605+
WireTrackNamespace(message.track_namespace_suffix));
606+
}
607+
608+
quiche::QuicheBuffer MoqtFramer::SerializeNamespaceDone(
609+
const MoqtNamespaceDone& message) {
610+
return SerializeControlMessage(
611+
MoqtMessageType::kNamespaceDone,
612+
WireTrackNamespace(message.track_namespace_suffix));
613+
}
614+
603615
quiche::QuicheBuffer MoqtFramer::SerializePublishNamespaceCancel(
604616
const MoqtPublishNamespaceCancel& message) {
605617
return SerializeControlMessage(
@@ -623,16 +635,11 @@ quiche::QuicheBuffer MoqtFramer::SerializeGoAway(const MoqtGoAway& message) {
623635

624636
quiche::QuicheBuffer MoqtFramer::SerializeSubscribeNamespace(
625637
const MoqtSubscribeNamespace& message) {
626-
KeyValuePairList parameters;
627-
if (!FillAndValidateVersionSpecificParameters(
628-
MoqtMessageType::kSubscribeNamespace, message.parameters,
629-
parameters)) {
630-
return quiche::QuicheBuffer();
631-
};
632-
return SerializeControlMessage(MoqtMessageType::kSubscribeNamespace,
633-
WireVarInt62(message.request_id),
634-
WireTrackNamespace(message.track_namespace),
635-
WireKeyValuePairList(parameters));
638+
return SerializeControlMessage(
639+
MoqtMessageType::kSubscribeNamespace, WireVarInt62(message.request_id),
640+
WireTrackNamespace(message.track_namespace_prefix),
641+
WireVarInt62(message.subscribe_options),
642+
WireKeyValuePairList(message.parameters.ToKeyValuePairList()));
636643
}
637644

638645
quiche::QuicheBuffer MoqtFramer::SerializeUnsubscribeNamespace(

quiche/quic/moqt/moqt_framer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ class QUICHE_EXPORT MoqtFramer {
6161
const MoqtPublishNamespace& message);
6262
quiche::QuicheBuffer SerializePublishNamespaceDone(
6363
const MoqtPublishNamespaceDone& message);
64+
quiche::QuicheBuffer SerializeNamespace(const MoqtNamespace& message);
65+
quiche::QuicheBuffer SerializeNamespaceDone(const MoqtNamespaceDone& message);
6466
quiche::QuicheBuffer SerializePublishNamespaceCancel(
6567
const MoqtPublishNamespaceCancel& message);
6668
quiche::QuicheBuffer SerializeTrackStatus(const MoqtTrackStatus& message);

quiche/quic/moqt/moqt_framer_test.cc

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ std::vector<MoqtFramerTestParams> GetMoqtFramerTestParams() {
4444
MoqtMessageType::kPublishDone,
4545
MoqtMessageType::kPublishNamespace,
4646
MoqtMessageType::kPublishNamespaceDone,
47+
MoqtMessageType::kNamespace,
48+
MoqtMessageType::kNamespaceDone,
4749
MoqtMessageType::kPublishNamespaceCancel,
4850
MoqtMessageType::kTrackStatus,
4951
MoqtMessageType::kGoAway,
@@ -134,7 +136,6 @@ class MoqtFramerTest
134136
auto data = std::get<MoqtSubscribeOk>(structured_data);
135137
return framer_.SerializeSubscribeOk(data);
136138
}
137-
138139
case MoqtMessageType::kUnsubscribe: {
139140
auto data = std::get<MoqtUnsubscribe>(structured_data);
140141
return framer_.SerializeUnsubscribe(data);
@@ -151,6 +152,14 @@ class MoqtFramerTest
151152
auto data = std::get<MoqtPublishNamespaceDone>(structured_data);
152153
return framer_.SerializePublishNamespaceDone(data);
153154
}
155+
case MoqtMessageType::kNamespace: {
156+
auto data = std::get<MoqtNamespace>(structured_data);
157+
return framer_.SerializeNamespace(data);
158+
}
159+
case MoqtMessageType::kNamespaceDone: {
160+
auto data = std::get<MoqtNamespaceDone>(structured_data);
161+
return framer_.SerializeNamespaceDone(data);
162+
}
154163
case moqt::MoqtMessageType::kPublishNamespaceCancel: {
155164
auto data = std::get<MoqtPublishNamespaceCancel>(structured_data);
156165
return framer_.SerializePublishNamespaceCancel(data);

0 commit comments

Comments
 (0)