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>
|
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(
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user