fix use after free in MasqueServerBackend
diff --git a/quic/masque/masque_server_backend.cc b/quic/masque/masque_server_backend.cc
index 5b10d6f..64c36e1 100644
--- a/quic/masque/masque_server_backend.cc
+++ b/quic/masque/masque_server_backend.cc
@@ -8,17 +8,6 @@
 
 namespace quic {
 
-namespace {
-
-std::string GetRequestHandlerKey(
-    const QuicSimpleServerBackend::RequestHandler* request_handler) {
-  return absl::StrCat(request_handler->connection_id().ToString(), "_",
-                      request_handler->stream_id(), "_",
-                      request_handler->peer_host());
-}
-
-}  // namespace
-
 MasqueServerBackend::MasqueServerBackend(MasqueMode masque_mode,
                                          const std::string& server_authority,
                                          const std::string& cache_directory)
@@ -76,34 +65,29 @@
     }
   }
 
-  auto backend_client_pair =
-      backend_clients_.find(request_handler->connection_id());
-  if (backend_client_pair == backend_clients_.end()) {
+  auto it = backend_client_states_.find(request_handler->connection_id());
+  if (it == backend_client_states_.end()) {
     QUIC_LOG(ERROR) << "Could not find backend client for "
-                    << GetRequestHandlerKey(request_handler) << " "
                     << masque_path << request_headers.DebugString();
     return false;
   }
 
-  BackendClient* backend_client = backend_client_pair->second;
+  BackendClient* backend_client = it->second.backend_client;
 
   std::unique_ptr<QuicBackendResponse> response =
       backend_client->HandleMasqueRequest(masque_path, request_headers,
                                           request_body, request_handler);
   if (response == nullptr) {
     QUIC_LOG(ERROR) << "Backend client did not process request for "
-                    << GetRequestHandlerKey(request_handler) << " "
                     << masque_path << request_headers.DebugString();
     return false;
   }
 
   QUIC_DLOG(INFO) << "Sending MASQUE response for "
-                  << GetRequestHandlerKey(request_handler) << " " << masque_path
                   << request_headers.DebugString();
 
   request_handler->OnResponseBackendComplete(response.get(), {});
-  active_response_map_[GetRequestHandlerKey(request_handler)] =
-      std::move(response);
+  it->second.responses.emplace_back(std::move(response));
 
   return true;
 }
@@ -118,7 +102,6 @@
     return;
   }
   QUIC_DLOG(INFO) << "Fetching non-MASQUE response for "
-                  << GetRequestHandlerKey(request_handler)
                   << request_headers.DebugString();
   QuicMemoryCacheBackend::FetchResponseFromBackend(
       request_headers, request_body, request_handler);
@@ -126,23 +109,23 @@
 
 void MasqueServerBackend::CloseBackendResponseStream(
     QuicSimpleServerBackend::RequestHandler* request_handler) {
-  QUIC_DLOG(INFO) << "Closing response stream for "
-                  << GetRequestHandlerKey(request_handler);
-  active_response_map_.erase(GetRequestHandlerKey(request_handler));
+  QUIC_DLOG(INFO) << "Closing response stream";
   QuicMemoryCacheBackend::CloseBackendResponseStream(request_handler);
 }
 
 void MasqueServerBackend::RegisterBackendClient(QuicConnectionId connection_id,
                                                 BackendClient* backend_client) {
-  QUIC_BUG_IF(backend_clients_.find(connection_id) != backend_clients_.end())
-      << connection_id << " already in backend clients map";
-  backend_clients_[connection_id] = backend_client;
   QUIC_DLOG(INFO) << "Registering backend client for " << connection_id;
+  QUIC_BUG_IF(backend_client_states_.find(connection_id) !=
+              backend_client_states_.end())
+      << connection_id << " already in backend clients map";
+  backend_client_states_[connection_id] =
+      BackendClientState{backend_client, {}};
 }
 
 void MasqueServerBackend::RemoveBackendClient(QuicConnectionId connection_id) {
-  backend_clients_.erase(connection_id);
   QUIC_DLOG(INFO) << "Removing backend client for " << connection_id;
+  backend_client_states_.erase(connection_id);
 }
 
 }  // namespace quic
diff --git a/quic/masque/masque_server_backend.h b/quic/masque/masque_server_backend.h
index 86b1e00..8cab852 100644
--- a/quic/masque/masque_server_backend.h
+++ b/quic/masque/masque_server_backend.h
@@ -61,10 +61,14 @@
 
   MasqueMode masque_mode_;
   std::string server_authority_;
-  absl::flat_hash_map<std::string, std::unique_ptr<QuicBackendResponse>>
-      active_response_map_;
-  absl::flat_hash_map<QuicConnectionId, BackendClient*, QuicConnectionIdHash>
-      backend_clients_;
+
+  struct BackendClientState {
+    BackendClient* backend_client;
+    std::vector<std::unique_ptr<QuicBackendResponse>> responses;
+  };
+  absl::
+      flat_hash_map<QuicConnectionId, BackendClientState, QuicConnectionIdHash>
+          backend_client_states_;
 };
 
 }  // namespace quic