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> folly::Function<bool(const folly::Optional<std::string>&, const Buf&) const>
validator, validator,
folly::Function<Buf()> getter) { folly::Function<Buf()> getter) {
earlyDataAppParamsValidator_ = std::move(validator); conn_->earlyDataAppParamsValidator = std::move(validator);
earlyDataAppParamsGetter_ = std::move(getter); conn_->earlyDataAppParamsGetter = std::move(getter);
} }
void QuicTransportBase::cancelAllAppCallbacks( void QuicTransportBase::cancelAllAppCallbacks(

View File

@@ -627,11 +627,6 @@ class QuicTransportBase : public QuicSocket {
folly::SocketAddress localFallbackAddress; folly::SocketAddress localFallbackAddress;
// CongestionController factory // CongestionController factory
std::shared_ptr<CongestionControllerFactory> ccFactory_{nullptr}; 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); std::ostream& operator<<(std::ostream& os, const QuicTransportBase& qt);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -42,9 +42,9 @@ TEST(DefaultAppTokenValidatorTest, TestValidParams) {
ResumptionState resState; ResumptionState resState;
resState.appToken = encodeAppToken(appToken); resState.appToken = encodeAppToken(appToken);
auto appParamsValidator = [](const folly::Optional<std::string>&, conn.earlyDataAppParamsValidator = [](const folly::Optional<std::string>&,
const Buf&) { return true; }; const Buf&) { return true; };
DefaultAppTokenValidator validator(&conn, std::move(appParamsValidator)); DefaultAppTokenValidator validator(&conn);
EXPECT_TRUE(validator.validate(resState)); EXPECT_TRUE(validator.validate(resState));
} }
@@ -70,9 +70,9 @@ TEST(
ResumptionState resState; ResumptionState resState;
resState.appToken = encodeAppToken(appToken); resState.appToken = encodeAppToken(appToken);
auto appParamsValidator = [](const folly::Optional<std::string>&, conn.earlyDataAppParamsValidator = [](const folly::Optional<std::string>&,
const Buf&) { return true; }; const Buf&) { return true; };
DefaultAppTokenValidator validator(&conn, std::move(appParamsValidator)); DefaultAppTokenValidator validator(&conn);
EXPECT_TRUE(validator.validate(resState)); EXPECT_TRUE(validator.validate(resState));
EXPECT_EQ( EXPECT_EQ(
@@ -88,12 +88,12 @@ TEST(DefaultAppTokenValidatorTest, TestInvalidNullAppToken) {
conn.version = QuicVersion::MVFST; conn.version = QuicVersion::MVFST;
ResumptionState resState; ResumptionState resState;
auto appParamsValidator = [](const folly::Optional<std::string>&, conn.earlyDataAppParamsValidator = [](const folly::Optional<std::string>&,
const Buf&) { const Buf&) {
EXPECT_TRUE(false); EXPECT_TRUE(false);
return true; return true;
}; };
DefaultAppTokenValidator validator(&conn, std::move(appParamsValidator)); DefaultAppTokenValidator validator(&conn);
EXPECT_FALSE(validator.validate(resState)); EXPECT_FALSE(validator.validate(resState));
} }
@@ -106,12 +106,12 @@ TEST(DefaultAppTokenValidatorTest, TestInvalidEmptyTransportParams) {
ResumptionState resState; ResumptionState resState;
resState.appToken = encodeAppToken(appToken); resState.appToken = encodeAppToken(appToken);
auto appParamsValidator = [](const folly::Optional<std::string>&, conn.earlyDataAppParamsValidator = [](const folly::Optional<std::string>&,
const Buf&) { const Buf&) {
EXPECT_TRUE(false); EXPECT_TRUE(false);
return true; return true;
}; };
DefaultAppTokenValidator validator(&conn, std::move(appParamsValidator)); DefaultAppTokenValidator validator(&conn);
EXPECT_FALSE(validator.validate(resState)); EXPECT_FALSE(validator.validate(resState));
} }
@@ -141,12 +141,12 @@ TEST(DefaultAppTokenValidatorTest, TestInvalidMissingParams) {
ResumptionState resState; ResumptionState resState;
resState.appToken = encodeAppToken(appToken); resState.appToken = encodeAppToken(appToken);
auto appParamsValidator = [](const folly::Optional<std::string>&, conn.earlyDataAppParamsValidator = [](const folly::Optional<std::string>&,
const Buf&) { const Buf&) {
EXPECT_TRUE(false); EXPECT_TRUE(false);
return true; return true;
}; };
DefaultAppTokenValidator validator(&conn, std::move(appParamsValidator)); DefaultAppTokenValidator validator(&conn);
EXPECT_FALSE(validator.validate(resState)); EXPECT_FALSE(validator.validate(resState));
} }
@@ -170,12 +170,12 @@ TEST(DefaultAppTokenValidatorTest, TestInvalidRedundantParameter) {
ResumptionState resState; ResumptionState resState;
resState.appToken = encodeAppToken(appToken); resState.appToken = encodeAppToken(appToken);
auto appParamsValidator = [](const folly::Optional<std::string>&, conn.earlyDataAppParamsValidator = [](const folly::Optional<std::string>&,
const Buf&) { const Buf&) {
EXPECT_TRUE(false); EXPECT_TRUE(false);
return true; return true;
}; };
DefaultAppTokenValidator validator(&conn, std::move(appParamsValidator)); DefaultAppTokenValidator validator(&conn);
EXPECT_FALSE(validator.validate(resState)); EXPECT_FALSE(validator.validate(resState));
} }
@@ -197,12 +197,12 @@ TEST(DefaultAppTokenValidatorTest, TestInvalidDecreasedInitialMaxStreamData) {
ResumptionState resState; ResumptionState resState;
resState.appToken = encodeAppToken(appToken); resState.appToken = encodeAppToken(appToken);
auto appParamsValidator = [](const folly::Optional<std::string>&, conn.earlyDataAppParamsValidator = [](const folly::Optional<std::string>&,
const Buf&) { const Buf&) {
EXPECT_TRUE(false); EXPECT_TRUE(false);
return true; return true;
}; };
DefaultAppTokenValidator validator(&conn, std::move(appParamsValidator)); DefaultAppTokenValidator validator(&conn);
EXPECT_FALSE(validator.validate(resState)); EXPECT_FALSE(validator.validate(resState));
} }
@@ -224,12 +224,12 @@ TEST(DefaultAppTokenValidatorTest, TestChangedIdleTimeout) {
ResumptionState resState; ResumptionState resState;
resState.appToken = encodeAppToken(appToken); resState.appToken = encodeAppToken(appToken);
auto appParamsValidator = [](const folly::Optional<std::string>&, conn.earlyDataAppParamsValidator = [](const folly::Optional<std::string>&,
const Buf&) { const Buf&) {
EXPECT_TRUE(false); EXPECT_TRUE(false);
return true; return true;
}; };
DefaultAppTokenValidator validator(&conn, std::move(appParamsValidator)); DefaultAppTokenValidator validator(&conn);
EXPECT_FALSE(validator.validate(resState)); EXPECT_FALSE(validator.validate(resState));
} }
@@ -251,12 +251,12 @@ TEST(DefaultAppTokenValidatorTest, TestDecreasedInitialMaxStreams) {
ResumptionState resState; ResumptionState resState;
resState.appToken = encodeAppToken(appToken); resState.appToken = encodeAppToken(appToken);
auto appParamsValidator = [](const folly::Optional<std::string>&, conn.earlyDataAppParamsValidator = [](const folly::Optional<std::string>&,
const Buf&) { const Buf&) {
EXPECT_TRUE(false); EXPECT_TRUE(false);
return true; return true;
}; };
DefaultAppTokenValidator validator(&conn, std::move(appParamsValidator)); DefaultAppTokenValidator validator(&conn);
EXPECT_FALSE(validator.validate(resState)); EXPECT_FALSE(validator.validate(resState));
} }
@@ -280,9 +280,9 @@ TEST(DefaultAppTokenValidatorTest, TestInvalidAppParams) {
ResumptionState resState; ResumptionState resState;
resState.appToken = encodeAppToken(appToken); resState.appToken = encodeAppToken(appToken);
auto appParamsValidator = [](const folly::Optional<std::string>&, conn.earlyDataAppParamsValidator = [](const folly::Optional<std::string>&,
const Buf&) { return false; }; const Buf&) { return false; };
DefaultAppTokenValidator validator(&conn, std::move(appParamsValidator)); DefaultAppTokenValidator validator(&conn);
EXPECT_FALSE(validator.validate(resState)); EXPECT_FALSE(validator.validate(resState));
} }
@@ -307,9 +307,11 @@ class SourceAddressTokenTest : public Test {
ResumptionState resState; ResumptionState resState;
resState.appToken = encodeAppToken(appToken_); resState.appToken = encodeAppToken(appToken_);
auto appParamsValidator = [=](const folly::Optional<std::string>&, conn_.earlyDataAppParamsValidator = [=](const folly::Optional<std::string>&,
const Buf&) { return acceptZeroRtt; }; const Buf&) {
DefaultAppTokenValidator validator(&conn_, std::move(appParamsValidator)); return acceptZeroRtt;
};
DefaultAppTokenValidator validator(&conn_);
EXPECT_EQ(validator.validate(resState), acceptZeroRtt); 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) // Use this measured rtt as init rtt (from Transport Settings)
TimePoint pathChallengeStartTime; 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. * Selects a previously unused peer-issued connection id to use.
* If there are no available ids return false and don't change anything. * If there are no available ids return false and don't change anything.