@@ -55,6 +55,7 @@ folly::Expected<std::string, ErrorCode> parseFixedString(
55
55
folly::Expected<folly::Unit, ErrorCode> parseSetupParams (
56
56
folly::io::Cursor& cursor,
57
57
size_t & length,
58
+ uint64_t version,
58
59
size_t numParams,
59
60
std::vector<SetupParameter>& params);
60
61
bool datagramTypeHasExtensions (uint64_t version, StreamType streamType);
@@ -142,6 +143,7 @@ folly::Expected<std::string, ErrorCode> parseFixedString(
142
143
folly::Expected<folly::Unit, ErrorCode> parseSetupParams (
143
144
folly::io::Cursor& cursor,
144
145
size_t & length,
146
+ uint64_t version,
145
147
size_t numParams,
146
148
std::vector<SetupParameter>& params) {
147
149
for (auto i = 0u ; i < numParams; i++) {
@@ -158,10 +160,13 @@ folly::Expected<folly::Unit, ErrorCode> parseSetupParams(
158
160
if (!res) {
159
161
return folly::makeUnexpected (ErrorCode::PARSE_UNDERFLOW);
160
162
}
161
- length -= res->second ;
162
- res = quic::decodeQuicInteger (cursor, res->first );
163
- if (!res) {
164
- return folly::makeUnexpected (ErrorCode::PARSE_UNDERFLOW);
163
+ if (getDraftMajorVersion (version) < 11 ) {
164
+ length -= res->second ;
165
+ res = quic::decodeQuicInteger (cursor, res->first );
166
+ if (!res) {
167
+ XLOG (ERR) << " Failed to decode parameter value" ;
168
+ return folly::makeUnexpected (ErrorCode::PARSE_UNDERFLOW);
169
+ }
165
170
}
166
171
p.asUint64 = res->first ;
167
172
length -= res->second ;
@@ -189,11 +194,15 @@ folly::Expected<ClientSetup, ErrorCode> parseClientSetup(
189
194
return folly::makeUnexpected (ErrorCode::PARSE_UNDERFLOW);
190
195
}
191
196
length -= numVersions->second ;
197
+ bool v11Plus = true ;
192
198
for (auto i = 0ul ; i < numVersions->first ; i++) {
193
199
auto version = quic::decodeQuicInteger (cursor, length);
194
200
if (!version) {
195
201
return folly::makeUnexpected (ErrorCode::PARSE_UNDERFLOW);
196
202
}
203
+ if (getDraftMajorVersion (version->first ) < 11 ) {
204
+ v11Plus = false ;
205
+ }
197
206
clientSetup.supportedVersions .push_back (version->first );
198
207
length -= version->second ;
199
208
}
@@ -202,8 +211,12 @@ folly::Expected<ClientSetup, ErrorCode> parseClientSetup(
202
211
return folly::makeUnexpected (ErrorCode::PARSE_UNDERFLOW);
203
212
}
204
213
length -= numParams->second ;
205
- auto res =
206
- parseSetupParams (cursor, length, numParams->first , clientSetup.params );
214
+ auto res = parseSetupParams (
215
+ cursor,
216
+ length,
217
+ v11Plus ? kVersionDraft11 : kVersionDraft10 ,
218
+ numParams->first ,
219
+ clientSetup.params );
207
220
if (res.hasError ()) {
208
221
return folly::makeUnexpected (res.error ());
209
222
}
@@ -228,8 +241,12 @@ folly::Expected<ServerSetup, ErrorCode> parseServerSetup(
228
241
return folly::makeUnexpected (ErrorCode::PARSE_UNDERFLOW);
229
242
}
230
243
length -= numParams->second ;
231
- auto res =
232
- parseSetupParams (cursor, length, numParams->first , serverSetup.params );
244
+ auto res = parseSetupParams (
245
+ cursor,
246
+ length,
247
+ serverSetup.selectedVersion ,
248
+ numParams->first ,
249
+ serverSetup.params );
233
250
if (res.hasError ()) {
234
251
return folly::makeUnexpected (res.error ());
235
252
}
@@ -624,11 +641,13 @@ folly::Expected<folly::Unit, ErrorCode> MoQFrameParser::parseTrackRequestParams(
624
641
p.asAuthToken = std::move (*tokenRes.value ());
625
642
} else {
626
643
auto res = quic::decodeQuicInteger (cursor, length);
627
- if (!res) {
628
- return folly::makeUnexpected (ErrorCode::PARSE_UNDERFLOW);
644
+ if (getDraftMajorVersion (*version_) < 11 ) {
645
+ if (!res) {
646
+ return folly::makeUnexpected (ErrorCode::PARSE_UNDERFLOW);
647
+ }
648
+ length -= res->second ;
649
+ res = quic::decodeQuicInteger (cursor, res->first );
629
650
}
630
- length -= res->second ;
631
- res = quic::decodeQuicInteger (cursor, res->first );
632
651
if (!res) {
633
652
return folly::makeUnexpected (ErrorCode::PARSE_UNDERFLOW);
634
653
}
@@ -1791,9 +1810,10 @@ std::string MoQFrameWriter::encodeTokenValue(
1791
1810
}
1792
1811
1793
1812
bool includeParam (uint64_t version, uint64_t key) {
1794
- return key == getAuthorizationParamKey (version) ||
1795
- key == getMaxCacheDurationParamKey (version) ||
1796
- key == getDeliveryTimeoutParamKey (version);
1813
+ return key == folly::to_underlying (SetupKey::MAX_REQUEST_ID) ||
1814
+ key == folly::to_underlying (SetupKey::PATH) ||
1815
+ (getDraftMajorVersion (version) >= 11 &&
1816
+ key == folly::to_underlying (SetupKey::MAX_AUTH_TOKEN_CACHE_SIZE));
1797
1817
}
1798
1818
1799
1819
WriteResult writeClientSetup (
@@ -1834,12 +1854,15 @@ WriteResult writeClientSetup(
1834
1854
if (param.key == folly::to_underlying (SetupKey::MAX_REQUEST_ID) ||
1835
1855
param.key ==
1836
1856
folly::to_underlying (SetupKey::MAX_AUTH_TOKEN_CACHE_SIZE)) {
1837
- auto ret = quic::getQuicIntegerSize (param.asUint64 );
1838
- if (ret.hasError ()) {
1839
- XLOG (ERR) << " Invalid max requestID: " << param.asUint64 ;
1840
- return folly::makeUnexpected (quic::TransportErrorCode::INTERNAL_ERROR);
1857
+ if (!v11Plus) {
1858
+ auto ret = quic::getQuicIntegerSize (param.asUint64 );
1859
+ if (ret.hasError ()) {
1860
+ XLOG (ERR) << " Invalid max requestID: " << param.asUint64 ;
1861
+ return folly::makeUnexpected (
1862
+ quic::TransportErrorCode::INTERNAL_ERROR);
1863
+ }
1864
+ writeVarint (writeBuf, ret.value (), size, error);
1841
1865
}
1842
- writeVarint (writeBuf, ret.value (), size, error);
1843
1866
writeVarint (writeBuf, param.asUint64 , size, error);
1844
1867
} else {
1845
1868
writeFixedString (writeBuf, param.asString , size, error);
@@ -1882,12 +1905,15 @@ WriteResult writeServerSetup(
1882
1905
if (param.key == folly::to_underlying (SetupKey::MAX_REQUEST_ID) ||
1883
1906
(param.key ==
1884
1907
folly::to_underlying (SetupKey::MAX_AUTH_TOKEN_CACHE_SIZE))) {
1885
- auto ret = quic::getQuicIntegerSize (param.asUint64 );
1886
- if (ret.hasError ()) {
1887
- XLOG (ERR) << " Invalid max requestID: " << param.asUint64 ;
1888
- return folly::makeUnexpected (quic::TransportErrorCode::INTERNAL_ERROR);
1908
+ if (getDraftMajorVersion (serverSetup.selectedVersion ) < 11 ) {
1909
+ auto ret = quic::getQuicIntegerSize (param.asUint64 );
1910
+ if (ret.hasError ()) {
1911
+ XLOG (ERR) << " Invalid max requestID: " << param.asUint64 ;
1912
+ return folly::makeUnexpected (
1913
+ quic::TransportErrorCode::INTERNAL_ERROR);
1914
+ }
1915
+ writeVarint (writeBuf, ret.value (), size, error);
1889
1916
}
1890
- writeVarint (writeBuf, ret.value (), size, error);
1891
1917
writeVarint (writeBuf, param.asUint64 , size, error);
1892
1918
} else {
1893
1919
writeFixedString (writeBuf, param.asString , size, error);
@@ -2066,12 +2092,14 @@ void MoQFrameWriter::writeTrackRequestParams(
2066
2092
} else if (
2067
2093
param.key == getDeliveryTimeoutParamKey (*version_) ||
2068
2094
param.key == getMaxCacheDurationParamKey (*version_)) {
2069
- auto res = quic::getQuicIntegerSize (param.asUint64 );
2070
- if (!res) {
2071
- error = true ;
2072
- return ;
2095
+ if (getDraftMajorVersion (*version_) < 11 ) {
2096
+ auto res = quic::getQuicIntegerSize (param.asUint64 );
2097
+ if (!res) {
2098
+ error = true ;
2099
+ return ;
2100
+ }
2101
+ writeVarint (writeBuf, res.value (), size, error);
2073
2102
}
2074
- writeVarint (writeBuf, res.value (), size, error);
2075
2103
writeVarint (writeBuf, param.asUint64 , size, error);
2076
2104
}
2077
2105
}
0 commit comments