@@ -2273,11 +2273,25 @@ folly::Expected<Unannounce, ErrorCode> MoQFrameParser::parseUnannounce(
22732273 folly::io::Cursor& cursor,
22742274 size_t length) const noexcept {
22752275 Unannounce unannounce;
2276- auto res = parseFixedTuple (cursor, length);
2277- if (!res) {
2278- return folly::makeUnexpected (res.error ());
2276+
2277+ if (getDraftMajorVersion (*version_) >= 16 ) {
2278+ // v16+: Parse Request ID
2279+ auto requestID = quic::follyutils::decodeQuicInteger (cursor, length);
2280+ if (!requestID) {
2281+ XLOG (DBG4 ) << " parseUnannounce: UNDERFLOW on requestID" ;
2282+ return folly::makeUnexpected (ErrorCode::PARSE_UNDERFLOW );
2283+ }
2284+ length -= requestID->second ;
2285+ unannounce.requestID = RequestID (requestID->first );
2286+ } else {
2287+ // v15 and below: Parse TrackNamespace
2288+ auto res = parseFixedTuple (cursor, length);
2289+ if (!res) {
2290+ return folly::makeUnexpected (res.error ());
2291+ }
2292+ unannounce.trackNamespace = TrackNamespace (std::move (res.value ()));
22792293 }
2280- unannounce. trackNamespace = TrackNamespace ( std::move (res. value ()));
2294+
22812295 if (length > 0 ) {
22822296 return folly::makeUnexpected (ErrorCode::PROTOCOL_VIOLATION );
22832297 }
@@ -2288,11 +2302,24 @@ folly::Expected<AnnounceCancel, ErrorCode> MoQFrameParser::parseAnnounceCancel(
22882302 folly::io::Cursor& cursor,
22892303 size_t length) const noexcept {
22902304 AnnounceCancel announceCancel;
2291- auto res = parseFixedTuple (cursor, length);
2292- if (!res) {
2293- return folly::makeUnexpected (res.error ());
2305+
2306+ if (getDraftMajorVersion (*version_) >= 16 ) {
2307+ // v16+: Parse Request ID
2308+ auto requestID = quic::follyutils::decodeQuicInteger (cursor, length);
2309+ if (!requestID) {
2310+ XLOG (DBG4 ) << " parseAnnounceCancel: UNDERFLOW on requestID" ;
2311+ return folly::makeUnexpected (ErrorCode::PARSE_UNDERFLOW );
2312+ }
2313+ length -= requestID->second ;
2314+ announceCancel.requestID = RequestID (requestID->first );
2315+ } else {
2316+ // v15 and below: Parse TrackNamespace
2317+ auto res = parseFixedTuple (cursor, length);
2318+ if (!res) {
2319+ return folly::makeUnexpected (res.error ());
2320+ }
2321+ announceCancel.trackNamespace = TrackNamespace (std::move (res.value ()));
22942322 }
2295- announceCancel.trackNamespace = TrackNamespace (std::move (res.value ()));
22962323
22972324 auto errorCode = quic::follyutils::decodeQuicInteger (cursor, length);
22982325 if (!errorCode) {
@@ -4637,7 +4664,17 @@ WriteResult MoQFrameWriter::writeUnannounce(
46374664 size_t size = 0 ;
46384665 bool error = false ;
46394666 auto sizePtr = writeFrameHeader (writeBuf, FrameType::UNANNOUNCE , error);
4640- writeTrackNamespace (writeBuf, unannounce.trackNamespace , size, error);
4667+
4668+ if (getDraftMajorVersion (*version_) >= 16 ) {
4669+ // v16+: Write Request ID
4670+ CHECK (unannounce.requestID .hasValue ())
4671+ << " RequestID required for v16+ Unannounce" ;
4672+ writeVarint (writeBuf, unannounce.requestID ->value , size, error);
4673+ } else {
4674+ // v15 and below: Write TrackNamespace
4675+ writeTrackNamespace (writeBuf, unannounce.trackNamespace , size, error);
4676+ }
4677+
46414678 writeSize (sizePtr, size, error, *version_);
46424679 if (error) {
46434680 return folly::makeUnexpected (quic::TransportErrorCode::INTERNAL_ERROR );
@@ -4653,7 +4690,17 @@ WriteResult MoQFrameWriter::writeAnnounceCancel(
46534690 size_t size = 0 ;
46544691 bool error = false ;
46554692 auto sizePtr = writeFrameHeader (writeBuf, FrameType::ANNOUNCE_CANCEL , error);
4656- writeTrackNamespace (writeBuf, announceCancel.trackNamespace , size, error);
4693+
4694+ if (getDraftMajorVersion (*version_) >= 16 ) {
4695+ // v16+: Write Request ID
4696+ CHECK (announceCancel.requestID .hasValue ())
4697+ << " RequestID required for v16+ AnnounceCancel" ;
4698+ writeVarint (writeBuf, announceCancel.requestID ->value , size, error);
4699+ } else {
4700+ // v15 and below: Write TrackNamespace
4701+ writeTrackNamespace (writeBuf, announceCancel.trackNamespace , size, error);
4702+ }
4703+
46574704 writeVarint (
46584705 writeBuf, folly::to_underlying (announceCancel.errorCode ), size, error);
46594706 writeFixedString (writeBuf, announceCancel.reasonPhrase , size, error);
0 commit comments