Joining FETCH is allowed for any subscribe with forward = 1, without regard for filter type. This is a draft-17 change, but it has impacts on the REWIND implementation work I'm doing. In practice, this isn't going to meaningfully break interoperability with draft 16. PiperOrigin-RevId: 897192903
diff --git a/quiche/quic/moqt/moqt_session.cc b/quiche/quic/moqt/moqt_session.cc index aeb4e1f..c69ac4d 100644 --- a/quiche/quic/moqt/moqt_session.cc +++ b/quiche/quic/moqt/moqt_session.cc
@@ -1481,9 +1481,9 @@ if (!it->second->can_have_joining_fetch()) { QUIC_DLOG(INFO) << ENDPOINT << "Received a JOINING_FETCH for " << "joining_request_id " << joining_request_id - << " that is not a LargestObject"; + << " that is not forwarding"; session_->Error(MoqtError::kProtocolViolation, - "Joining Fetch for non-LargestObject subscribe"); + "Joining Fetch for non-forwarding subscribe"); return; } track_name = it->second->publisher().GetTrackName(); @@ -1862,10 +1862,7 @@ : session_(session), track_publisher_(track_publisher), request_id_(subscribe.request_id), - can_have_joining_fetch_( - subscribe.parameters.subscription_filter.has_value() && - subscribe.parameters.subscription_filter->type() == - MoqtFilterType::kLargestObject), + can_have_joining_fetch_(subscribe.parameters.forward()), track_alias_(track_alias), parameters_(subscribe.parameters), monitoring_interface_(monitoring_interface) { @@ -1909,9 +1906,7 @@ // TODO(martinduke): If there are auth tokens, this probably has to go to the // application. parameters_.Update(parameters); - can_have_joining_fetch_ = (parameters_.subscription_filter.has_value() && - parameters_.subscription_filter->type() == - MoqtFilterType::kLargestObject); + can_have_joining_fetch_ = parameters_.forward(); } void MoqtSession::PublishedSubscription::set_subscriber_priority(
diff --git a/quiche/quic/moqt/moqt_session_test.cc b/quiche/quic/moqt/moqt_session_test.cc index 22b8d38..22c7d4b 100644 --- a/quiche/quic/moqt/moqt_session_test.cc +++ b/quiche/quic/moqt/moqt_session_test.cc
@@ -2714,8 +2714,9 @@ stream_input->OnFetchMessage(fetch); } -TEST_F(MoqtSessionTest, IncomingJoiningFetchNonLatestObject) { +TEST_F(MoqtSessionTest, IncomingJoiningFetchForwardZero) { MoqtSubscribe subscribe = DefaultSubscribe(); + subscribe.parameters.set_forward(false); std::unique_ptr<MoqtControlParserVisitor> stream_input = MoqtSessionPeer::CreateControlStream(&session_, &mock_stream_); MockTrackPublisher* track = CreateTrackPublisher(); @@ -2727,7 +2728,7 @@ fetch.fetch = JoiningFetchRelative(1, 2); EXPECT_CALL(mock_session_, CloseSession(static_cast<uint64_t>(MoqtError::kProtocolViolation), - "Joining Fetch for non-LargestObject subscribe")) + "Joining Fetch for non-forwarding subscribe")) .Times(1); stream_input->OnFetchMessage(fetch); }