Don't crash on sending empty MOQT datagrams.

PiperOrigin-RevId: 998811564
diff --git a/quiche/quic/moqt/moqt_live_publisher.cc b/quiche/quic/moqt/moqt_live_publisher.cc
index ea76f28..9c4639e 100644
--- a/quiche/quic/moqt/moqt_live_publisher.cc
+++ b/quiche/quic/moqt/moqt_live_publisher.cc
@@ -382,9 +382,16 @@
   QUICHE_BUG_IF(LivePublisher_SendDatagram_partial_payload,
                 object->payload.size() > 1)
       << "Datagram is split into multiple slices";
-  quiche::QuicheBuffer datagram = framer_.SerializeObjectDatagram(
-      header, object->payload[0].AsStringView(),
-      default_publisher_priority_.value_or(kDefaultPublisherPriority));
+  quiche::QuicheBuffer datagram;
+  if (object->payload.empty()) {
+    datagram = framer_.SerializeObjectDatagram(
+        header, "",
+        default_publisher_priority_.value_or(kDefaultPublisherPriority));
+  } else {
+    datagram = framer_.SerializeObjectDatagram(
+        header, object->payload[0].AsStringView(),
+        default_publisher_priority_.value_or(kDefaultPublisherPriority));
+  }
   if (visitor() == nullptr) {
     return;
   }
diff --git a/quiche/quic/moqt/moqt_live_publisher_test.cc b/quiche/quic/moqt/moqt_live_publisher_test.cc
index 9e3610f..c4ccc13 100644
--- a/quiche/quic/moqt/moqt_live_publisher_test.cc
+++ b/quiche/quic/moqt/moqt_live_publisher_test.cc
@@ -529,6 +529,31 @@
   publisher_->OnNewObjectAvailable(Location(1, 0), std::nullopt, 128);
 }
 
+TEST_F(LivePublisherTest, OnNewObjectAvailableStatusDatagram) {
+  PublishedObjectMetadata metadata{Location(1, 0),
+                                   /*subgroup=*/std::nullopt,
+                                   /*properties=*/"",
+                                   MoqtObjectStatus::kEndOfGroup,
+                                   /*publisher_priority=*/128,
+                                   /*first_object_in_subgroup=*/std::nullopt,
+                                   /*payload_length=*/0};
+  EXPECT_CALL(*track_publisher_,
+              GetCachedObject(1, std::optional<uint64_t>(), 0, 0))
+      .WillOnce(Return(PublishedObject{metadata, {}, false}))
+      .WillOnce(Return(PublishedObject{metadata, {}, false}));
+  EXPECT_CALL(webtrans_, SendOrQueueDatagram)
+      .WillOnce([](absl::string_view datagram) {
+        MoqtObject message;
+        bool use_default_priority;
+        absl::StatusOr<absl::string_view> payload =
+            ParseDatagram(datagram, message, use_default_priority);
+        EXPECT_TRUE(payload.ok() && payload->empty());
+        EXPECT_EQ(message.object_status, MoqtObjectStatus::kEndOfGroup);
+        return DatagramStatus(DatagramStatusCode::kSuccess, "");
+      });
+  publisher_->OnNewObjectAvailable(Location(1, 0), std::nullopt, 128);
+}
+
 TEST_F(LivePublisherTest, OnNewObjectAvailableStreamCreationBlocked) {
   CreatePendingStream(Location(1, 0), 0, 128);
 }