| Index: net/quic/crypto/quic_server_info.cc
|
| diff --git a/net/quic/crypto/quic_server_info.cc b/net/quic/crypto/quic_server_info.cc
|
| index 25cb9192b7ec423f67d6d7a5378ecf17c979826b..66a876d888a10cce0697afc34ae9387154586ec4 100644
|
| --- a/net/quic/crypto/quic_server_info.cc
|
| +++ b/net/quic/crypto/quic_server_info.cc
|
| @@ -4,9 +4,17 @@
|
|
|
| #include "net/quic/crypto/quic_server_info.h"
|
|
|
| -#include "base/bind.h"
|
| +#include <limits>
|
| +
|
| #include "base/pickle.h"
|
| -#include "base/strings/string_piece.h"
|
| +
|
| +using std::string;
|
| +
|
| +namespace {
|
| +
|
| +const int kQuicCryptoConfigVersion = 1;
|
| +
|
| +} // namespace
|
|
|
| namespace net {
|
|
|
| @@ -15,14 +23,23 @@ QuicServerInfo::State::State() {}
|
| QuicServerInfo::State::~State() {}
|
|
|
| void QuicServerInfo::State::Clear() {
|
| - data.clear();
|
| + server_config->clear();
|
| + source_address_token->clear();
|
| + server_config_sig->clear();
|
| + certs->clear();
|
| }
|
|
|
| -// TODO(rtenneti): Flesh out the details.
|
| -QuicServerInfo::QuicServerInfo(
|
| - const std::string& hostname)
|
| - : hostname_(hostname),
|
| - weak_factory_(this) {
|
| +void QuicServerInfo::State::SetConfigData(std::string* server_config_arg,
|
| + std::string* source_address_token_arg,
|
| + std::vector<std::string>* certs_arg,
|
| + std::string* server_config_sig_arg) {
|
| + server_config = server_config_arg;
|
| + source_address_token = source_address_token_arg;
|
| + certs = certs_arg;
|
| + server_config_sig = server_config_sig_arg;
|
| +}
|
| +
|
| +QuicServerInfo::QuicServerInfo(const string& hostname) : hostname_(hostname) {
|
| }
|
|
|
| QuicServerInfo::~QuicServerInfo() {
|
| @@ -36,32 +53,95 @@ QuicServerInfo::State* QuicServerInfo::mutable_state() {
|
| return &state_;
|
| }
|
|
|
| -bool QuicServerInfo::Parse(const std::string& data) {
|
| +bool QuicServerInfo::Parse(const string& data) {
|
| State* state = mutable_state();
|
|
|
| + if (!state->server_config->empty()) {
|
| + return false;
|
| + }
|
| +
|
| state->Clear();
|
|
|
| bool r = ParseInner(data);
|
| - if (!r)
|
| + if (!r) {
|
| state->Clear();
|
| + }
|
| return r;
|
| }
|
|
|
| -bool QuicServerInfo::ParseInner(const std::string& data) {
|
| - // TODO(rtenneti): restore QuicCryptoClientConfig::CachedState.
|
| - // State* state = mutable_state();
|
| +bool QuicServerInfo::ParseInner(const string& data) {
|
| + State* state = mutable_state();
|
|
|
| - // Pickle p(data.data(), data.size());
|
| - // PickleIterator iter(p);
|
| + // No data was read from the disk cache.
|
| + if (data.empty()) {
|
| + return false;
|
| + }
|
| +
|
| + Pickle p(data.data(), data.size());
|
| + PickleIterator iter(p);
|
| +
|
| + int version = -1;
|
| + if (!p.ReadInt(&iter, &version)) {
|
| + DVLOG(1) << "Missing version";
|
| + return false;
|
| + }
|
| +
|
| + if (version != kQuicCryptoConfigVersion) {
|
| + DVLOG(1) << "Unsupported version";
|
| + return false;
|
| + }
|
| +
|
| + if (!p.ReadString(&iter, state->server_config)) {
|
| + DVLOG(1) << "Malformed server_config";
|
| + return false;
|
| + }
|
| + if (!p.ReadString(&iter, state->source_address_token)) {
|
| + DVLOG(1) << "Malformed source_address_token";
|
| + return false;
|
| + }
|
| + if (!p.ReadString(&iter, state->server_config_sig)) {
|
| + DVLOG(1) << "Malformed server_config_sig";
|
| + return false;
|
| + }
|
| +
|
| + // Read certs.
|
| + uint32 num_certs;
|
| + if (!p.ReadUInt32(&iter, &num_certs)) {
|
| + DVLOG(1) << "Malformed num_certs";
|
| + return false;
|
| + }
|
| +
|
| + for (uint32 i = 0; i < num_certs; i++) {
|
| + string cert;
|
| + if (!p.ReadString(&iter, &cert)) {
|
| + DVLOG(1) << "Malformed cert";
|
| + return false;
|
| + }
|
| + state->certs->push_back(cert);
|
| + }
|
|
|
| return true;
|
| }
|
|
|
| -std::string QuicServerInfo::Serialize() const {
|
| +string QuicServerInfo::Serialize() const {
|
| Pickle p(sizeof(Pickle::Header));
|
|
|
| - // TODO(rtenneti): serialize QuicCryptoClientConfig::CachedState.
|
| - return std::string(reinterpret_cast<const char *>(p.data()), p.size());
|
| + if (!p.WriteInt(kQuicCryptoConfigVersion) ||
|
| + !p.WriteString(*state_.server_config) ||
|
| + !p.WriteString(*state_.source_address_token) ||
|
| + !p.WriteString(*state_.server_config_sig) ||
|
| + state_.certs->size() > std::numeric_limits<uint32>::max() ||
|
| + !p.WriteUInt32(state_.certs->size())) {
|
| + return string();
|
| + }
|
| +
|
| + for (size_t i = 0; i < state_.certs->size(); i++) {
|
| + if (!p.WriteString((*state_.certs)[i])) {
|
| + return string();
|
| + }
|
| + }
|
| +
|
| + return string(reinterpret_cast<const char *>(p.data()), p.size());
|
| }
|
|
|
| QuicServerInfoFactory::~QuicServerInfoFactory() {}
|
|
|