Simplify quic_client_bin.cc by factoring out the factory into a stand-alone file. gfe-relnote: n/a - Tools only PiperOrigin-RevId: 248790598 Change-Id: I237c6d9bd36f68f069f12354e019eb8e9695c5dc
diff --git a/quic/tools/quic_client_bin.cc b/quic/tools/quic_client_bin.cc index 8329ac6..06760ce 100644 --- a/quic/tools/quic_client_bin.cc +++ b/quic/tools/quic_client_bin.cc
@@ -40,71 +40,14 @@ // After submitting changes to this file, you will need to follow the // instructions at go/quic_client_binary_update -#include <netdb.h> -#include <sys/socket.h> -#include <sys/types.h> - #include <iostream> #include <memory> #include <string> -#include <vector> -#include "net/third_party/quiche/src/quic/core/quic_packets.h" -#include "net/third_party/quiche/src/quic/core/quic_server_id.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_socket_address.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" #include "net/third_party/quiche/src/quic/platform/api/quic_system_event_loop.h" -#include "net/third_party/quiche/src/quic/tools/quic_client.h" +#include "net/third_party/quiche/src/quic/tools/quic_epoll_client_factory.h" #include "net/third_party/quiche/src/quic/tools/quic_toy_client.h" -namespace { - -using quic::QuicSocketAddress; -using quic::QuicStringPiece; - -QuicSocketAddress LookupAddress(std::string host, std::string port) { - addrinfo hint; - memset(&hint, 0, sizeof(hint)); - hint.ai_protocol = IPPROTO_UDP; - - addrinfo* info_list = nullptr; - int result = getaddrinfo(host.c_str(), port.c_str(), &hint, &info_list); - if (result != 0) { - QUIC_LOG(ERROR) << "Failed to look up " << host << ": " - << gai_strerror(result); - return QuicSocketAddress(); - } - - CHECK(info_list != nullptr); - std::unique_ptr<addrinfo, void (*)(addrinfo*)> info_list_owned(info_list, - freeaddrinfo); - return QuicSocketAddress(*info_list->ai_addr); -} - -class QuicEpollClientFactory : public quic::QuicToyClient::ClientFactory { - public: - std::unique_ptr<quic::QuicSpdyClientBase> CreateClient( - std::string host, - uint16_t port, - quic::ParsedQuicVersionVector versions, - std::unique_ptr<quic::ProofVerifier> verifier) { - quic::QuicSocketAddress addr = LookupAddress(host, quic::QuicStrCat(port)); - if (!addr.IsInitialized()) { - QUIC_LOG(ERROR) << "Unable to resolve address: " << host; - return nullptr; - } - quic::QuicServerId server_id(host, port, false); - return quic::QuicMakeUnique<quic::QuicClient>( - addr, server_id, versions, &epoll_server_, std::move(verifier)); - } - - private: - quic::QuicEpollServer epoll_server_; -}; - -} // namespace - int main(int argc, char* argv[]) { QuicSystemEventLoop event_loop("quic_client"); const char* usage = "Usage: quic_client [options] <url>"; @@ -117,7 +60,7 @@ exit(0); } - QuicEpollClientFactory factory; + quic::QuicEpollClientFactory factory; quic::QuicToyClient client(&factory); return client.SendRequestsAndPrintResponses(urls); }
diff --git a/quic/tools/quic_epoll_client_factory.cc b/quic/tools/quic_epoll_client_factory.cc new file mode 100644 index 0000000..3b6b2ee --- /dev/null +++ b/quic/tools/quic_epoll_client_factory.cc
@@ -0,0 +1,55 @@ +// Copyright (c) 2019 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. + +#include "net/third_party/quiche/src/quic/tools/quic_epoll_client_factory.h" + +#include <netdb.h> +#include <sys/socket.h> +#include <sys/types.h> + +#include "net/third_party/quiche/src/quic/core/quic_server_id.h" +#include "net/third_party/quiche/src/quic/platform/api/quic_socket_address.h" +#include "net/third_party/quiche/src/quic/tools/quic_client.h" + +namespace quic { + +namespace { + +QuicSocketAddress LookupAddress(std::string host, std::string port) { + addrinfo hint; + memset(&hint, 0, sizeof(hint)); + hint.ai_protocol = IPPROTO_UDP; + + addrinfo* info_list = nullptr; + int result = getaddrinfo(host.c_str(), port.c_str(), &hint, &info_list); + if (result != 0) { + QUIC_LOG(ERROR) << "Failed to look up " << host << ": " + << gai_strerror(result); + return QuicSocketAddress(); + } + + CHECK(info_list != nullptr); + std::unique_ptr<addrinfo, void (*)(addrinfo*)> info_list_owned(info_list, + freeaddrinfo); + return QuicSocketAddress(*info_list->ai_addr); +} + +} // namespace + +std::unique_ptr<QuicSpdyClientBase> QuicEpollClientFactory::CreateClient( + std::string host, + uint16_t port, + ParsedQuicVersionVector versions, + std::unique_ptr<ProofVerifier> verifier) { + QuicSocketAddress addr = LookupAddress(host, QuicStrCat(port)); + if (!addr.IsInitialized()) { + QUIC_LOG(ERROR) << "Unable to resolve address: " << host; + return nullptr; + } + QuicServerId server_id(host, port, false); + return QuicMakeUnique<QuicClient>(addr, server_id, versions, &epoll_server_, + std::move(verifier)); +} + +} // namespace quic
diff --git a/quic/tools/quic_epoll_client_factory.h b/quic/tools/quic_epoll_client_factory.h new file mode 100644 index 0000000..a083643 --- /dev/null +++ b/quic/tools/quic_epoll_client_factory.h
@@ -0,0 +1,28 @@ +// Copyright (c) 2019 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. + +#ifndef QUICHE_QUIC_TOOLS_EPOLL_CLIENT_FACTORY_H_ +#define QUICHE_QUIC_TOOLS_EPOLL_CLIENT_FACTORY_H_ + +#include "net/third_party/quiche/src/quic/platform/api/quic_epoll.h" +#include "net/third_party/quiche/src/quic/tools/quic_toy_client.h" + +namespace quic { + +// Factory creating QuicClient instances. +class QuicEpollClientFactory : public QuicToyClient::ClientFactory { + public: + std::unique_ptr<QuicSpdyClientBase> CreateClient( + std::string host, + uint16_t port, + ParsedQuicVersionVector versions, + std::unique_ptr<ProofVerifier> verifier) override; + + private: + QuicEpollServer epoll_server_; +}; + +} // namespace quic + +#endif // QUICHE_QUIC_TOOLS_EPOLL_CLIENT_FACTORY_H_