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

Unified Diff: net/tools/quic/quic_simple_client.cc

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: 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
Index: net/tools/quic/quic_simple_client.cc
diff --git a/net/tools/quic/quic_simple_client.cc b/net/tools/quic/quic_simple_client.cc
index 261086b6dcf692223962c22a6a7391f46399741d..d3d811aa935bed172ead5f86c817a533ef8736ad 100644
--- a/net/tools/quic/quic_simple_client.cc
+++ b/net/tools/quic/quic_simple_client.cc
@@ -13,7 +13,6 @@
#include "net/quic/crypto/quic_random.h"
#include "net/quic/quic_connection.h"
#include "net/quic/quic_connection_helper.h"
-#include "net/quic/quic_crypto_client_stream.h"
#include "net/quic/quic_default_packet_writer.h"
#include "net/quic/quic_flags.h"
#include "net/quic/quic_protocol.h"
@@ -37,12 +36,11 @@ void QuicSimpleClient::ClientQuicDataToResend::Resend() {
QuicSimpleClient::QuicSimpleClient(IPEndPoint server_address,
const QuicServerId& server_id,
const QuicVersionVector& supported_versions)
- : server_address_(server_address),
- server_id_(server_id),
+ : QuicClientBase(server_id, supported_versions, QuicConfig()),
+ server_address_(server_address),
local_port_(0),
helper_(CreateQuicConnectionHelper()),
initialized_(false),
- supported_versions_(supported_versions),
packet_reader_started_(false),
weak_factory_(this) {}
@@ -50,18 +48,11 @@ QuicSimpleClient::QuicSimpleClient(IPEndPoint server_address,
const QuicServerId& server_id,
const QuicVersionVector& supported_versions,
const QuicConfig& config)
- : server_address_(server_address),
- server_id_(server_id),
- config_(config),
+ : QuicClientBase(server_id, supported_versions, config),
+ server_address_(server_address),
local_port_(0),
helper_(CreateQuicConnectionHelper()),
initialized_(false),
- supported_versions_(supported_versions),
- initial_max_packet_length_(0),
- num_stateless_rejects_received_(0),
- num_sent_client_hellos_(0),
- connection_error_(QUIC_NO_ERROR),
- connected_or_attempting_connect_(false),
packet_reader_started_(false),
weak_factory_(this) {}
@@ -77,10 +68,7 @@ QuicSimpleClient::~QuicSimpleClient() {
bool QuicSimpleClient::Initialize() {
DCHECK(!initialized_);
- num_sent_client_hellos_ = 0;
- num_stateless_rejects_received_ = 0;
- connection_error_ = QUIC_NO_ERROR;
- connected_or_attempting_connect_ = false;
+ QuicClientBase::Initialize();
if (!CreateUDPSocket()) {
return false;
@@ -90,17 +78,6 @@ bool QuicSimpleClient::Initialize() {
return true;
}
-QuicSimpleClient::DummyPacketWriterFactory::DummyPacketWriterFactory(
- QuicPacketWriter* writer)
- : writer_(writer) {}
-
-QuicSimpleClient::DummyPacketWriterFactory::~DummyPacketWriterFactory() {}
-
-QuicPacketWriter* QuicSimpleClient::DummyPacketWriterFactory::Create(
- QuicConnection* /*connection*/) const {
- return writer_;
-}
-
QuicSimpleClient::QuicDataToResend::QuicDataToResend(HttpRequestInfo* headers,
StringPiece body,
bool fin)
@@ -193,8 +170,8 @@ bool QuicSimpleClient::Connect() {
}
STLDeleteElements(&data_to_resend_on_connect_);
}
- if (session_.get() != nullptr &&
- session_->error() != QUIC_CRYPTO_HANDSHAKE_STATELESS_REJECT) {
+ if (session() != nullptr &&
+ session()->error() != QUIC_CRYPTO_HANDSHAKE_STATELESS_REJECT) {
// We've successfully created a session but we're not connected, and there
// is no stateless reject to recover from. Give up trying.
break;
@@ -202,63 +179,44 @@ bool QuicSimpleClient::Connect() {
}
if (!connected() &&
GetNumSentClientHellos() > QuicCryptoClientStream::kMaxClientHellos &&
- session_ != nullptr &&
- session_->error() == QUIC_CRYPTO_HANDSHAKE_STATELESS_REJECT) {
+ session() != nullptr &&
+ session()->error() == QUIC_CRYPTO_HANDSHAKE_STATELESS_REJECT) {
// The overall connection failed due too many stateless rejects.
- connection_error_ = QUIC_CRYPTO_TOO_MANY_REJECTS;
+ set_connection_error(QUIC_CRYPTO_TOO_MANY_REJECTS);
}
- return session_->connection()->connected();
-}
-
-QuicClientSession* QuicSimpleClient::CreateQuicClientSession(
- const QuicConfig& config,
- QuicConnection* connection,
- const QuicServerId& server_id,
- QuicCryptoClientConfig* crypto_config) {
- return new QuicClientSession(config, connection, server_id_, &crypto_config_);
+ return session()->connection()->connected();
}
void QuicSimpleClient::StartConnect() {
DCHECK(initialized_);
DCHECK(!connected());
- writer_.reset(CreateQuicPacketWriter());
+ set_writer(CreateQuicPacketWriter());
- DummyPacketWriterFactory factory(writer_.get());
+ DummyPacketWriterFactory factory(writer());
- if (connected_or_attempting_connect_) {
+ if (connected_or_attempting_connect()) {
// Before we destroy the last session and create a new one, gather its stats
// and update the stats for the overall connection.
- num_sent_client_hellos_ += session_->GetNumSentClientHellos();
- if (session_->error() == QUIC_CRYPTO_HANDSHAKE_STATELESS_REJECT) {
+ UpdateStats();
+ if (session()->error() == QUIC_CRYPTO_HANDSHAKE_STATELESS_REJECT) {
// If the last error was due to a stateless reject, queue up the data to
// be resent on the next successful connection.
// TODO(jokulik): I'm a little bit concerned about ordering here. Maybe
// we should just maintain one queue?
- ++num_stateless_rejects_received_;
DCHECK(data_to_resend_on_connect_.empty());
data_to_resend_on_connect_.swap(data_sent_before_handshake_);
}
}
- session_.reset(CreateQuicClientSession(
- config_,
- new QuicConnection(GetNextConnectionId(), server_address_, helper_.get(),
- factory,
- /* owns_writer= */ false, Perspective::IS_CLIENT,
- server_id_.is_https(), supported_versions_),
- server_id_, &crypto_config_));
- if (initial_max_packet_length_ != 0) {
- session_->connection()->set_max_packet_length(initial_max_packet_length_);
- }
- session_->Initialize();
- session_->CryptoConnect();
- connected_or_attempting_connect_ = true;
-}
+ CreateQuicClientSession(new QuicConnection(
+ GetNextConnectionId(), server_address_, helper_.get(), factory,
+ /* owns_writer= */ false, Perspective::IS_CLIENT, server_id().is_https(),
+ supported_versions()));
-bool QuicSimpleClient::EncryptionBeingEstablished() {
- return !session_->IsEncryptionEstablished() &&
- session_->connection()->connected();
+ session()->Initialize();
+ session()->CryptoConnect();
+ set_connected_or_attempting_connect(true);
}
void QuicSimpleClient::Disconnect() {
@@ -270,14 +228,14 @@ void QuicSimpleClient::Disconnect() {
STLDeleteElements(&data_to_resend_on_connect_);
STLDeleteElements(&data_sent_before_handshake_);
- writer_.reset();
+ reset_writer();
packet_reader_.reset();
initialized_ = false;
}
void QuicSimpleClient::SendRequest(const HttpRequestInfo& headers,
- base::StringPiece body,
+ StringPiece body,
bool fin) {
QuicSpdyClientStream* stream = CreateReliableClientStream();
if (stream == nullptr) {
@@ -304,7 +262,7 @@ void QuicSimpleClient::SendRequest(const HttpRequestInfo& headers,
void QuicSimpleClient::MaybeAddQuicDataToResend(
QuicDataToResend* data_to_resend) {
DCHECK(FLAGS_enable_quic_stateless_reject_support);
- if (session_->IsCryptoHandshakeConfirmed()) {
+ if (session()->IsCryptoHandshakeConfirmed()) {
// The handshake is confirmed. No need to continue saving requests to
// resend.
STLDeleteElements(&data_sent_before_handshake_);
@@ -319,7 +277,7 @@ void QuicSimpleClient::MaybeAddQuicDataToResend(
void QuicSimpleClient::SendRequestAndWaitForResponse(
const HttpRequestInfo& request,
- base::StringPiece body,
+ StringPiece body,
bool fin) {
SendRequest(request, body, fin);
while (WaitForEvents()) {}
@@ -337,45 +295,21 @@ void QuicSimpleClient::SendRequestsAndWaitForResponse(
while (WaitForEvents()) {}
}
-QuicSpdyClientStream* QuicSimpleClient::CreateReliableClientStream() {
- if (!connected()) {
- return nullptr;
- }
-
- return session_->CreateOutgoingDynamicStream();
-}
-
-void QuicSimpleClient::WaitForStreamToClose(QuicStreamId id) {
- DCHECK(connected());
-
- while (connected() && !session_->IsClosedStream(id)) {
- WaitForEvents();
- }
-}
-
-void QuicSimpleClient::WaitForCryptoHandshakeConfirmed() {
- DCHECK(connected());
-
- while (connected() && !session_->IsCryptoHandshakeConfirmed()) {
- WaitForEvents();
- }
-}
-
bool QuicSimpleClient::WaitForEvents() {
DCHECK(connected());
base::RunLoop().RunUntilIdle();
- DCHECK(session_ != nullptr);
+ DCHECK(session() != nullptr);
if (!connected() &&
- session_->error() == QUIC_CRYPTO_HANDSHAKE_STATELESS_REJECT) {
+ session()->error() == QUIC_CRYPTO_HANDSHAKE_STATELESS_REJECT) {
DCHECK(FLAGS_enable_quic_stateless_reject_support);
DVLOG(1) << "Detected stateless reject while waiting for events. "
<< "Attempting to reconnect.";
Connect();
}
- return session_->num_active_requests() != 0;
+ return session()->num_active_requests() != 0;
}
bool QuicSimpleClient::MigrateSocket(const IPAddressNumber& new_host) {
@@ -388,14 +322,12 @@ bool QuicSimpleClient::MigrateSocket(const IPAddressNumber& new_host) {
return false;
}
- session_->connection()->SetSelfAddress(client_address_);
+ session()->connection()->SetSelfAddress(client_address_);
QuicPacketWriter* writer = CreateQuicPacketWriter();
DummyPacketWriterFactory factory(writer);
- if (writer_.get() != writer) {
- writer_.reset(writer);
- }
- session_->connection()->SetQuicPacketWriter(writer, false);
+ set_writer(writer);
+ session()->connection()->SetQuicPacketWriter(writer, false);
return true;
}
@@ -421,15 +353,6 @@ void QuicSimpleClient::OnClose(QuicDataStream* stream) {
}
}
-bool QuicSimpleClient::connected() const {
- return session_.get() && session_->connection() &&
- session_->connection()->connected();
-}
-
-bool QuicSimpleClient::goaway_received() const {
- return session_ != nullptr && session_->goaway_received();
-}
-
size_t QuicSimpleClient::latest_response_code() const {
LOG_IF(DFATAL, !store_response_) << "Response not stored!";
return latest_response_code_;
@@ -445,45 +368,6 @@ const string& QuicSimpleClient::latest_response_body() const {
return latest_response_body_;
}
-int QuicSimpleClient::GetNumSentClientHellos() {
- // If we are not actively attempting to connect, the session object
- // corresponds to the previous connection and should not be used.
- const int current_session_hellos = !connected_or_attempting_connect_
- ? 0
- : session_->GetNumSentClientHellos();
- return num_sent_client_hellos_ + current_session_hellos;
-}
-
-QuicErrorCode QuicSimpleClient::connection_error() const {
- // Return the high-level error if there was one. Otherwise, return the
- // connection error from the last session.
- if (connection_error_ != QUIC_NO_ERROR) {
- return connection_error_;
- }
- if (session_.get() == nullptr) {
- return QUIC_NO_ERROR;
- }
- return session_->error();
-}
-
-QuicConnectionId QuicSimpleClient::GetNextConnectionId() {
- QuicConnectionId server_designated_id = GetNextServerDesignatedConnectionId();
- return server_designated_id ? server_designated_id
- : GenerateNewConnectionId();
-}
-
-QuicConnectionId QuicSimpleClient::GetNextServerDesignatedConnectionId() {
- QuicCryptoClientConfig::CachedState* cached =
- crypto_config_.LookupOrCreate(server_id_);
- // If the cached state indicates that we should use a server-designated
- // connection ID, then return that connection ID.
- CHECK(cached != nullptr) << "QuicClientCryptoConfig::LookupOrCreate returned "
- << "unexpected nullptr.";
- return cached->has_server_designated_connection_id()
- ? cached->GetNextServerDesignatedConnectionId()
- : 0;
-}
-
QuicConnectionId QuicSimpleClient::GenerateNewConnectionId() {
return helper_->GetRandomGenerator()->RandUint64();
}
@@ -505,8 +389,9 @@ void QuicSimpleClient::OnReadError(int result) {
bool QuicSimpleClient::OnPacket(const QuicEncryptedPacket& packet,
IPEndPoint local_address,
IPEndPoint peer_address) {
- session_->connection()->ProcessUdpPacket(local_address, peer_address, packet);
- if (!session_->connection()->connected()) {
+ session()->connection()->ProcessUdpPacket(local_address, peer_address,
+ packet);
+ if (!session()->connection()->connected()) {
return false;
}

Powered by Google App Engine
This is Rietveld 408576698