| Index: net/quic/crypto/crypto_framer.cc
|
| ===================================================================
|
| --- net/quic/crypto/crypto_framer.cc (revision 184750)
|
| +++ net/quic/crypto/crypto_framer.cc (working copy)
|
| @@ -18,6 +18,31 @@
|
| const size_t kNumEntriesSize = sizeof(uint16);
|
| const size_t kValueLenSize = sizeof(uint16);
|
|
|
| +// OneShotVisitor is a framer visitor that records a single handshake message.
|
| +class OneShotVisitor : public CryptoFramerVisitorInterface {
|
| + public:
|
| + explicit OneShotVisitor(CryptoHandshakeMessage* out)
|
| + : out_(out),
|
| + error_(false) {
|
| + }
|
| +
|
| + void OnError(CryptoFramer* framer) {
|
| + error_ = true;
|
| + }
|
| +
|
| + void OnHandshakeMessage(const CryptoHandshakeMessage& message) {
|
| + *out_ = message;
|
| + }
|
| +
|
| + bool error() const {
|
| + return error_;
|
| + }
|
| +
|
| + private:
|
| + CryptoHandshakeMessage* const out_;
|
| + bool error_;
|
| +};
|
| +
|
| } // namespace
|
|
|
| CryptoFramer::CryptoFramer()
|
| @@ -30,6 +55,22 @@
|
|
|
| CryptoFramer::~CryptoFramer() {}
|
|
|
| +// static
|
| +CryptoHandshakeMessage* CryptoFramer::ParseMessage(StringPiece in) {
|
| + scoped_ptr<CryptoHandshakeMessage> msg(new CryptoHandshakeMessage);
|
| + OneShotVisitor visitor(msg.get());
|
| + CryptoFramer framer;
|
| +
|
| + framer.set_visitor(&visitor);
|
| + if (!framer.ProcessInput(in) ||
|
| + visitor.error() ||
|
| + framer.InputBytesRemaining()) {
|
| + return NULL;
|
| + }
|
| +
|
| + return msg.release();
|
| +}
|
| +
|
| bool CryptoFramer::ProcessInput(StringPiece input) {
|
| DCHECK_EQ(QUIC_NO_ERROR, error_);
|
| if (error_ != QUIC_NO_ERROR) {
|
| @@ -119,6 +160,7 @@
|
| return true;
|
| }
|
|
|
| +// static
|
| QuicData* CryptoFramer::ConstructHandshakeMessage(
|
| const CryptoHandshakeMessage& message) {
|
| if (message.tag_value_map.size() > kMaxEntries) {
|
|
|