Index: net/tools/quic/quic_client_base.cc |
diff --git a/net/tools/quic/quic_client_base.cc b/net/tools/quic/quic_client_base.cc |
index ca20baed28f5715fece9795245fda8af620f769f..80b12df80f913d9a70047c19efd82cc2d4ebadd7 100644 |
--- a/net/tools/quic/quic_client_base.cc |
+++ b/net/tools/quic/quic_client_base.cc |
@@ -11,6 +11,11 @@ using base::StringPiece; |
namespace net { |
+void QuicClientBase::ClientQuicDataToResend::Resend() { |
+ client_->SendRequest(*headers_, body_, fin_); |
+ headers_ = nullptr; |
+} |
+ |
QuicClientBase::QuicDataToResend::QuicDataToResend( |
std::unique_ptr<SpdyHeaderBlock> headers, |
StringPiece body, |
@@ -160,4 +165,69 @@ QuicConnectionId QuicClientBase::GenerateNewConnectionId() { |
return QuicRandom::GetInstance()->RandUint64(); |
} |
+void QuicClientBase::MaybeAddDataToResend(const SpdyHeaderBlock& headers, |
+ StringPiece body, |
+ bool fin) { |
+ if (!FLAGS_enable_quic_stateless_reject_support) { |
+ return; |
+ } |
+ |
+ if (session()->IsCryptoHandshakeConfirmed()) { |
+ // The handshake is confirmed. No need to continue saving requests to |
+ // resend. |
+ data_to_resend_on_connect_.clear(); |
+ return; |
+ } |
+ |
+ // The handshake is not confirmed. Push the data onto the queue of data to |
+ // resend if statelessly rejected. |
+ std::unique_ptr<SpdyHeaderBlock> new_headers( |
+ new SpdyHeaderBlock(headers.Clone())); |
+ std::unique_ptr<QuicDataToResend> data_to_resend( |
+ new ClientQuicDataToResend(std::move(new_headers), body, fin, this)); |
+ MaybeAddQuicDataToResend(std::move(data_to_resend)); |
+} |
+ |
+void QuicClientBase::MaybeAddQuicDataToResend( |
+ std::unique_ptr<QuicDataToResend> data_to_resend) { |
+ data_to_resend_on_connect_.push_back(std::move(data_to_resend)); |
+} |
+ |
+void QuicClientBase::ClearDataToResend() { |
+ data_to_resend_on_connect_.clear(); |
+} |
+ |
+void QuicClientBase::ResendSavedData() { |
+ for (const auto& data : data_to_resend_on_connect_) { |
+ data->Resend(); |
+ } |
+ data_to_resend_on_connect_.clear(); |
+} |
+ |
+void QuicClientBase::AddPromiseDataToResend(const SpdyHeaderBlock& headers, |
+ StringPiece body, |
+ bool fin) { |
+ std::unique_ptr<SpdyHeaderBlock> new_headers( |
+ new SpdyHeaderBlock(headers.Clone())); |
+ push_promise_data_to_resend_.reset( |
+ new ClientQuicDataToResend(std::move(new_headers), body, fin, this)); |
+} |
+ |
+bool QuicClientBase::CheckVary(const SpdyHeaderBlock& client_request, |
+ const SpdyHeaderBlock& promise_request, |
+ const SpdyHeaderBlock& promise_response) { |
+ return true; |
+} |
+ |
+void QuicClientBase::OnRendezvousResult(QuicSpdyStream* stream) { |
+ std::unique_ptr<ClientQuicDataToResend> data_to_resend = |
+ std::move(push_promise_data_to_resend_); |
+ if (stream) { |
+ stream->set_visitor(this); |
+ stream->OnDataAvailable(); |
+ } else if (data_to_resend.get()) { |
+ data_to_resend->Resend(); |
+ } |
+} |
+ |
} // namespace net |