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:
committed by
Facebook GitHub Bot
parent
b52f2d97f4
commit
7a1b58e5e8
@@ -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(
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user