summaryrefslogtreecommitdiff
path: root/multinetwork/httpurl.cpp
diff options
context:
space:
mode:
authorLorenzo Colitti <lorenzo@google.com>2020-11-05 19:44:46 +0900
committerLorenzo Colitti <lorenzo@google.com>2020-11-27 19:31:17 +0900
commitfa48d72548365c09b42853660d208cf1924f721c (patch)
treee294526e145293940d20fafad0df0fae57deb243 /multinetwork/httpurl.cpp
parentdacfcca550b5d72ffb08a6d1f0ac30fda8243aaf (diff)
downloadextras-fa48d72548365c09b42853660d208cf1924f721c.tar.gz
Support random destinations/multiple tests in dnschk and httpurl.
This adds two parameters to the dnschk and httpurl utilities that can be used for network testing: --randomname: connects to a random one-time DNS name. --attempts: repeats the requested operation N times. Also reformat the code per clang-format's suggestions. Test: manual Change-Id: Iab9966c489f8fa692eb9f7974ba25281ddf80b06
Diffstat (limited to 'multinetwork/httpurl.cpp')
-rw-r--r--multinetwork/httpurl.cpp38
1 files changed, 28 insertions, 10 deletions
diff --git a/multinetwork/httpurl.cpp b/multinetwork/httpurl.cpp
index d78c0c93..a562ae2c 100644
--- a/multinetwork/httpurl.cpp
+++ b/multinetwork/httpurl.cpp
@@ -29,7 +29,7 @@
#include <android-base/stringprintf.h>
#include "common.h"
-
+using android::base::StringPrintf;
struct Parameters {
Parameters() : ss({}), port("80"), path("/") {}
@@ -41,10 +41,18 @@ struct Parameters {
std::string path;
};
+bool resolveHostname(const struct Arguments& args, struct Parameters* parameters);
bool parseUrl(const struct Arguments& args, struct Parameters* parameters) {
if (parameters == nullptr) { return false; }
+ if (args.random_name) {
+ parameters->host = StringPrintf("%d-%d-ipv6test.ds.metric.gstatic.com", rand(), rand());
+ parameters->hostname = parameters->host;
+ parameters->path = "/ip.js?fmt=text";
+ return resolveHostname(args, parameters);
+ }
+
static const char HTTP_PREFIX[] = "http://";
if (strncmp(args.arg1, HTTP_PREFIX, strlen(HTTP_PREFIX)) != 0) {
std::cerr << "Only " << HTTP_PREFIX << " URLs supported." << std::endl;
@@ -91,6 +99,10 @@ bool parseUrl(const struct Arguments& args, struct Parameters* parameters) {
// TODO: find the request portion to send (before '#...').
+ return resolveHostname(args, parameters);
+}
+
+bool resolveHostname(const struct Arguments& args, struct Parameters* parameters) {
std::cerr << "Resolving hostname=" << parameters->hostname
<< ", port=" << parameters->port
<< std::endl;
@@ -136,7 +148,6 @@ bool parseUrl(const struct Arguments& args, struct Parameters* parameters) {
return true;
}
-
int makeTcpSocket(sa_family_t address_family, net_handle_t nethandle) {
int fd = socket(address_family, SOCK_STREAM, IPPROTO_TCP);
if (fd < 0) {
@@ -233,13 +244,20 @@ int main(int argc, const char* argv[]) {
struct Parameters parameters;
if (!parseUrl(args, &parameters)) { return -1; }
- // TODO: Fall back from IPv6 to IPv4 if ss.ss_family is AF_UNSPEC.
- // This will involve changes to parseUrl() as well.
- struct FdAutoCloser closer = makeTcpSocket(
- parameters.ss.ss_family,
- (args.api_mode == ApiMode::EXPLICIT) ? args.nethandle
- : NETWORK_UNSPECIFIED);
- if (closer.fd < 0) { return closer.fd; }
+ int ret = 0;
+
+ for (int i = 0; i < args.attempts; i++) {
+ // TODO: Fall back from IPv6 to IPv4 if ss.ss_family is AF_UNSPEC.
+ // This will involve changes to parseUrl() as well.
+ struct FdAutoCloser closer = makeTcpSocket(
+ parameters.ss.ss_family,
+ (args.api_mode == ApiMode::EXPLICIT) ? args.nethandle : NETWORK_UNSPECIFIED);
+ if (closer.fd < 0) {
+ return closer.fd;
+ }
+
+ ret |= doHttpQuery(closer.fd, parameters);
+ }
- return doHttpQuery(closer.fd, parameters);
+ return ret;
}