| Index: net/quic/quic_crypto_client_stream.cc
|
| diff --git a/net/quic/quic_crypto_client_stream.cc b/net/quic/quic_crypto_client_stream.cc
|
| index f3a924b9ef4770b4f6dc9b996ac1155ee2dcd9a8..ba8000c5681503253b35e6aa948cdb9d330a036b 100644
|
| --- a/net/quic/quic_crypto_client_stream.cc
|
| +++ b/net/quic/quic_crypto_client_stream.cc
|
| @@ -94,8 +94,28 @@ QuicCryptoClientStream::~QuicCryptoClientStream() {
|
|
|
| void QuicCryptoClientStream::OnHandshakeMessage(
|
| const CryptoHandshakeMessage& message) {
|
| + DVLOG(1) << "Client: Received " << message.DebugString();
|
| +
|
| QuicCryptoStream::OnHandshakeMessage(message);
|
|
|
| + if (message.tag() == kSCUP) {
|
| + if (!handshake_confirmed()) {
|
| + CloseConnection(QUIC_CRYPTO_UPDATE_BEFORE_HANDSHAKE_COMPLETE);
|
| + return;
|
| + }
|
| +
|
| + // |message| is an update from the server, so we treat it differently from a
|
| + // handshake message.
|
| + HandleServerConfigUpdateMessage(&message);
|
| + return;
|
| + }
|
| +
|
| + // Do not process handshake messages after the handshake is confirmed.
|
| + if (handshake_confirmed()) {
|
| + CloseConnection(QUIC_CRYPTO_MESSAGE_AFTER_HANDSHAKE_COMPLETE);
|
| + return;
|
| + }
|
| +
|
| DoHandshakeLoop(&message);
|
| }
|
|
|
| @@ -115,6 +135,26 @@ bool QuicCryptoClientStream::WasChannelIDSent() const {
|
| return channel_id_key_.get() != NULL;
|
| }
|
|
|
| +void QuicCryptoClientStream::HandleServerConfigUpdateMessage(
|
| + const CryptoHandshakeMessage* in) {
|
| + DCHECK(in->tag() == kSCUP);
|
| + string error_details;
|
| + QuicCryptoClientConfig::CachedState* cached =
|
| + crypto_config_->LookupOrCreate(server_id_);
|
| + QuicErrorCode error = crypto_config_->ProcessServerConfigUpdate(
|
| + *in,
|
| + session()->connection()->clock()->WallNow(),
|
| + cached,
|
| + &crypto_negotiated_params_,
|
| + &error_details);
|
| +
|
| + if (error != QUIC_NO_ERROR) {
|
| + CloseConnectionWithDetails(
|
| + error, "Server config update invalid: " + error_details);
|
| + return;
|
| + }
|
| +}
|
| +
|
| // kMaxClientHellos is the maximum number of times that we'll send a client
|
| // hello. The value 3 accounts for:
|
| // * One failure due to an incorrect or missing source-address token.
|
| @@ -130,10 +170,6 @@ void QuicCryptoClientStream::DoHandshakeLoop(
|
| QuicCryptoClientConfig::CachedState* cached =
|
| crypto_config_->LookupOrCreate(server_id_);
|
|
|
| - if (in != NULL) {
|
| - DVLOG(1) << "Client: Received " << in->DebugString();
|
| - }
|
| -
|
| for (;;) {
|
| const State state = next_state_;
|
| next_state_ = STATE_IDLE;
|
|
|