fix capsule with context
diff --git a/quic/core/http/quic_spdy_stream.cc b/quic/core/http/quic_spdy_stream.cc index 810994e..1e89e77 100644 --- a/quic/core/http/quic_spdy_stream.cc +++ b/quic/core/http/quic_spdy_stream.cc
@@ -1381,21 +1381,25 @@ Http3DatagramContextExtensions()); break; case CapsuleType::DATAGRAM: { - Http3DatagramVisitor* visitor = nullptr; + Http3DatagramVisitor* visitor; if (frame.datagram_capsule.context_id.has_value()) { auto it = datagram_context_visitors_.find( frame.datagram_capsule.context_id.value()); - if (it != datagram_context_visitors_.end()) { - visitor = it->second; + if (it == datagram_context_visitors_.end()) { + QUIC_DLOG(ERROR) << ENDPOINT << "Received capsule " << frame + << " without any visitor for context " + << frame.datagram_capsule.context_id.value(); + return true; } + visitor = it->second; } else { + if (datagram_no_context_visitor_ == nullptr) { + QUIC_DLOG(ERROR) << ENDPOINT << "Received capsule " << frame + << " without any visitor for no context"; + return true; + } visitor = datagram_no_context_visitor_; } - if (visitor == nullptr) { - QUIC_DLOG(ERROR) << ENDPOINT << "Received capsule " << frame - << " without any registration visitor"; - return true; - } visitor->OnHttp3Datagram(id(), frame.datagram_capsule.context_id, frame.datagram_capsule.http_datagram_payload); } break; @@ -1501,6 +1505,7 @@ << id() << " context ID " << context_id.value(); return; } + decoder_.set_datagram_context_id_present(true); } else { // Registration without a context ID. if (!datagram_context_visitors_.empty()) { @@ -1518,6 +1523,7 @@ return; } datagram_no_context_visitor_ = visitor; + decoder_.set_datagram_context_id_present(false); } if (spdy_session_->http_datagram_support() == HttpDatagramSupport::kDraft03) { const bool is_client = session()->perspective() == Perspective::IS_CLIENT;