@@ -967,6 +967,17 @@ folly::Expected<Announce, ErrorCode> MoQFrameParser::parseAnnounce(
967
967
folly::io::Cursor& cursor,
968
968
size_t length) const noexcept {
969
969
Announce announce;
970
+ if (getDraftMajorVersion (*version_) >= 11 ) {
971
+ auto requestID = quic::decodeQuicInteger (cursor, length);
972
+ if (!requestID) {
973
+ return folly::makeUnexpected (ErrorCode::PARSE_UNDERFLOW);
974
+ }
975
+ length -= requestID->second ;
976
+ announce.requestID = requestID->first ;
977
+ } else {
978
+ announce.requestID = 0 ;
979
+ }
980
+
970
981
auto res = parseFixedTuple (cursor, length);
971
982
if (!res) {
972
983
return folly::makeUnexpected (res.error ());
@@ -992,11 +1003,21 @@ folly::Expected<AnnounceOk, ErrorCode> MoQFrameParser::parseAnnounceOk(
992
1003
folly::io::Cursor& cursor,
993
1004
size_t length) const noexcept {
994
1005
AnnounceOk announceOk;
995
- auto res = parseFixedTuple (cursor, length);
996
- if (!res) {
997
- return folly::makeUnexpected (res.error ());
1006
+ if (getDraftMajorVersion (*version_) >= 11 ) {
1007
+ auto requestID = quic::decodeQuicInteger (cursor, length);
1008
+ if (!requestID) {
1009
+ return folly::makeUnexpected (ErrorCode::PARSE_UNDERFLOW);
1010
+ }
1011
+ length -= requestID->second ;
1012
+ announceOk.requestID = requestID->first ;
1013
+ } else {
1014
+ announceOk.requestID = 0 ;
1015
+ auto res = parseFixedTuple (cursor, length);
1016
+ if (!res) {
1017
+ return folly::makeUnexpected (res.error ());
1018
+ }
1019
+ announceOk.trackNamespace = TrackNamespace (std::move (res.value ()));
998
1020
}
999
- announceOk.trackNamespace = TrackNamespace (std::move (res.value ()));
1000
1021
if (length > 0 ) {
1001
1022
return folly::makeUnexpected (ErrorCode::PROTOCOL_VIOLATION);
1002
1023
}
@@ -1007,11 +1028,21 @@ folly::Expected<AnnounceError, ErrorCode> MoQFrameParser::parseAnnounceError(
1007
1028
folly::io::Cursor& cursor,
1008
1029
size_t length) const noexcept {
1009
1030
AnnounceError announceError;
1010
- auto res = parseFixedTuple (cursor, length);
1011
- if (!res) {
1012
- return folly::makeUnexpected (res.error ());
1031
+ if (getDraftMajorVersion (*version_) >= 11 ) {
1032
+ auto requestID = quic::decodeQuicInteger (cursor, length);
1033
+ if (!requestID) {
1034
+ return folly::makeUnexpected (ErrorCode::PARSE_UNDERFLOW);
1035
+ }
1036
+ length -= requestID->second ;
1037
+ announceError.requestID = requestID->first ;
1038
+ } else {
1039
+ announceError.requestID = 0 ;
1040
+ auto res = parseFixedTuple (cursor, length);
1041
+ if (!res) {
1042
+ return folly::makeUnexpected (res.error ());
1043
+ }
1044
+ announceError.trackNamespace = TrackNamespace (std::move (res.value ()));
1013
1045
}
1014
- announceError.trackNamespace = TrackNamespace (std::move (res.value ()));
1015
1046
1016
1047
auto errorCode = quic::decodeQuicInteger (cursor, length);
1017
1048
if (!errorCode) {
@@ -1080,6 +1111,16 @@ MoQFrameParser::parseTrackStatusRequest(
1080
1111
<< " version_ needs to be set to parse TrackStatusRequest" ;
1081
1112
1082
1113
TrackStatusRequest trackStatusRequest;
1114
+ if (getDraftMajorVersion (*version_) >= 11 ) {
1115
+ auto requestID = quic::decodeQuicInteger (cursor, length);
1116
+ if (!requestID) {
1117
+ return folly::makeUnexpected (ErrorCode::PARSE_UNDERFLOW);
1118
+ }
1119
+ length -= requestID->second ;
1120
+ trackStatusRequest.requestID = requestID->first ;
1121
+ } else {
1122
+ trackStatusRequest.requestID = 0 ;
1123
+ }
1083
1124
auto res = parseFullTrackName (cursor, length);
1084
1125
if (!res) {
1085
1126
return folly::makeUnexpected (res.error ());
@@ -1110,11 +1151,21 @@ folly::Expected<TrackStatus, ErrorCode> MoQFrameParser::parseTrackStatus(
1110
1151
CHECK (version_.hasValue ()) << " version_ needs to be set to parse TrackStatus" ;
1111
1152
1112
1153
TrackStatus trackStatus;
1113
- auto res = parseFullTrackName (cursor, length);
1114
- if (!res) {
1115
- return folly::makeUnexpected (res.error ());
1154
+ if (getDraftMajorVersion (*version_) >= 11 ) {
1155
+ auto requestID = quic::decodeQuicInteger (cursor, length);
1156
+ if (!requestID) {
1157
+ return folly::makeUnexpected (ErrorCode::PARSE_UNDERFLOW);
1158
+ }
1159
+ length -= requestID->second ;
1160
+ trackStatus.requestID = requestID->first ;
1161
+ } else {
1162
+ trackStatus.requestID = 0 ;
1163
+ auto res = parseFullTrackName (cursor, length);
1164
+ if (!res) {
1165
+ return folly::makeUnexpected (res.error ());
1166
+ }
1167
+ trackStatus.fullTrackName = res.value ();
1116
1168
}
1117
- trackStatus.fullTrackName = res.value ();
1118
1169
auto statusCode = quic::decodeQuicInteger (cursor, length);
1119
1170
if (!statusCode) {
1120
1171
return folly::makeUnexpected (ErrorCode::PARSE_UNDERFLOW);
@@ -1390,7 +1441,7 @@ MoQFrameParser::parseSubscribeAnnounces(
1390
1441
return folly::makeUnexpected (res.error ());
1391
1442
}
1392
1443
return SubscribeAnnounces (
1393
- {std::move (res->trackNamespace ), std::move (res->params )});
1444
+ {res-> requestID , std::move (res->trackNamespace ), std::move (res->params )});
1394
1445
}
1395
1446
1396
1447
folly::Expected<SubscribeAnnouncesOk, ErrorCode>
@@ -1401,7 +1452,7 @@ MoQFrameParser::parseSubscribeAnnouncesOk(
1401
1452
if (!res) {
1402
1453
return folly::makeUnexpected (res.error ());
1403
1454
}
1404
- return SubscribeAnnouncesOk ({std::move (res->trackNamespace )});
1455
+ return SubscribeAnnouncesOk ({res-> requestID , std::move (res->trackNamespace )});
1405
1456
}
1406
1457
1407
1458
folly::Expected<SubscribeAnnouncesError, ErrorCode>
@@ -1413,7 +1464,8 @@ MoQFrameParser::parseSubscribeAnnouncesError(
1413
1464
return folly::makeUnexpected (res.error ());
1414
1465
}
1415
1466
return SubscribeAnnouncesError (
1416
- {std::move (res->trackNamespace ),
1467
+ {res->requestID ,
1468
+ std::move (res->trackNamespace ),
1417
1469
SubscribeAnnouncesErrorCode (folly::to_underlying (res->errorCode )),
1418
1470
std::move (res->reasonPhrase )});
1419
1471
}
@@ -1422,11 +1474,17 @@ folly::Expected<UnsubscribeAnnounces, ErrorCode>
1422
1474
MoQFrameParser::parseUnsubscribeAnnounces (
1423
1475
folly::io::Cursor& cursor,
1424
1476
size_t length) const noexcept {
1425
- auto res = parseAnnounceOk (cursor, length);
1477
+ UnsubscribeAnnounces unsubscribeAnnounces;
1478
+ auto res = parseFixedTuple (cursor, length);
1426
1479
if (!res) {
1427
1480
return folly::makeUnexpected (res.error ());
1428
1481
}
1429
- return UnsubscribeAnnounces ({std::move (res->trackNamespace )});
1482
+ unsubscribeAnnounces.trackNamespacePrefix =
1483
+ TrackNamespace (std::move (res.value ()));
1484
+ if (length > 0 ) {
1485
+ return folly::makeUnexpected (ErrorCode::PROTOCOL_VIOLATION);
1486
+ }
1487
+ return unsubscribeAnnounces;
1430
1488
}
1431
1489
1432
1490
folly::Expected<FullTrackName, ErrorCode> MoQFrameParser::parseFullTrackName (
@@ -2304,6 +2362,9 @@ WriteResult MoQFrameWriter::writeAnnounce(
2304
2362
size_t size = 0 ;
2305
2363
bool error = false ;
2306
2364
auto sizePtr = writeFrameHeader (writeBuf, FrameType::ANNOUNCE, error);
2365
+ if (getDraftMajorVersion (*version_) >= 11 ) {
2366
+ writeVarint (writeBuf, announce.requestID .value , size, error);
2367
+ }
2307
2368
writeTrackNamespace (writeBuf, announce.trackNamespace , size, error);
2308
2369
writeTrackRequestParams (writeBuf, announce.params , size, error);
2309
2370
writeSize (sizePtr, size, error, *version_);
@@ -2320,7 +2381,11 @@ WriteResult MoQFrameWriter::writeAnnounceOk(
2320
2381
size_t size = 0 ;
2321
2382
bool error = false ;
2322
2383
auto sizePtr = writeFrameHeader (writeBuf, FrameType::ANNOUNCE_OK, error);
2323
- writeTrackNamespace (writeBuf, announceOk.trackNamespace , size, error);
2384
+ if (getDraftMajorVersion (*version_) >= 11 ) {
2385
+ writeVarint (writeBuf, announceOk.requestID .value , size, error);
2386
+ } else {
2387
+ writeTrackNamespace (writeBuf, announceOk.trackNamespace , size, error);
2388
+ }
2324
2389
writeSize (sizePtr, size, error, *version_);
2325
2390
if (error) {
2326
2391
return folly::makeUnexpected (quic::TransportErrorCode::INTERNAL_ERROR);
@@ -2336,7 +2401,11 @@ WriteResult MoQFrameWriter::writeAnnounceError(
2336
2401
size_t size = 0 ;
2337
2402
bool error = false ;
2338
2403
auto sizePtr = writeFrameHeader (writeBuf, FrameType::ANNOUNCE_ERROR, error);
2339
- writeTrackNamespace (writeBuf, announceError.trackNamespace , size, error);
2404
+ if (getDraftMajorVersion (*version_) >= 11 ) {
2405
+ writeVarint (writeBuf, announceError.requestID .value , size, error);
2406
+ } else {
2407
+ writeTrackNamespace (writeBuf, announceError.trackNamespace , size, error);
2408
+ }
2340
2409
writeVarint (
2341
2410
writeBuf, folly::to_underlying (announceError.errorCode ), size, error);
2342
2411
writeFixedString (writeBuf, announceError.reasonPhrase , size, error);
@@ -2391,6 +2460,9 @@ WriteResult MoQFrameWriter::writeTrackStatusRequest(
2391
2460
bool error = false ;
2392
2461
auto sizePtr =
2393
2462
writeFrameHeader (writeBuf, FrameType::TRACK_STATUS_REQUEST, error);
2463
+ if (getDraftMajorVersion (*version_) >= 11 ) {
2464
+ writeVarint (writeBuf, trackStatusRequest.requestID .value , size, error);
2465
+ }
2394
2466
writeFullTrackName (writeBuf, trackStatusRequest.fullTrackName , size, error);
2395
2467
if (getDraftMajorVersion (*version_) >= 11 ) {
2396
2468
writeTrackRequestParams (writeBuf, trackStatusRequest.params , size, error);
@@ -2410,7 +2482,11 @@ WriteResult MoQFrameWriter::writeTrackStatus(
2410
2482
size_t size = 0 ;
2411
2483
bool error = false ;
2412
2484
auto sizePtr = writeFrameHeader (writeBuf, FrameType::TRACK_STATUS, error);
2413
- writeFullTrackName (writeBuf, trackStatus.fullTrackName , size, error);
2485
+ if (getDraftMajorVersion (*version_) >= 11 ) {
2486
+ writeVarint (writeBuf, trackStatus.requestID .value , size, error);
2487
+ } else {
2488
+ writeFullTrackName (writeBuf, trackStatus.fullTrackName , size, error);
2489
+ }
2414
2490
writeVarint (
2415
2491
writeBuf, folly::to_underlying (trackStatus.statusCode ), size, error);
2416
2492
if (trackStatus.statusCode == TrackStatusCode::IN_PROGRESS) {
@@ -2455,6 +2531,9 @@ WriteResult MoQFrameWriter::writeSubscribeAnnounces(
2455
2531
bool error = false ;
2456
2532
auto sizePtr =
2457
2533
writeFrameHeader (writeBuf, FrameType::SUBSCRIBE_ANNOUNCES, error);
2534
+ if (getDraftMajorVersion (*version_) >= 11 ) {
2535
+ writeVarint (writeBuf, subscribeAnnounces.requestID .value , size, error);
2536
+ }
2458
2537
writeTrackNamespace (
2459
2538
writeBuf, subscribeAnnounces.trackNamespacePrefix , size, error);
2460
2539
writeTrackRequestParams (writeBuf, subscribeAnnounces.params , size, error);
@@ -2474,8 +2553,12 @@ WriteResult MoQFrameWriter::writeSubscribeAnnouncesOk(
2474
2553
bool error = false ;
2475
2554
auto sizePtr =
2476
2555
writeFrameHeader (writeBuf, FrameType::SUBSCRIBE_ANNOUNCES_OK, error);
2477
- writeTrackNamespace (
2478
- writeBuf, subscribeAnnouncesOk.trackNamespacePrefix , size, error);
2556
+ if (getDraftMajorVersion (*version_) >= 11 ) {
2557
+ writeVarint (writeBuf, subscribeAnnouncesOk.requestID .value , size, error);
2558
+ } else {
2559
+ writeTrackNamespace (
2560
+ writeBuf, subscribeAnnouncesOk.trackNamespacePrefix , size, error);
2561
+ }
2479
2562
writeSize (sizePtr, size, error, *version_);
2480
2563
if (error) {
2481
2564
return folly::makeUnexpected (quic::TransportErrorCode::INTERNAL_ERROR);
@@ -2492,8 +2575,12 @@ WriteResult MoQFrameWriter::writeSubscribeAnnouncesError(
2492
2575
bool error = false ;
2493
2576
auto sizePtr =
2494
2577
writeFrameHeader (writeBuf, FrameType::SUBSCRIBE_ANNOUNCES_ERROR, error);
2495
- writeTrackNamespace (
2496
- writeBuf, subscribeAnnouncesError.trackNamespacePrefix , size, error);
2578
+ if (getDraftMajorVersion (*version_) >= 11 ) {
2579
+ writeVarint (writeBuf, subscribeAnnouncesError.requestID .value , size, error);
2580
+ } else {
2581
+ writeTrackNamespace (
2582
+ writeBuf, subscribeAnnouncesError.trackNamespacePrefix , size, error);
2583
+ }
2497
2584
writeVarint (
2498
2585
writeBuf,
2499
2586
folly::to_underlying (subscribeAnnouncesError.errorCode ),
0 commit comments