diff options
Diffstat (limited to 'chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream.cc')
-rw-r--r-- | chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream.cc | 44 |
1 files changed, 38 insertions, 6 deletions
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream.cc b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream.cc index 608d7b58289..beea65a993e 100644 --- a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream.cc +++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream.cc @@ -96,12 +96,6 @@ void QuicSimpleServerStream::OnInitialHeadersComplete( } } -void QuicSimpleServerStream::OnTrailingHeadersComplete( - bool /*fin*/, size_t /*frame_len*/, const QuicHeaderList& /*header_list*/) { - QUIC_BUG(quic_bug_10962_1) << "Server does not support receiving Trailers."; - SendErrorResponse(); -} - void QuicSimpleServerStream::OnBodyAvailable() { while (HasBytesToRead()) { struct iovec iov; @@ -251,6 +245,31 @@ std::string QuicSimpleServerStream::peer_host() const { return spdy_session()->peer_address().host().ToString(); } +namespace { + +class DelayedResponseAlarm : public QuicAlarm::DelegateWithContext { + public: + DelayedResponseAlarm(QuicSimpleServerStream* stream, + const QuicBackendResponse* response) + : QuicAlarm::DelegateWithContext( + stream->spdy_session()->connection()->context()), + stream_(stream), + response_(response) { + stream_ = stream; + response_ = response; + } + + ~DelayedResponseAlarm() override = default; + + void OnAlarm() override { stream_->Respond(response_); } + + private: + QuicSimpleServerStream* stream_; + const QuicBackendResponse* response_; +}; + +} // namespace + void QuicSimpleServerStream::OnResponseBackendComplete( const QuicBackendResponse* response) { if (response == nullptr) { @@ -259,6 +278,19 @@ void QuicSimpleServerStream::OnResponseBackendComplete( return; } + auto delay = response->delay(); + if (delay.IsZero()) { + Respond(response); + return; + } + + auto* connection = session()->connection(); + delayed_response_alarm_.reset(connection->alarm_factory()->CreateAlarm( + new DelayedResponseAlarm(this, response))); + delayed_response_alarm_->Set(connection->clock()->Now() + delay); +} + +void QuicSimpleServerStream::Respond(const QuicBackendResponse* response) { // Send Early Hints first. for (const auto& headers : response->early_hints()) { QUIC_DVLOG(1) << "Stream " << id() << " sending an Early Hints response: " |