| OLD | NEW |
| 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/tools/quic/quic_client_base.h" | 5 #include "net/tools/quic/quic_client_base.h" |
| 6 | 6 |
| 7 #include "net/quic/core/crypto/quic_random.h" | 7 #include "net/quic/core/crypto/quic_random.h" |
| 8 #include "net/quic/core/quic_server_id.h" | 8 #include "net/quic/core/quic_server_id.h" |
| 9 | 9 |
| 10 using base::StringPiece; | 10 using base::StringPiece; |
| 11 | 11 |
| 12 namespace net { | 12 namespace net { |
| 13 | 13 |
| 14 void QuicClientBase::ClientQuicDataToResend::Resend() { |
| 15 client_->SendRequest(*headers_, body_, fin_); |
| 16 headers_ = nullptr; |
| 17 } |
| 18 |
| 14 QuicClientBase::QuicDataToResend::QuicDataToResend( | 19 QuicClientBase::QuicDataToResend::QuicDataToResend( |
| 15 std::unique_ptr<SpdyHeaderBlock> headers, | 20 std::unique_ptr<SpdyHeaderBlock> headers, |
| 16 StringPiece body, | 21 StringPiece body, |
| 17 bool fin) | 22 bool fin) |
| 18 : headers_(std::move(headers)), body_(body), fin_(fin) {} | 23 : headers_(std::move(headers)), body_(body), fin_(fin) {} |
| 19 | 24 |
| 20 QuicClientBase::QuicDataToResend::~QuicDataToResend() {} | 25 QuicClientBase::QuicDataToResend::~QuicDataToResend() {} |
| 21 | 26 |
| 22 QuicClientBase::QuicClientBase(const QuicServerId& server_id, | 27 QuicClientBase::QuicClientBase(const QuicServerId& server_id, |
| 23 const QuicVersionVector& supported_versions, | 28 const QuicVersionVector& supported_versions, |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 << "unexpected nullptr."; | 158 << "unexpected nullptr."; |
| 154 return cached->has_server_designated_connection_id() | 159 return cached->has_server_designated_connection_id() |
| 155 ? cached->GetNextServerDesignatedConnectionId() | 160 ? cached->GetNextServerDesignatedConnectionId() |
| 156 : 0; | 161 : 0; |
| 157 } | 162 } |
| 158 | 163 |
| 159 QuicConnectionId QuicClientBase::GenerateNewConnectionId() { | 164 QuicConnectionId QuicClientBase::GenerateNewConnectionId() { |
| 160 return QuicRandom::GetInstance()->RandUint64(); | 165 return QuicRandom::GetInstance()->RandUint64(); |
| 161 } | 166 } |
| 162 | 167 |
| 168 void QuicClientBase::MaybeAddDataToResend(const SpdyHeaderBlock& headers, |
| 169 StringPiece body, |
| 170 bool fin) { |
| 171 if (!FLAGS_enable_quic_stateless_reject_support) { |
| 172 return; |
| 173 } |
| 174 |
| 175 if (session()->IsCryptoHandshakeConfirmed()) { |
| 176 // The handshake is confirmed. No need to continue saving requests to |
| 177 // resend. |
| 178 data_to_resend_on_connect_.clear(); |
| 179 return; |
| 180 } |
| 181 |
| 182 // The handshake is not confirmed. Push the data onto the queue of data to |
| 183 // resend if statelessly rejected. |
| 184 std::unique_ptr<SpdyHeaderBlock> new_headers( |
| 185 new SpdyHeaderBlock(headers.Clone())); |
| 186 std::unique_ptr<QuicDataToResend> data_to_resend( |
| 187 new ClientQuicDataToResend(std::move(new_headers), body, fin, this)); |
| 188 MaybeAddQuicDataToResend(std::move(data_to_resend)); |
| 189 } |
| 190 |
| 191 void QuicClientBase::MaybeAddQuicDataToResend( |
| 192 std::unique_ptr<QuicDataToResend> data_to_resend) { |
| 193 data_to_resend_on_connect_.push_back(std::move(data_to_resend)); |
| 194 } |
| 195 |
| 196 void QuicClientBase::ClearDataToResend() { |
| 197 data_to_resend_on_connect_.clear(); |
| 198 } |
| 199 |
| 200 void QuicClientBase::ResendSavedData() { |
| 201 for (const auto& data : data_to_resend_on_connect_) { |
| 202 data->Resend(); |
| 203 } |
| 204 data_to_resend_on_connect_.clear(); |
| 205 } |
| 206 |
| 207 void QuicClientBase::AddPromiseDataToResend(const SpdyHeaderBlock& headers, |
| 208 StringPiece body, |
| 209 bool fin) { |
| 210 std::unique_ptr<SpdyHeaderBlock> new_headers( |
| 211 new SpdyHeaderBlock(headers.Clone())); |
| 212 push_promise_data_to_resend_.reset( |
| 213 new ClientQuicDataToResend(std::move(new_headers), body, fin, this)); |
| 214 } |
| 215 |
| 216 bool QuicClientBase::CheckVary(const SpdyHeaderBlock& client_request, |
| 217 const SpdyHeaderBlock& promise_request, |
| 218 const SpdyHeaderBlock& promise_response) { |
| 219 return true; |
| 220 } |
| 221 |
| 222 void QuicClientBase::OnRendezvousResult(QuicSpdyStream* stream) { |
| 223 std::unique_ptr<ClientQuicDataToResend> data_to_resend = |
| 224 std::move(push_promise_data_to_resend_); |
| 225 if (stream) { |
| 226 stream->set_visitor(this); |
| 227 stream->OnDataAvailable(); |
| 228 } else if (data_to_resend.get()) { |
| 229 data_to_resend->Resend(); |
| 230 } |
| 231 } |
| 232 |
| 163 } // namespace net | 233 } // namespace net |
| OLD | NEW |