mirror of
https://github.com/facebookincubator/mvfst.git
synced 2025-11-10 21:22:20 +03:00
Use new API to validate app params from cache
Summary: When client reads app params from psk cache, invoke to application to get the decision from application whether to attempt early data Reviewed By: mjoras Differential Revision: D16267032 fbshipit-source-id: 84aa4eb4c67a0e468fedcd0a0c384dbc56157e44
This commit is contained in:
committed by
Facebook Github Bot
parent
d780af1a67
commit
0cbdbe5180
@@ -798,10 +798,11 @@ folly::Optional<QuicCachedPsk> QuicClientTransport::getPsk() {
|
|||||||
conn_->originalVersion) {
|
conn_->originalVersion) {
|
||||||
quicCachedPsk->cachedPsk.maxEarlyDataSize = 0;
|
quicCachedPsk->cachedPsk.maxEarlyDataSize = 0;
|
||||||
removePsk();
|
removePsk();
|
||||||
} else if (!CHECK_NOTNULL(connCallback_)
|
} else if (
|
||||||
->validateEarlyDataAppParams(
|
earlyDataAppParamsValidator_ &&
|
||||||
quicCachedPsk->cachedPsk.alpn,
|
!earlyDataAppParamsValidator_(
|
||||||
folly::IOBuf::copyBuffer(quicCachedPsk->appParams))) {
|
quicCachedPsk->cachedPsk.alpn,
|
||||||
|
folly::IOBuf::copyBuffer(quicCachedPsk->appParams))) {
|
||||||
quicCachedPsk->cachedPsk.maxEarlyDataSize = 0;
|
quicCachedPsk->cachedPsk.maxEarlyDataSize = 0;
|
||||||
// Do not remove psk here, will let application decide
|
// Do not remove psk here, will let application decide
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -515,9 +515,16 @@ TEST_P(QuicClientTransportIntegrationTest, TestZeroRttSuccess) {
|
|||||||
// Change the ctx
|
// Change the ctx
|
||||||
server_->setFizzContext(serverCtx);
|
server_->setFizzContext(serverCtx);
|
||||||
folly::Optional<std::string> alpn = std::string("h1q-fb");
|
folly::Optional<std::string> alpn = std::string("h1q-fb");
|
||||||
EXPECT_CALL(clientConnCallback, validateEarlyDataAppParams(alpn, _))
|
bool performedValidation = false;
|
||||||
.WillOnce(Return(true));
|
client->setEarlyDataAppParamsFunctions(
|
||||||
|
[&](const folly::Optional<std::string>& alpnToValidate, const Buf&) {
|
||||||
|
performedValidation = true;
|
||||||
|
EXPECT_EQ(alpnToValidate, alpn);
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
[]() -> Buf { return nullptr; });
|
||||||
client->start(&clientConnCallback);
|
client->start(&clientConnCallback);
|
||||||
|
EXPECT_TRUE(performedValidation);
|
||||||
CHECK(client->getConn().zeroRttWriteCipher);
|
CHECK(client->getConn().zeroRttWriteCipher);
|
||||||
EXPECT_TRUE(client->serverInitialParamsSet());
|
EXPECT_TRUE(client->serverInitialParamsSet());
|
||||||
EXPECT_EQ(
|
EXPECT_EQ(
|
||||||
@@ -557,9 +564,15 @@ TEST_P(QuicClientTransportIntegrationTest, TestZeroRttRejection) {
|
|||||||
pskCache_->putPsk(hostname, cachedPsk);
|
pskCache_->putPsk(hostname, cachedPsk);
|
||||||
// Change the ctx
|
// Change the ctx
|
||||||
server_->setFizzContext(serverCtx);
|
server_->setFizzContext(serverCtx);
|
||||||
EXPECT_CALL(clientConnCallback, validateEarlyDataAppParams(_, _))
|
bool performedValidation = false;
|
||||||
.WillOnce(Return(true));
|
client->setEarlyDataAppParamsFunctions(
|
||||||
|
[&](const folly::Optional<std::string>&, const Buf&) {
|
||||||
|
performedValidation = true;
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
[]() -> Buf { return nullptr; });
|
||||||
client->start(&clientConnCallback);
|
client->start(&clientConnCallback);
|
||||||
|
EXPECT_TRUE(performedValidation);
|
||||||
CHECK(client->getConn().zeroRttWriteCipher);
|
CHECK(client->getConn().zeroRttWriteCipher);
|
||||||
EXPECT_TRUE(client->serverInitialParamsSet());
|
EXPECT_TRUE(client->serverInitialParamsSet());
|
||||||
EXPECT_EQ(
|
EXPECT_EQ(
|
||||||
@@ -616,7 +629,12 @@ TEST_P(QuicClientTransportIntegrationTest, TestZeroRttVersionDoesNotMatch) {
|
|||||||
// This needs to be a version that's not in getVersion() but in server's
|
// This needs to be a version that's not in getVersion() but in server's
|
||||||
// supported version list.
|
// supported version list.
|
||||||
client->getNonConstConn().originalVersion = MVFST1;
|
client->getNonConstConn().originalVersion = MVFST1;
|
||||||
EXPECT_CALL(clientConnCallback, validateEarlyDataAppParams(_, _)).Times(0);
|
client->setEarlyDataAppParamsFunctions(
|
||||||
|
[&](const folly::Optional<std::string>&, const Buf&) {
|
||||||
|
EXPECT_TRUE(false);
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
[]() -> Buf { return nullptr; });
|
||||||
client->start(&clientConnCallback);
|
client->start(&clientConnCallback);
|
||||||
EXPECT_EQ(client->getConn().zeroRttWriteCipher, nullptr);
|
EXPECT_EQ(client->getConn().zeroRttWriteCipher, nullptr);
|
||||||
EXPECT_FALSE(client->serverInitialParamsSet());
|
EXPECT_FALSE(client->serverInitialParamsSet());
|
||||||
@@ -654,7 +672,12 @@ TEST_P(QuicClientTransportIntegrationTest, TestZeroRttNotAttempted) {
|
|||||||
// Change the ctx
|
// Change the ctx
|
||||||
server_->setFizzContext(serverCtx);
|
server_->setFizzContext(serverCtx);
|
||||||
client->getNonConstConn().transportSettings.attemptEarlyData = false;
|
client->getNonConstConn().transportSettings.attemptEarlyData = false;
|
||||||
EXPECT_CALL(clientConnCallback, validateEarlyDataAppParams(_, _)).Times(0);
|
client->setEarlyDataAppParamsFunctions(
|
||||||
|
[&](const folly::Optional<std::string>&, const Buf&) {
|
||||||
|
EXPECT_TRUE(false);
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
[]() -> Buf { return nullptr; });
|
||||||
client->start(&clientConnCallback);
|
client->start(&clientConnCallback);
|
||||||
|
|
||||||
EXPECT_CALL(clientConnCallback, onTransportReady()).WillOnce(Invoke([&] {
|
EXPECT_CALL(clientConnCallback, onTransportReady()).WillOnce(Invoke([&] {
|
||||||
@@ -689,9 +712,15 @@ TEST_P(QuicClientTransportIntegrationTest, TestZeroRttInvalidAppParams) {
|
|||||||
pskCache_->putPsk(hostname, cachedPsk);
|
pskCache_->putPsk(hostname, cachedPsk);
|
||||||
// Change the ctx
|
// Change the ctx
|
||||||
server_->setFizzContext(serverCtx);
|
server_->setFizzContext(serverCtx);
|
||||||
EXPECT_CALL(clientConnCallback, validateEarlyDataAppParams(_, _))
|
bool performedValidation = false;
|
||||||
.WillOnce(Return(false));
|
client->setEarlyDataAppParamsFunctions(
|
||||||
|
[&](const folly::Optional<std::string>&, const Buf&) {
|
||||||
|
performedValidation = true;
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
[]() -> Buf { return nullptr; });
|
||||||
client->start(&clientConnCallback);
|
client->start(&clientConnCallback);
|
||||||
|
EXPECT_TRUE(performedValidation);
|
||||||
|
|
||||||
EXPECT_CALL(clientConnCallback, onTransportReady()).WillOnce(Invoke([&] {
|
EXPECT_CALL(clientConnCallback, onTransportReady()).WillOnce(Invoke([&] {
|
||||||
EXPECT_FALSE(client->getConn().zeroRttWriteCipher);
|
EXPECT_FALSE(client->getConn().zeroRttWriteCipher);
|
||||||
@@ -4377,8 +4406,15 @@ TEST_F(QuicZeroRttClientTest, TestReplaySafeCallback) {
|
|||||||
std::numeric_limits<uint32_t>::max();
|
std::numeric_limits<uint32_t>::max();
|
||||||
return quicCachedPsk;
|
return quicCachedPsk;
|
||||||
}));
|
}));
|
||||||
EXPECT_CALL(clientConnCallback, validateEarlyDataAppParams(_, _));
|
bool performedValidation = false;
|
||||||
|
client->setEarlyDataAppParamsFunctions(
|
||||||
|
[&](const folly::Optional<std::string>&, const Buf&) {
|
||||||
|
performedValidation = true;
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
[]() -> Buf { return nullptr; });
|
||||||
startClient();
|
startClient();
|
||||||
|
EXPECT_TRUE(performedValidation);
|
||||||
|
|
||||||
auto initialUDPSendPacketLen = client->getConn().udpSendPacketLen;
|
auto initialUDPSendPacketLen = client->getConn().udpSendPacketLen;
|
||||||
socketWrites.clear();
|
socketWrites.clear();
|
||||||
@@ -4441,8 +4477,15 @@ TEST_F(QuicZeroRttClientTest, TestZeroRttRejection) {
|
|||||||
std::numeric_limits<uint32_t>::max();
|
std::numeric_limits<uint32_t>::max();
|
||||||
return quicCachedPsk;
|
return quicCachedPsk;
|
||||||
}));
|
}));
|
||||||
EXPECT_CALL(clientConnCallback, validateEarlyDataAppParams(_, _));
|
bool performedValidation = false;
|
||||||
|
client->setEarlyDataAppParamsFunctions(
|
||||||
|
[&](const folly::Optional<std::string>&, const Buf&) {
|
||||||
|
performedValidation = true;
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
[]() -> Buf { return nullptr; });
|
||||||
startClient();
|
startClient();
|
||||||
|
EXPECT_TRUE(performedValidation);
|
||||||
|
|
||||||
socketWrites.clear();
|
socketWrites.clear();
|
||||||
auto streamId = client->createBidirectionalStream().value();
|
auto streamId = client->createBidirectionalStream().value();
|
||||||
@@ -4486,8 +4529,15 @@ TEST_F(QuicZeroRttClientTest, TestZeroRttRejectionWithSmallerFlowControl) {
|
|||||||
std::numeric_limits<uint32_t>::max();
|
std::numeric_limits<uint32_t>::max();
|
||||||
return quicCachedPsk;
|
return quicCachedPsk;
|
||||||
}));
|
}));
|
||||||
EXPECT_CALL(clientConnCallback, validateEarlyDataAppParams(_, _));
|
bool performedValidation = false;
|
||||||
|
client->setEarlyDataAppParamsFunctions(
|
||||||
|
[&](const folly::Optional<std::string>&, const Buf&) {
|
||||||
|
performedValidation = true;
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
[]() -> Buf { return nullptr; });
|
||||||
startClient();
|
startClient();
|
||||||
|
EXPECT_TRUE(performedValidation);
|
||||||
|
|
||||||
mockClientHandshake->maxInitialStreamData = 10;
|
mockClientHandshake->maxInitialStreamData = 10;
|
||||||
socketWrites.clear();
|
socketWrites.clear();
|
||||||
@@ -4524,8 +4574,15 @@ TEST_F(
|
|||||||
std::numeric_limits<uint32_t>::max();
|
std::numeric_limits<uint32_t>::max();
|
||||||
return quicCachedPsk;
|
return quicCachedPsk;
|
||||||
}));
|
}));
|
||||||
EXPECT_CALL(clientConnCallback, validateEarlyDataAppParams(_, _));
|
bool performedValidation = false;
|
||||||
|
client->setEarlyDataAppParamsFunctions(
|
||||||
|
[&](const folly::Optional<std::string>&, const Buf&) {
|
||||||
|
performedValidation = true;
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
[]() -> Buf { return nullptr; });
|
||||||
startClient();
|
startClient();
|
||||||
|
EXPECT_TRUE(performedValidation);
|
||||||
|
|
||||||
EXPECT_TRUE(client->lossTimeout().isScheduled());
|
EXPECT_TRUE(client->lossTimeout().isScheduled());
|
||||||
auto timeRemaining1 = client->lossTimeout().getTimeRemaining();
|
auto timeRemaining1 = client->lossTimeout().getTimeRemaining();
|
||||||
|
|||||||
Reference in New Issue
Block a user