1
0
mirror of https://github.com/facebookincubator/mvfst.git synced 2025-11-09 10:00:57 +03:00

Move early app data params getter and validator to QuicConnectionStateBase (#117)

Summary:
This ensures they are available to the whole stack rather than the transport only. The validator needs it in the server case, and will soon need it in the client case, so that seems appropriate to make it available.
Pull Request resolved: https://github.com/facebookincubator/mvfst/pull/117

Reviewed By: yangchi

Differential Revision: D20536366

Pulled By: mjoras

fbshipit-source-id: a76d369c0a82b9be1f985aed1f33f7a6b338a2ae
This commit is contained in:
Amaury Séchet
2020-03-23 10:51:49 -07:00
committed by Facebook GitHub Bot
parent b52f2d97f4
commit 7a1b58e5e8
9 changed files with 59 additions and 67 deletions

View File

@@ -2265,8 +2265,8 @@ void QuicTransportBase::setEarlyDataAppParamsFunctions(
folly::Function<bool(const folly::Optional<std::string>&, const Buf&) const>
validator,
folly::Function<Buf()> getter) {
earlyDataAppParamsValidator_ = std::move(validator);
earlyDataAppParamsGetter_ = std::move(getter);
conn_->earlyDataAppParamsValidator = std::move(validator);
conn_->earlyDataAppParamsGetter = std::move(getter);
}
void QuicTransportBase::cancelAllAppCallbacks(

View File

@@ -627,11 +627,6 @@ class QuicTransportBase : public QuicSocket {
folly::SocketAddress localFallbackAddress;
// CongestionController factory
std::shared_ptr<CongestionControllerFactory> ccFactory_{nullptr};
folly::Function<bool(const folly::Optional<std::string>&, const Buf&) const>
earlyDataAppParamsValidator_;
folly::Function<Buf()> earlyDataAppParamsGetter_;
};
std::ostream& operator<<(std::ostream& os, const QuicTransportBase& qt);

View File

@@ -788,8 +788,8 @@ folly::Optional<QuicCachedPsk> QuicClientTransport::getPsk() {
if (!conn_->transportSettings.attemptEarlyData) {
quicCachedPsk->cachedPsk.maxEarlyDataSize = 0;
} else if (
earlyDataAppParamsValidator_ &&
!earlyDataAppParamsValidator_(
conn_->earlyDataAppParamsValidator &&
!conn_->earlyDataAppParamsValidator(
quicCachedPsk->cachedPsk.alpn,
folly::IOBuf::copyBuffer(quicCachedPsk->appParams))) {
quicCachedPsk->cachedPsk.maxEarlyDataSize = 0;
@@ -895,8 +895,8 @@ void QuicClientTransport::onNewCachedPsk(
quicCachedPsk.transportParams =
getServerCachedTransportParameters(*clientConn_);
if (earlyDataAppParamsGetter_) {
auto appParams = earlyDataAppParamsGetter_();
if (conn_->earlyDataAppParamsGetter) {
auto appParams = conn_->earlyDataAppParamsGetter();
if (appParams) {
quicCachedPsk.appParams = appParams->moveToFbString().toStdString();
}

View File

@@ -49,6 +49,9 @@ std::unique_ptr<QuicClientConnectionState> undoAllClientStateForRetry(
newConn->readCodec->setClientConnectionId(*conn->clientConnectionId);
newConn->readCodec->setCodecParameters(CodecParameters(
conn->peerAckDelayExponent, conn->originalVersion.value()));
newConn->earlyDataAppParamsValidator =
std::move(conn->earlyDataAppParamsValidator);
newConn->earlyDataAppParamsGetter = std::move(conn->earlyDataAppParamsGetter);
return newConn;
}

View File

@@ -140,8 +140,7 @@ void QuicServerTransport::accept() {
evb_,
ctx_,
this,
std::make_unique<DefaultAppTokenValidator>(
serverConn_, std::move(earlyDataAppParamsValidator_)));
std::make_unique<DefaultAppTokenValidator>(serverConn_));
}
void QuicServerTransport::writeData() {
@@ -414,8 +413,8 @@ void QuicServerTransport::maybeWriteNewSessionTicket() {
if (appToken.sourceAddresses.empty()) {
appToken.sourceAddresses.push_back(conn_->peerAddress.getIPAddress());
}
if (earlyDataAppParamsGetter_) {
appToken.appParams = earlyDataAppParamsGetter_();
if (conn_->earlyDataAppParamsGetter) {
appToken.appParams = conn_->earlyDataAppParamsGetter();
}
serverConn_->serverHandshakeLayer->writeNewSessionTicket(appToken);
}

View File

@@ -28,13 +28,8 @@
namespace quic {
DefaultAppTokenValidator::DefaultAppTokenValidator(
QuicServerConnectionState* conn,
folly::Function<bool(
const folly::Optional<std::string>& alpn,
const std::unique_ptr<folly::IOBuf>& appParams) const>
earlyDataAppParamsValidator)
: conn_(conn),
earlyDataAppParamsValidator_(std::move(earlyDataAppParamsValidator)) {}
QuicServerConnectionState* conn)
: conn_(conn) {}
bool DefaultAppTokenValidator::validate(
const fizz::server::ResumptionState& resumptionState) const {
@@ -139,8 +134,8 @@ bool DefaultAppTokenValidator::validate(
// If application has set validator and the token is invalid, reject 0-RTT.
// If application did not set validator, it's valid.
if (earlyDataAppParamsValidator_ &&
!earlyDataAppParamsValidator_(
if (conn_->earlyDataAppParamsValidator &&
!conn_->earlyDataAppParamsValidator(
resumptionState.alpn, appToken->appParams)) {
VLOG(10) << "Invalid app params";
return false;

View File

@@ -28,21 +28,12 @@ struct QuicServerConnectionState;
class DefaultAppTokenValidator : public fizz::server::AppTokenValidator {
public:
explicit DefaultAppTokenValidator(
QuicServerConnectionState* conn,
folly::Function<bool(
const folly::Optional<std::string>& alpn,
const std::unique_ptr<folly::IOBuf>& appParams) const>
earlyDataAppParamsValidator);
explicit DefaultAppTokenValidator(QuicServerConnectionState* conn);
bool validate(const fizz::server::ResumptionState&) const override;
private:
QuicServerConnectionState* conn_;
folly::Function<bool(
const folly::Optional<std::string>& alpn,
const std::unique_ptr<folly::IOBuf>& appParams) const>
earlyDataAppParamsValidator_;
};
} // namespace quic

View File

@@ -42,9 +42,9 @@ TEST(DefaultAppTokenValidatorTest, TestValidParams) {
ResumptionState resState;
resState.appToken = encodeAppToken(appToken);
auto appParamsValidator = [](const folly::Optional<std::string>&,
conn.earlyDataAppParamsValidator = [](const folly::Optional<std::string>&,
const Buf&) { return true; };
DefaultAppTokenValidator validator(&conn, std::move(appParamsValidator));
DefaultAppTokenValidator validator(&conn);
EXPECT_TRUE(validator.validate(resState));
}
@@ -70,9 +70,9 @@ TEST(
ResumptionState resState;
resState.appToken = encodeAppToken(appToken);
auto appParamsValidator = [](const folly::Optional<std::string>&,
conn.earlyDataAppParamsValidator = [](const folly::Optional<std::string>&,
const Buf&) { return true; };
DefaultAppTokenValidator validator(&conn, std::move(appParamsValidator));
DefaultAppTokenValidator validator(&conn);
EXPECT_TRUE(validator.validate(resState));
EXPECT_EQ(
@@ -88,12 +88,12 @@ TEST(DefaultAppTokenValidatorTest, TestInvalidNullAppToken) {
conn.version = QuicVersion::MVFST;
ResumptionState resState;
auto appParamsValidator = [](const folly::Optional<std::string>&,
conn.earlyDataAppParamsValidator = [](const folly::Optional<std::string>&,
const Buf&) {
EXPECT_TRUE(false);
return true;
};
DefaultAppTokenValidator validator(&conn, std::move(appParamsValidator));
DefaultAppTokenValidator validator(&conn);
EXPECT_FALSE(validator.validate(resState));
}
@@ -106,12 +106,12 @@ TEST(DefaultAppTokenValidatorTest, TestInvalidEmptyTransportParams) {
ResumptionState resState;
resState.appToken = encodeAppToken(appToken);
auto appParamsValidator = [](const folly::Optional<std::string>&,
conn.earlyDataAppParamsValidator = [](const folly::Optional<std::string>&,
const Buf&) {
EXPECT_TRUE(false);
return true;
};
DefaultAppTokenValidator validator(&conn, std::move(appParamsValidator));
DefaultAppTokenValidator validator(&conn);
EXPECT_FALSE(validator.validate(resState));
}
@@ -141,12 +141,12 @@ TEST(DefaultAppTokenValidatorTest, TestInvalidMissingParams) {
ResumptionState resState;
resState.appToken = encodeAppToken(appToken);
auto appParamsValidator = [](const folly::Optional<std::string>&,
conn.earlyDataAppParamsValidator = [](const folly::Optional<std::string>&,
const Buf&) {
EXPECT_TRUE(false);
return true;
};
DefaultAppTokenValidator validator(&conn, std::move(appParamsValidator));
DefaultAppTokenValidator validator(&conn);
EXPECT_FALSE(validator.validate(resState));
}
@@ -170,12 +170,12 @@ TEST(DefaultAppTokenValidatorTest, TestInvalidRedundantParameter) {
ResumptionState resState;
resState.appToken = encodeAppToken(appToken);
auto appParamsValidator = [](const folly::Optional<std::string>&,
conn.earlyDataAppParamsValidator = [](const folly::Optional<std::string>&,
const Buf&) {
EXPECT_TRUE(false);
return true;
};
DefaultAppTokenValidator validator(&conn, std::move(appParamsValidator));
DefaultAppTokenValidator validator(&conn);
EXPECT_FALSE(validator.validate(resState));
}
@@ -197,12 +197,12 @@ TEST(DefaultAppTokenValidatorTest, TestInvalidDecreasedInitialMaxStreamData) {
ResumptionState resState;
resState.appToken = encodeAppToken(appToken);
auto appParamsValidator = [](const folly::Optional<std::string>&,
conn.earlyDataAppParamsValidator = [](const folly::Optional<std::string>&,
const Buf&) {
EXPECT_TRUE(false);
return true;
};
DefaultAppTokenValidator validator(&conn, std::move(appParamsValidator));
DefaultAppTokenValidator validator(&conn);
EXPECT_FALSE(validator.validate(resState));
}
@@ -224,12 +224,12 @@ TEST(DefaultAppTokenValidatorTest, TestChangedIdleTimeout) {
ResumptionState resState;
resState.appToken = encodeAppToken(appToken);
auto appParamsValidator = [](const folly::Optional<std::string>&,
conn.earlyDataAppParamsValidator = [](const folly::Optional<std::string>&,
const Buf&) {
EXPECT_TRUE(false);
return true;
};
DefaultAppTokenValidator validator(&conn, std::move(appParamsValidator));
DefaultAppTokenValidator validator(&conn);
EXPECT_FALSE(validator.validate(resState));
}
@@ -251,12 +251,12 @@ TEST(DefaultAppTokenValidatorTest, TestDecreasedInitialMaxStreams) {
ResumptionState resState;
resState.appToken = encodeAppToken(appToken);
auto appParamsValidator = [](const folly::Optional<std::string>&,
conn.earlyDataAppParamsValidator = [](const folly::Optional<std::string>&,
const Buf&) {
EXPECT_TRUE(false);
return true;
};
DefaultAppTokenValidator validator(&conn, std::move(appParamsValidator));
DefaultAppTokenValidator validator(&conn);
EXPECT_FALSE(validator.validate(resState));
}
@@ -280,9 +280,9 @@ TEST(DefaultAppTokenValidatorTest, TestInvalidAppParams) {
ResumptionState resState;
resState.appToken = encodeAppToken(appToken);
auto appParamsValidator = [](const folly::Optional<std::string>&,
conn.earlyDataAppParamsValidator = [](const folly::Optional<std::string>&,
const Buf&) { return false; };
DefaultAppTokenValidator validator(&conn, std::move(appParamsValidator));
DefaultAppTokenValidator validator(&conn);
EXPECT_FALSE(validator.validate(resState));
}
@@ -307,9 +307,11 @@ class SourceAddressTokenTest : public Test {
ResumptionState resState;
resState.appToken = encodeAppToken(appToken_);
auto appParamsValidator = [=](const folly::Optional<std::string>&,
const Buf&) { return acceptZeroRtt; };
DefaultAppTokenValidator validator(&conn_, std::move(appParamsValidator));
conn_.earlyDataAppParamsValidator = [=](const folly::Optional<std::string>&,
const Buf&) {
return acceptZeroRtt;
};
DefaultAppTokenValidator validator(&conn_);
EXPECT_EQ(validator.validate(resState), acceptZeroRtt);
}

View File

@@ -810,6 +810,13 @@ struct QuicConnectionStateBase : public folly::DelayedDestruction {
// Use this measured rtt as init rtt (from Transport Settings)
TimePoint pathChallengeStartTime;
/**
* Eary data app params functions.
*/
folly::Function<bool(const folly::Optional<std::string>&, const Buf&) const>
earlyDataAppParamsValidator;
folly::Function<Buf()> earlyDataAppParamsGetter;
/**
* Selects a previously unused peer-issued connection id to use.
* If there are no available ids return false and don't change anything.