diff options
author | Lorenzo Colitti <lorenzo@google.com> | 2020-11-05 19:44:46 +0900 |
---|---|---|
committer | Lorenzo Colitti <lorenzo@google.com> | 2020-11-27 19:31:17 +0900 |
commit | fa48d72548365c09b42853660d208cf1924f721c (patch) | |
tree | e294526e145293940d20fafad0df0fae57deb243 /multinetwork/httpurl.cpp | |
parent | dacfcca550b5d72ffb08a6d1f0ac30fda8243aaf (diff) | |
download | extras-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.cpp | 38 |
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, ¶meters)) { 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; } |