Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(119)

Unified Diff: net/tools/quic/quic_client_base.h

Issue 1297853002: QUIC - reorganize common code between quic_client and quic_simple_client (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Uploaded quic_client_base.* changes Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/tools/quic/quic_client.cc ('k') | net/tools/quic/quic_client_base.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
new file mode 100644
index 0000000000000000000000000000000000000000..50582c3357200b14c6cfd876dbed557b88043a1d
--- /dev/null
+++ b/net/tools/quic/quic_client_base.h
@@ -0,0 +1,241 @@
+// Copyright (c) 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// A base class for the toy client, which connects to a specified port and sends
+// QUIC request to that endpoint.
+
+#ifndef NET_TOOLS_QUIC_QUIC_CLIENT_BASE_H_
+#define NET_TOOLS_QUIC_QUIC_CLIENT_BASE_H_
+
+#include <string>
+
+#include "base/basictypes.h"
+#include "base/memory/scoped_ptr.h"
+#include "net/base/ip_endpoint.h"
+#include "net/log/net_log.h"
+#include "net/quic/crypto/crypto_handshake.h"
+#include "net/quic/crypto/quic_crypto_client_config.h"
+#include "net/quic/quic_bandwidth.h"
+#include "net/quic/quic_config.h"
+#include "net/quic/quic_connection.h"
+#include "net/quic/quic_packet_writer.h"
+#include "net/quic/quic_protocol.h"
+#include "net/tools/quic/quic_client_session.h"
+#include "net/tools/quic/quic_spdy_client_stream.h"
+
+namespace net {
+
+class ProofVerifier;
+class QuicServerId;
+
+namespace tools {
+
+class QuicClientBase {
+ public:
+ // A packet writer factory that always returns the same writer.
+ class DummyPacketWriterFactory : public QuicConnection::PacketWriterFactory {
+ public:
+ explicit DummyPacketWriterFactory(QuicPacketWriter* writer);
+ ~DummyPacketWriterFactory() override;
+
+ QuicPacketWriter* Create(QuicConnection* connection) const override;
+
+ private:
+ QuicPacketWriter* writer_;
+ };
+
+ QuicClientBase(const QuicServerId& server_id,
+ const QuicVersionVector& supported_versions,
+ const QuicConfig& config);
+
+ ~QuicClientBase();
+
+ // Initializes the client to create a connection. Should be called exactly
+ // once before calling StartConnect or Connect. Returns true if the
+ // initialization succeeds, false otherwise.
+ virtual bool Initialize();
+
+ // Returns true if the crypto handshake has yet to establish encryption.
+ // Returns false if encryption is active (even if the server hasn't confirmed
+ // the handshake) or if the connection has been closed.
+ bool EncryptionBeingEstablished();
+
+ // Returns a newly created QuicSpdyClientStream, owned by the
+ // QuicSimpleClient.
+ QuicSpdyClientStream* CreateReliableClientStream();
+
+ // Wait for events until the stream with the given ID is closed.
+ void WaitForStreamToClose(QuicStreamId id);
+
+ // Wait for events until the handshake is confirmed.
+ void WaitForCryptoHandshakeConfirmed();
+
+ // Wait up to 50ms, and handle any events which occur.
+ // Returns true if there are any outstanding requests.
+ virtual bool WaitForEvents() = 0;
+
+ QuicClientSession* session() { return session_.get(); }
+
+ bool connected() const;
+ bool goaway_received() const;
+
+ const QuicServerId& server_id() const { return server_id_; }
+
+ // This should only be set before the initial Connect()
+ void set_server_id(const QuicServerId& server_id) { server_id_ = server_id; }
+
+ void SetUserAgentID(const std::string& user_agent_id) {
+ crypto_config_.set_user_agent_id(user_agent_id);
+ }
+
+ // SetProofVerifier sets the ProofVerifier that will be used to verify the
+ // server's certificate and takes ownership of |verifier|.
+ void SetProofVerifier(ProofVerifier* verifier) {
+ // TODO(rtenneti): We should set ProofVerifier in QuicClientSession.
+ crypto_config_.SetProofVerifier(verifier);
+ }
+
+ // SetChannelIDSource sets a ChannelIDSource that will be called, when the
+ // server supports channel IDs, to obtain a channel ID for signing a message
+ // proving possession of the channel ID. This object takes ownership of
+ // |source|.
+ void SetChannelIDSource(ChannelIDSource* source) {
+ crypto_config_.SetChannelIDSource(source);
+ }
+
+ const QuicVersionVector& supported_versions() const {
+ return supported_versions_;
+ }
+
+ void SetSupportedVersions(const QuicVersionVector& versions) {
+ supported_versions_ = versions;
+ }
+
+ QuicConfig* config() { return &config_; }
+
+ QuicCryptoClientConfig* crypto_config() { return &crypto_config_; }
+
+ // Change the initial maximum packet size of the connection. Has to be called
+ // before Connect()/StartConnect() in order to have any effect.
+ void set_initial_max_packet_length(QuicByteCount initial_max_packet_length) {
+ initial_max_packet_length_ = initial_max_packet_length;
+ }
+
+ int num_stateless_rejects_received() const {
+ return num_stateless_rejects_received_;
+ }
+
+ // The number of client hellos sent, taking stateless rejects into
+ // account. In the case of a stateless reject, the initial
+ // connection object may be torn down and a new one created. The
+ // user cannot rely upon the latest connection object to get the
+ // total number of client hellos sent, and should use this function
+ // instead.
+ int GetNumSentClientHellos();
+
+ // Gather the stats for the last session and update the stats for the overall
+ // connection.
+ void UpdateStats();
+
+ // Returns any errors that occurred at the connection-level (as
+ // opposed to the session-level). When a stateless reject occurs,
+ // the error of the last session may not reflect the overall state
+ // of the connection.
+ QuicErrorCode connection_error() const;
+ void set_connection_error(QuicErrorCode connection_error) {
+ connection_error_ = connection_error;
+ }
+
+ bool connected_or_attempting_connect() const {
+ return connected_or_attempting_connect_;
+ }
+ void set_connected_or_attempting_connect(
+ bool connected_or_attempting_connect) {
+ connected_or_attempting_connect_ = connected_or_attempting_connect;
+ }
+
+ QuicPacketWriter* writer() { return writer_.get(); }
+ void set_writer(QuicPacketWriter* writer) {
+ if (writer_.get() != writer) {
+ writer_.reset(writer);
+ }
+ }
+ void reset_writer() { writer_.reset(); }
+
+ QuicByteCount initial_max_packet_length() {
+ return initial_max_packet_length_;
+ }
+
+ protected:
+ virtual QuicClientSession* CreateQuicClientSession(
+ QuicConnection* connection);
+
+ // Generates the next ConnectionId for |server_id_|. By default, if the
+ // cached server config contains a server-designated ID, that ID will be
+ // returned. Otherwise, the next random ID will be returned.
+ QuicConnectionId GetNextConnectionId();
+
+ // Returns the next server-designated ConnectionId from the cached config for
+ // |server_id_|, if it exists. Otherwise, returns 0.
+ QuicConnectionId GetNextServerDesignatedConnectionId();
+
+ // Generates a new, random connection ID (as opposed to a server-designated
+ // connection ID).
+ virtual QuicConnectionId GenerateNewConnectionId();
+
+ private:
+ // |server_id_| is a tuple (hostname, port, is_https) of the server.
+ QuicServerId server_id_;
+
+ // config_ and crypto_config_ contain configuration and cached state about
+ // servers.
+ QuicConfig config_;
+ QuicCryptoClientConfig crypto_config_;
+
+ // Writer used to actually send packets to the wire. Needs to outlive
+ // |session_|.
+ scoped_ptr<QuicPacketWriter> writer_;
+
+ // Session which manages streams.
+ scoped_ptr<QuicClientSession> session_;
+
+ // This vector contains QUIC versions which we currently support.
+ // This should be ordered such that the highest supported version is the first
+ // element, with subsequent elements in descending order (versions can be
+ // skipped as necessary). We will always pick supported_versions_[0] as the
+ // initial version to use.
+ QuicVersionVector supported_versions_;
+
+ // The initial value of maximum packet size of the connection. If set to
+ // zero, the default is used.
+ QuicByteCount initial_max_packet_length_;
+
+ // The number of stateless rejects received during the current/latest
+ // connection.
+ // TODO(jokulik): Consider some consistent naming scheme (or other) for member
+ // variables that are kept per-request, per-connection, and over the client's
+ // lifetime.
+ int num_stateless_rejects_received_;
+
+ // The number of hellos sent during the current/latest connection.
+ int num_sent_client_hellos_;
+
+ // Used to store any errors that occurred with the overall connection (as
+ // opposed to that associated with the last session object).
+ QuicErrorCode connection_error_;
+
+ // True when the client is attempting to connect or re-connect the session (in
+ // the case of a stateless reject). Set to false between a call to
+ // Disconnect() and the subsequent call to StartConnect(). When
+ // connected_or_attempting_connect_ is false, the session object corresponds
+ // to the previous client-level connection.
+ bool connected_or_attempting_connect_;
+
+ DISALLOW_COPY_AND_ASSIGN(QuicClientBase);
+};
+
+} // namespace tools
+} // namespace net
+
+#endif // NET_TOOLS_QUIC_QUIC_CLIENT_BASE_H_
« no previous file with comments | « net/tools/quic/quic_client.cc ('k') | net/tools/quic/quic_client_base.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698