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..6766855790be3a27e0763753594d0b1a0e4b51ce 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,13 @@ 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) { |
+QuicServerInfo::QuicServerInfo(const string& hostname) : hostname_(hostname) { |
} |
QuicServerInfo::~QuicServerInfo() { |
@@ -36,7 +43,7 @@ QuicServerInfo::State* QuicServerInfo::mutable_state() { |
return &state_; |
} |
-bool QuicServerInfo::Parse(const std::string& data) { |
+bool QuicServerInfo::Parse(const string& data) { |
State* state = mutable_state(); |
state->Clear(); |
@@ -47,21 +54,79 @@ bool QuicServerInfo::Parse(const std::string& data) { |
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) || version < 0) { |
wtc
2014/02/11 01:01:45
I think we don't need to test if version < 0. We c
ramant (doing other things)
2014/02/11 07:57:55
Done.
|
+ 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. |
+ int num_certs; |
+ if (!p.ReadInt(&iter, &num_certs) || num_certs < 0) { |
wtc
2014/02/11 01:01:45
num_certs should have the uint32 type to match the
ramant (doing other things)
2014/02/11 07:57:55
Done.
|
+ DVLOG(1) << "Malformed num_certs"; |
+ return false; |
+ } |
+ |
+ for (int 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() {} |