Close all handles after connection close when session decides to close connection on error.

This change also conditionally override quic connection error
only when the QuicChromiumClientStream contains a valid connection error
code.

Bug: 922739
Change-Id: Ib83d65cd5c03f89842a344fa599d3f874107c5b7
Reviewed-on: https://chromium-review.googlesource.com/c/1415304
Commit-Queue: Ryan Hamilton <rch@chromium.org>
Reviewed-by: Ryan Hamilton <rch@chromium.org>
Cr-Commit-Position: refs/heads/master@{#623555}
diff --git a/net/quic/quic_chromium_client_session.cc b/net/quic/quic_chromium_client_session.cc
index fa35c0f..3c20ccf5 100644
--- a/net/quic/quic_chromium_client_session.cc
+++ b/net/quic/quic_chromium_client_session.cc
@@ -2323,8 +2323,9 @@
   if (!callback_.is_null()) {
     base::ResetAndReturn(&callback_).Run(net_error);
   }
+
   CloseAllStreams(net_error);
-  CloseAllHandles(net_error);
+
   net_log_.AddEvent(NetLogEventType::QUIC_SESSION_CLOSE_ON_ERROR,
                     NetLog::IntCallback("net_error", net_error));
 
@@ -2332,6 +2333,7 @@
     connection()->CloseConnection(quic_error, "net error", behavior);
   DCHECK(!connection()->connected());
 
+  CloseAllHandles(net_error);
   NotifyFactoryOfSessionClosed();
 }
 
diff --git a/net/quic/quic_http_stream.cc b/net/quic/quic_http_stream.cc
index 28c79bf..eee4128 100644
--- a/net/quic/quic_http_stream.cc
+++ b/net/quic/quic_http_stream.cc
@@ -405,7 +405,8 @@
   details->connection_info =
       ConnectionInfoFromQuicVersion(quic_session()->GetQuicVersion());
   quic_session()->PopulateNetErrorDetails(details);
-  if (quic_session()->IsCryptoHandshakeConfirmed() && stream_)
+  if (quic_session()->IsCryptoHandshakeConfirmed() && stream_ &&
+      stream_->connection_error() != quic::QUIC_NO_ERROR)
     details->quic_connection_error = stream_->connection_error();
 }
 
diff --git a/net/quic/quic_stream_factory_test.cc b/net/quic/quic_stream_factory_test.cc
index 9b8f6c99..ada58429 100644
--- a/net/quic/quic_stream_factory_test.cc
+++ b/net/quic/quic_stream_factory_test.cc
@@ -5389,6 +5389,11 @@
   EXPECT_EQ(ERR_NETWORK_CHANGED,
             stream->ReadResponseHeaders(callback_.callback()));
 
+  NetErrorDetails error_details;
+  stream->PopulateNetErrorDetails(&error_details);
+  EXPECT_EQ(error_details.quic_connection_error,
+            quic::QUIC_CONNECTION_MIGRATION_NO_NEW_NETWORK);
+
   EXPECT_TRUE(socket_data.AllReadDataConsumed());
   EXPECT_TRUE(socket_data.AllWriteDataConsumed());
 }