Index: net/tools/quic/quic_client_base.h |
diff --git a/net/tools/quic/quic_client_base.h b/net/tools/quic/quic_client_base.h |
index f15f25fe6ae9b75eb3814ab81365e65f59f72b43..5bc4014a47138622cb8f04127bbfd46a4e834a2a 100644 |
--- a/net/tools/quic/quic_client_base.h |
+++ b/net/tools/quic/quic_client_base.h |
@@ -31,7 +31,8 @@ namespace net { |
class ProofVerifier; |
class QuicServerId; |
-class QuicClientBase { |
+class QuicClientBase : public QuicClientPushPromiseIndex::Delegate, |
+ public QuicSpdyStream::Visitor { |
public: |
// The client uses these objects to keep track of any data to resend upon |
// receipt of a stateless reject. Recall that the client API allows callers |
@@ -69,7 +70,7 @@ class QuicClientBase { |
QuicAlarmFactory* alarm_factory, |
std::unique_ptr<ProofVerifier> proof_verifier); |
- ~QuicClientBase(); |
+ ~QuicClientBase() override; |
// Initializes the client to create a connection. Should be called exactly |
// once before calling StartConnect or Connect. Returns true if the |
@@ -91,6 +92,11 @@ class QuicClientBase { |
// Wait for events until the handshake is confirmed. |
void WaitForCryptoHandshakeConfirmed(); |
+ // Sends an HTTP request and does not wait for response before returning. |
+ virtual void SendRequest(const SpdyHeaderBlock& headers, |
+ base::StringPiece body, |
+ bool fin) = 0; |
+ |
// Wait up to 50ms, and handle any events which occur. |
// Returns true if there are any outstanding requests. |
virtual bool WaitForEvents() = 0; |
@@ -204,6 +210,17 @@ class QuicClientBase { |
return &push_promise_index_; |
} |
+ bool CheckVary(const SpdyHeaderBlock& client_request, |
+ const SpdyHeaderBlock& promise_request, |
+ const SpdyHeaderBlock& promise_response) override; |
+ void OnRendezvousResult(QuicSpdyStream*) override; |
+ |
+ // If the crypto handshake has not yet been confirmed, adds the data to the |
+ // queue of data to resend if the client receives a stateless reject. |
+ // Otherwise, deletes the data. |
+ void MaybeAddQuicDataToResend( |
+ std::unique_ptr<QuicDataToResend> data_to_resend); |
+ |
protected: |
// Takes ownership of |connection|. |
virtual QuicClientSession* CreateQuicClientSession( |
@@ -222,6 +239,21 @@ class QuicClientBase { |
// connection ID). |
virtual QuicConnectionId GenerateNewConnectionId(); |
+ // If the crypto handshake has not yet been confirmed, adds the data to the |
+ // queue of data to resend if the client receives a stateless reject. |
+ // Otherwise, deletes the data. |
+ void MaybeAddDataToResend(const SpdyHeaderBlock& headers, |
+ base::StringPiece body, |
+ bool fin); |
+ |
+ void ClearDataToResend(); |
+ |
+ void ResendSavedData(); |
+ |
+ void AddPromiseDataToResend(const SpdyHeaderBlock& headers, |
+ base::StringPiece body, |
+ bool fin); |
+ |
QuicConnectionHelperInterface* helper() { return helper_.get(); } |
QuicAlarmFactory* alarm_factory() { return alarm_factory_.get(); } |
@@ -235,6 +267,28 @@ class QuicClientBase { |
} |
private: |
+ // Specific QuicClient class for storing data to resend. |
+ class ClientQuicDataToResend : public QuicDataToResend { |
+ public: |
+ ClientQuicDataToResend(std::unique_ptr<SpdyHeaderBlock> headers, |
+ base::StringPiece body, |
+ bool fin, |
+ QuicClientBase* client) |
+ : QuicDataToResend(std::move(headers), body, fin), client_(client) { |
+ DCHECK(headers_); |
+ DCHECK(client); |
+ } |
+ |
+ ~ClientQuicDataToResend() override {} |
+ |
+ void Resend() override; |
+ |
+ private: |
+ QuicClientBase* client_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ClientQuicDataToResend); |
+ }; |
+ |
// |server_id_| is a tuple (hostname, port, is_https) of the server. |
QuicServerId server_id_; |
@@ -290,6 +344,12 @@ class QuicClientBase { |
QuicClientPushPromiseIndex push_promise_index_; |
+ // Keeps track of any data that must be resent upon a subsequent successful |
+ // connection, in case the client receives a stateless reject. |
+ std::vector<std::unique_ptr<QuicDataToResend>> data_to_resend_on_connect_; |
+ |
+ std::unique_ptr<ClientQuicDataToResend> push_promise_data_to_resend_; |
+ |
DISALLOW_COPY_AND_ASSIGN(QuicClientBase); |
}; |