Remove optional::value(), map::at() from quic.

QUICHE is not supposed to have exceptions. std::optional::value can
throw bad_optional_access, and absl_flat_hashmap::at can throw
out_of_range.

There are other places where we use exception-throwing APIs in
QUICHE, but I'll tackle those in future changes.

PiperOrigin-RevId: 590739628
diff --git a/quiche/quic/core/http/end_to_end_test.cc b/quiche/quic/core/http/end_to_end_test.cc
index 656252d..78eeffc 100644
--- a/quiche/quic/core/http/end_to_end_test.cc
+++ b/quiche/quic/core/http/end_to_end_test.cc
@@ -6051,10 +6051,9 @@
   EXPECT_CALL(visitor, OnTransportParametersSent(_))
       .WillOnce(Invoke([kCustomParameter](
                            const TransportParameters& transport_parameters) {
-        ASSERT_NE(transport_parameters.custom_parameters.find(kCustomParameter),
-                  transport_parameters.custom_parameters.end());
-        EXPECT_EQ(transport_parameters.custom_parameters.at(kCustomParameter),
-                  "test");
+        auto it = transport_parameters.custom_parameters.find(kCustomParameter);
+        ASSERT_NE(it, transport_parameters.custom_parameters.end());
+        EXPECT_EQ(it->second, "test");
       }));
   EXPECT_CALL(visitor, OnTransportParametersReceived(_)).Times(1);
   ASSERT_TRUE(Initialize());
@@ -6070,12 +6069,10 @@
     ADD_FAILURE() << "Missing server session";
   }
   if (server_config != nullptr) {
-    if (server_config->received_custom_transport_parameters().find(
-            kCustomParameter) !=
-        server_config->received_custom_transport_parameters().end()) {
-      EXPECT_EQ(server_config->received_custom_transport_parameters().at(
-                    kCustomParameter),
-                "test");
+    if (auto it = server_config->received_custom_transport_parameters().find(
+            kCustomParameter);
+        it != server_config->received_custom_transport_parameters().end()) {
+      EXPECT_EQ(it->second, "test");
     } else {
       ADD_FAILURE() << "Did not find custom parameter";
     }
diff --git a/quiche/quic/moqt/moqt_framer.cc b/quiche/quic/moqt/moqt_framer.cc
index 4111d78..a0b5f40 100644
--- a/quiche/quic/moqt/moqt_framer.cc
+++ b/quiche/quic/moqt/moqt_framer.cc
@@ -180,12 +180,12 @@
   if (message.role.has_value()) {
     WriteVarIntParameter(writer,
                          static_cast<uint64_t>(MoqtSetupParameter::kRole),
-                         static_cast<uint64_t>(message.role.value()));
+                         static_cast<uint64_t>(*message.role));
   }
   if (!using_webtrans_ && message.path.has_value()) {
     WriteStringParameter(writer,
                          static_cast<uint64_t>(MoqtSetupParameter::kPath),
-                         message.path.value());
+                         *message.path);
   }
   QUICHE_DCHECK(writer.remaining() == 0);
   return buffer;
@@ -210,7 +210,7 @@
   if (message.role.has_value()) {
     WriteVarIntParameter(writer,
                          static_cast<uint64_t>(MoqtSetupParameter::kRole),
-                         static_cast<uint64_t>(message.role.value()));
+                         static_cast<uint64_t>(*message.role));
   }
   QUICHE_DCHECK(writer.remaining() == 0);
   return buffer;
@@ -257,7 +257,7 @@
     WriteStringParameter(
         writer,
         static_cast<uint64_t>(MoqtTrackRequestParameter::kAuthorizationInfo),
-        message.authorization_info.value());
+        *message.authorization_info);
   }
   QUICHE_DCHECK(writer.remaining() == 0);
   return buffer;
@@ -380,7 +380,7 @@
     WriteStringParameter(
         writer,
         static_cast<uint64_t>(MoqtTrackRequestParameter::kAuthorizationInfo),
-        message.authorization_info.value());
+        *message.authorization_info);
   }
   QUICHE_DCHECK(writer.remaining() == 0);
   return buffer;
diff --git a/quiche/quic/moqt/moqt_parser.cc b/quiche/quic/moqt/moqt_parser.cc
index b672489..8a9213c 100644
--- a/quiche/quic/moqt/moqt_parser.cc
+++ b/quiche/quic/moqt/moqt_parser.cc
@@ -62,7 +62,7 @@
     QUICHE_DCHECK(buffered_message_.empty());
     if (!object_metadata_->payload_length.has_value()) {
       // Deliver the data and exit.
-      visitor_.OnObjectMessage(object_metadata_.value(), data, fin);
+      visitor_.OnObjectMessage(*object_metadata_, data, fin);
       if (fin) {
         object_metadata_.reset();
       }
@@ -70,13 +70,13 @@
     }
     if (data.length() < payload_length_remaining_) {
       // Does not finish the payload; deliver and exit.
-      visitor_.OnObjectMessage(object_metadata_.value(), data, false);
+      visitor_.OnObjectMessage(*object_metadata_, data, false);
       payload_length_remaining_ -= data.length();
       return;
     }
     // Finishes the payload. Deliver and continue.
     reader.emplace(data);
-    visitor_.OnObjectMessage(object_metadata_.value(),
+    visitor_.OnObjectMessage(*object_metadata_,
                              data.substr(0, payload_length_remaining_), true);
     reader->Seek(payload_length_remaining_);
     object_metadata_.reset();
@@ -186,7 +186,7 @@
                                ? reader.BytesRemaining()
                                : *object_metadata_->payload_length;
   visitor_.OnObjectMessage(
-      object_metadata_.value(),
+      *object_metadata_,
       reader.PeekRemainingPayload().substr(0, payload_to_draw),
       received_complete_message);
   if (received_complete_message) {
diff --git a/quiche/quic/moqt/moqt_parser_test.cc b/quiche/quic/moqt/moqt_parser_test.cc
index 50a0357..32643d4 100644
--- a/quiche/quic/moqt/moqt_parser_test.cc
+++ b/quiche/quic/moqt/moqt_parser_test.cc
@@ -99,7 +99,7 @@
     messages_received_++;
     MoqtClientSetup client_setup = message;
     if (client_setup.path.has_value()) {
-      string0_ = std::string(client_setup.path.value());
+      string0_ = std::string(*client_setup.path);
       client_setup.path = absl::string_view(string0_);
     }
     last_message_ = TestMessageBase::MessageStructuredData(client_setup);
@@ -119,7 +119,7 @@
     string1_ = std::string(subscribe_request.track_name);
     subscribe_request.track_name = absl::string_view(string1_);
     if (subscribe_request.authorization_info.has_value()) {
-      string2_ = std::string(subscribe_request.authorization_info.value());
+      string2_ = std::string(*subscribe_request.authorization_info);
       subscribe_request.authorization_info = absl::string_view(string2_);
     }
     last_message_ = TestMessageBase::MessageStructuredData(subscribe_request);
@@ -185,7 +185,7 @@
     string0_ = std::string(announce.track_namespace);
     announce.track_namespace = absl::string_view(string0_);
     if (announce.authorization_info.has_value()) {
-      string1_ = std::string(announce.authorization_info.value());
+      string1_ = std::string(*announce.authorization_info);
       announce.authorization_info = absl::string_view(string1_);
     }
     last_message_ = TestMessageBase::MessageStructuredData(announce);
@@ -300,7 +300,7 @@
   std::unique_ptr<TestMessageBase> message = MakeMessage(message_type_);
   parser_.ProcessData(message->PacketSample(), true);
   EXPECT_EQ(visitor_.messages_received_, 1);
-  EXPECT_TRUE(message->EqualFieldValues(visitor_.last_message_.value()));
+  EXPECT_TRUE(message->EqualFieldValues(*visitor_.last_message_));
   EXPECT_TRUE(visitor_.end_of_message_);
   if (IsObjectMessage(message_type_)) {
     // Check payload message.
@@ -314,7 +314,7 @@
   message->ExpandVarints();
   parser_.ProcessData(message->PacketSample(), true);
   EXPECT_EQ(visitor_.messages_received_, 1);
-  EXPECT_TRUE(message->EqualFieldValues(visitor_.last_message_.value()));
+  EXPECT_TRUE(message->EqualFieldValues(*visitor_.last_message_));
   EXPECT_TRUE(visitor_.end_of_message_);
   if (IsObjectMessage(message_type_)) {
     // Check payload message.
@@ -337,7 +337,7 @@
           first_data_size, message->total_message_size() - first_data_size),
       true);
   EXPECT_EQ(visitor_.messages_received_, 1);
-  EXPECT_TRUE(message->EqualFieldValues(visitor_.last_message_.value()));
+  EXPECT_TRUE(message->EqualFieldValues(*visitor_.last_message_));
   if (IsObjectMessage(message_type_)) {
     EXPECT_EQ(visitor_.object_payload_, "foo");
   }
@@ -362,7 +362,7 @@
     parser_.ProcessData(absl::string_view(), true);  // Needs the FIN
     EXPECT_EQ(visitor_.messages_received_, kObjectPayloadSize + 2);
   }
-  EXPECT_TRUE(message->EqualFieldValues(visitor_.last_message_.value()));
+  EXPECT_TRUE(message->EqualFieldValues(*visitor_.last_message_));
   EXPECT_TRUE(visitor_.end_of_message_);
   EXPECT_FALSE(visitor_.parsing_error_.has_value());
 }
@@ -385,7 +385,7 @@
     parser_.ProcessData(absl::string_view(), true);  // Needs the FIN
     EXPECT_EQ(visitor_.messages_received_, kObjectPayloadSize + 2);
   }
-  EXPECT_TRUE(message->EqualFieldValues(visitor_.last_message_.value()));
+  EXPECT_TRUE(message->EqualFieldValues(*visitor_.last_message_));
   EXPECT_TRUE(visitor_.end_of_message_);
   EXPECT_FALSE(visitor_.parsing_error_.has_value());
 }
@@ -430,14 +430,14 @@
   auto message = std::make_unique<ObjectMessageWithoutLength>();
   parser.ProcessData(message->PacketSample(), false);
   EXPECT_EQ(visitor_.messages_received_, 1);
-  EXPECT_TRUE(message->EqualFieldValues(visitor_.last_message_.value()));
+  EXPECT_TRUE(message->EqualFieldValues(*visitor_.last_message_));
   EXPECT_TRUE(visitor_.object_payload_.has_value());
   EXPECT_EQ(*(visitor_.object_payload_), "foo");
   EXPECT_FALSE(visitor_.end_of_message_);
 
   parser.ProcessData(absl::string_view(), true);  // send the FIN
   EXPECT_EQ(visitor_.messages_received_, 2);
-  EXPECT_TRUE(message->EqualFieldValues(visitor_.last_message_.value()));
+  EXPECT_TRUE(message->EqualFieldValues(*visitor_.last_message_));
   EXPECT_TRUE(visitor_.object_payload_.has_value());
   EXPECT_EQ(*(visitor_.object_payload_), "");
   EXPECT_TRUE(visitor_.end_of_message_);
@@ -451,7 +451,7 @@
   auto message = std::make_unique<ObjectMessageWithoutLength>();
   parser.ProcessData(message->PacketSample(), false);
   EXPECT_EQ(visitor_.messages_received_, 1);
-  EXPECT_TRUE(message->EqualFieldValues(visitor_.last_message_.value()));
+  EXPECT_TRUE(message->EqualFieldValues(*visitor_.last_message_));
   EXPECT_FALSE(visitor_.end_of_message_);
   EXPECT_TRUE(visitor_.object_payload_.has_value());
   EXPECT_EQ(*(visitor_.object_payload_), "foo");
@@ -459,7 +459,7 @@
   // second part
   parser.ProcessData("bar", false);
   EXPECT_EQ(visitor_.messages_received_, 2);
-  EXPECT_TRUE(message->EqualFieldValues(visitor_.last_message_.value()));
+  EXPECT_TRUE(message->EqualFieldValues(*visitor_.last_message_));
   EXPECT_FALSE(visitor_.end_of_message_);
   EXPECT_TRUE(visitor_.object_payload_.has_value());
   EXPECT_EQ(*(visitor_.object_payload_), "bar");
@@ -467,7 +467,7 @@
   // third part includes FIN
   parser.ProcessData("deadbeef", true);
   EXPECT_EQ(visitor_.messages_received_, 3);
-  EXPECT_TRUE(message->EqualFieldValues(visitor_.last_message_.value()));
+  EXPECT_TRUE(message->EqualFieldValues(*visitor_.last_message_));
   EXPECT_TRUE(visitor_.end_of_message_);
   EXPECT_TRUE(visitor_.object_payload_.has_value());
   EXPECT_EQ(*(visitor_.object_payload_), "deadbeef");
@@ -489,7 +489,7 @@
       message->PacketSample().substr(4, message->total_message_size() - 4),
       false);
   EXPECT_EQ(visitor_.messages_received_, 1);
-  EXPECT_TRUE(message->EqualFieldValues(visitor_.last_message_.value()));
+  EXPECT_TRUE(message->EqualFieldValues(*visitor_.last_message_));
   EXPECT_FALSE(visitor_.end_of_message_);
   EXPECT_TRUE(visitor_.object_payload_.has_value());
   EXPECT_EQ(visitor_.object_payload_->length(), 95);
@@ -497,7 +497,7 @@
   // third part includes FIN
   parser.ProcessData("bar", true);
   EXPECT_EQ(visitor_.messages_received_, 2);
-  EXPECT_TRUE(message->EqualFieldValues(visitor_.last_message_.value()));
+  EXPECT_TRUE(message->EqualFieldValues(*visitor_.last_message_));
   EXPECT_TRUE(visitor_.end_of_message_);
   EXPECT_TRUE(visitor_.object_payload_.has_value());
   EXPECT_EQ(*(visitor_.object_payload_), "bar");
@@ -820,8 +820,7 @@
                        false);
     EXPECT_EQ(visitor_.messages_received_, fully_received);
     if (prev_message != nullptr) {
-      EXPECT_TRUE(
-          prev_message->EqualFieldValues(visitor_.last_message_.value()));
+      EXPECT_TRUE(prev_message->EqualFieldValues(*visitor_.last_message_));
     }
     fully_received++;
     read = new_read;
@@ -831,7 +830,7 @@
   // Deliver the rest
   parser.ProcessData(absl::string_view(buffer + read, write - read), true);
   EXPECT_EQ(visitor_.messages_received_, fully_received);
-  EXPECT_TRUE(prev_message->EqualFieldValues(visitor_.last_message_.value()));
+  EXPECT_TRUE(prev_message->EqualFieldValues(*visitor_.last_message_));
   EXPECT_FALSE(visitor_.parsing_error_.has_value());
 }
 
diff --git a/quiche/quic/moqt/moqt_subscribe_windows.h b/quiche/quic/moqt/moqt_subscribe_windows.h
index 4ed173c..4bf5f76 100644
--- a/quiche/quic/moqt/moqt_subscribe_windows.h
+++ b/quiche/quic/moqt/moqt_subscribe_windows.h
@@ -31,7 +31,7 @@
     if (seq < start) {
       return false;
     }
-    if (!end.has_value() || seq < end.value()) {
+    if (!end.has_value() || seq < *end) {
       return true;
     }
     return false;
diff --git a/quiche/quic/moqt/tools/chat_client_bin.cc b/quiche/quic/moqt/tools/chat_client_bin.cc
index 87b9af9..536709c 100644
--- a/quiche/quic/moqt/tools/chat_client_bin.cc
+++ b/quiche/quic/moqt/tools/chat_client_bin.cc
@@ -101,7 +101,7 @@
                   << " ";
       }
       if (reason_phrase.has_value()) {
-        std::cout << "REJECTED, reason = " << reason_phrase.value() << "\n";
+        std::cout << "REJECTED, reason = " << *reason_phrase << "\n";
       } else {
         std::cout << "ACCEPTED\n";
       }
@@ -146,7 +146,7 @@
         [&](absl::string_view track_namespace,
             std::optional<absl::string_view> message) {
           if (message.has_value()) {
-            std::cout << "ANNOUNCE rejected, " << message.value() << "\n";
+            std::cout << "ANNOUNCE rejected, " << *message << "\n";
             session_->Error("Local ANNOUNCE rejected");
             return;
           }
diff --git a/quiche/quic/test_tools/crypto_test_utils.cc b/quiche/quic/test_tools/crypto_test_utils.cc
index 62c3a92..e3963c4 100644
--- a/quiche/quic/test_tools/crypto_test_utils.cc
+++ b/quiche/quic/test_tools/crypto_test_utils.cc
@@ -644,7 +644,7 @@
     return 0;
   }
 
-  return QuicUtils::FNV1a_64_Hash(chain->certs.at(0));
+  return QuicUtils::FNV1a_64_Hash(chain->certs[0]);
 }
 
 void FillInDummyReject(CryptoHandshakeMessage* rej) {
diff --git a/quiche/quic/tools/connect_udp_tunnel.cc b/quiche/quic/tools/connect_udp_tunnel.cc
index 4cec8b8..702963f 100644
--- a/quiche/quic/tools/connect_udp_tunnel.cc
+++ b/quiche/quic/tools/connect_udp_tunnel.cc
@@ -81,7 +81,7 @@
   }
   // Empty host checked above after path split. Expect decoding to never result
   // in an empty decoded host from non-empty encoded host.
-  QUICHE_DCHECK(!decoded_host.value().empty());
+  QUICHE_DCHECK(!decoded_host->empty());
 
   std::optional<std::string> decoded_port =
       quiche::AsciiUrlDecode(path_split[5]);
@@ -92,25 +92,22 @@
   }
   // Empty port checked above after path split. Expect decoding to never result
   // in an empty decoded port from non-empty encoded port.
-  QUICHE_DCHECK(!decoded_port.value().empty());
+  QUICHE_DCHECK(!decoded_port->empty());
 
-  int parsed_port_number =
-      url::ParsePort(decoded_port.value().data(),
-                     url::Component(0, decoded_port.value().size()));
+  int parsed_port_number = url::ParsePort(
+      decoded_port->data(), url::Component(0, decoded_port->size()));
   // Negative result is either invalid or unspecified, either of which is
   // disallowed for this parse. Port 0 is technically valid but reserved and not
   // really usable in practice, so easiest to just disallow it here.
   if (parsed_port_number <= 0) {
-    QUICHE_DVLOG(1) << "CONNECT-UDP request with bad port: "
-                    << decoded_port.value();
+    QUICHE_DVLOG(1) << "CONNECT-UDP request with bad port: " << *decoded_port;
     return std::nullopt;
   }
   // Expect url::ParsePort() to validate port is uint16_t and otherwise return
   // negative number checked for above.
   QUICHE_DCHECK_LE(parsed_port_number, std::numeric_limits<uint16_t>::max());
 
-  return QuicServerId(decoded_host.value(),
-                      static_cast<uint16_t>(parsed_port_number));
+  return QuicServerId(*decoded_host, static_cast<uint16_t>(parsed_port_number));
 }
 
 // Validate header expectations from RFC 9298, section 3.4.
@@ -200,7 +197,7 @@
     return;
   }
 
-  if (!ValidateTarget(target.value(), acceptable_targets_)) {
+  if (!ValidateTarget(*target, acceptable_targets_)) {
     SendErrorResponse("403", "destination_ip_prohibited",
                       "disallowed proxy target");
     return;
@@ -208,7 +205,7 @@
 
   // TODO(ericorth): Validate that the IP address doesn't fall into diallowed
   // ranges per RFC 9298, Section 7.
-  QuicSocketAddress address = tools::LookupAddress(AF_UNSPEC, target.value());
+  QuicSocketAddress address = tools::LookupAddress(AF_UNSPEC, *target);
   if (!address.IsInitialized()) {
     SendErrorResponse("500", "dns_error", "host resolution error");
     return;
@@ -231,7 +228,7 @@
 
   QUICHE_DVLOG(1) << "CONNECT-UDP tunnel opened from stream "
                   << client_stream_request_handler_->stream_id() << " to "
-                  << target.value().ToHostPortString();
+                  << target->ToHostPortString();
 
   client_stream_request_handler_->GetStream()->RegisterHttp3DatagramVisitor(
       this);
@@ -290,8 +287,7 @@
   }
 
   QUICHE_DCHECK(client_stream_request_handler_);
-  quiche::ConnectUdpDatagramUdpPacketPayload payload(
-      data.value().AsStringView());
+  quiche::ConnectUdpDatagramUdpPacketPayload payload(data->AsStringView());
   client_stream_request_handler_->GetStream()->SendHttp3Datagram(
       payload.Serialize());
 
@@ -354,7 +350,7 @@
   std::optional<std::string> capsule_protocol_value =
       structured_headers::SerializeItem(structured_headers::Item(true));
   QUICHE_CHECK(capsule_protocol_value.has_value());
-  response_headers["Capsule-Protocol"] = capsule_protocol_value.value();
+  response_headers["Capsule-Protocol"] = *capsule_protocol_value;
 
   QuicBackendResponse response;
   response.set_headers(std::move(response_headers));
@@ -398,7 +394,7 @@
   std::optional<std::string> proxy_status_value =
       structured_headers::SerializeList({proxy_status_member});
   QUICHE_CHECK(proxy_status_value.has_value());
-  headers["Proxy-Status"] = proxy_status_value.value();
+  headers["Proxy-Status"] = *proxy_status_value;
 
   QuicBackendResponse response;
   response.set_headers(std::move(headers));
diff --git a/quiche/quic/tools/quic_toy_server.cc b/quiche/quic/tools/quic_toy_server.cc
index 419fb14..bfe9c89 100644
--- a/quiche/quic/tools/quic_toy_server.cc
+++ b/quiche/quic/tools/quic_toy_server.cc
@@ -90,8 +90,7 @@
       std::optional<QuicServerId> destination_server_id =
           QuicServerId::ParseFromHostPortString(destination);
       QUICHE_CHECK(destination_server_id.has_value());
-      connect_proxy_destinations.insert(
-          std::move(destination_server_id).value());
+      connect_proxy_destinations.insert(*std::move(destination_server_id));
     }
 
     absl::flat_hash_set<QuicServerId> connect_udp_proxy_targets;
@@ -101,7 +100,7 @@
       std::optional<QuicServerId> target_server_id =
           QuicServerId::ParseFromHostPortString(target);
       QUICHE_CHECK(target_server_id.has_value());
-      connect_udp_proxy_targets.insert(std::move(target_server_id).value());
+      connect_udp_proxy_targets.insert(*std::move(target_server_id));
     }
 
     QUICHE_CHECK(!connect_proxy_destinations.empty() ||