diff --git a/docs/cmdline-opts/etag-compare.md b/docs/cmdline-opts/etag-compare.md
index d69cbdf34c..114806552b 100644
--- a/docs/cmdline-opts/etag-compare.md
+++ b/docs/cmdline-opts/etag-compare.md
@@ -25,3 +25,5 @@ line with the desired ETag. An empty file is parsed as an empty ETag.
Use the option --etag-save to first save the ETag from a response, and then
use this option to compare against the saved ETag in a subsequent request.
+
+Use this option with a single URL only.
diff --git a/docs/cmdline-opts/etag-save.md b/docs/cmdline-opts/etag-save.md
index aa346adad3..c81773b6e2 100644
--- a/docs/cmdline-opts/etag-save.md
+++ b/docs/cmdline-opts/etag-save.md
@@ -17,6 +17,6 @@ Example:
# `--etag-save`
Save an HTTP ETag to the specified file. An ETag is a caching related header,
-usually returned in a response.
+usually returned in a response. Use this option with a single URL only.
If no ETag is sent by the server, an empty file is created.
diff --git a/src/tool_cfgable.h b/src/tool_cfgable.h
index ae59a9bf67..62f0e58cc4 100644
--- a/src/tool_cfgable.h
+++ b/src/tool_cfgable.h
@@ -130,6 +130,7 @@ struct OperationConfig {
struct getout *url_get; /* point to the node to fill in URL */
struct getout *url_out; /* point to the node to fill in outfile */
struct getout *url_ul; /* point to the node to fill in upload */
+ size_t num_urls; /* number of URLs added to the list */
#ifndef CURL_DISABLE_IPFS
char *ipfs_gateway;
#endif /* !CURL_DISABLE_IPFS */
diff --git a/src/tool_getparam.c b/src/tool_getparam.c
index d352c80a52..63b328c189 100644
--- a/src/tool_getparam.c
+++ b/src/tool_getparam.c
@@ -1019,7 +1019,8 @@ const struct LongShort *findlongopt(const char *opt)
sizeof(aliases[0]), findarg);
}
-static ParameterError parse_url(struct OperationConfig *config,
+static ParameterError parse_url(struct GlobalConfig *global,
+ struct OperationConfig *config,
const char *nextarg)
{
ParameterError err = PARAM_OK;
@@ -1050,6 +1051,11 @@ static ParameterError parse_url(struct OperationConfig *config,
/* fill in the URL */
err = getstr(&url->url, nextarg, DENY_BLANK);
url->flags |= GETOUT_URL;
+ if((++config->num_urls > 1) && (config->etag_save_file ||
+ config->etag_compare_file)) {
+ errorf(global, "The etag options only work on a single URL");
+ return PARAM_BAD_USE;
+ }
}
return err;
}
@@ -1911,7 +1917,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
config->xattr = toggle;
break;
case C_URL: /* --url */
- err = parse_url(config, nextarg);
+ err = parse_url(global, config, nextarg);
break;
case C_FTP_SSL: /* --ftp-ssl */
case C_SSL: /* --ssl */
@@ -2549,10 +2555,20 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
config->socks5_auth &= ~CURLAUTH_GSSAPI;
break;
case C_ETAG_SAVE: /* --etag-save */
- err = getstr(&config->etag_save_file, nextarg, DENY_BLANK);
+ if(config->num_urls > 1) {
+ errorf(global, "The etag options only work on a single URL");
+ err = PARAM_BAD_USE;
+ }
+ else
+ err = getstr(&config->etag_save_file, nextarg, DENY_BLANK);
break;
case C_ETAG_COMPARE: /* --etag-compare */
- err = getstr(&config->etag_compare_file, nextarg, DENY_BLANK);
+ if(config->num_urls > 1) {
+ errorf(global, "The etag options only work on a single URL");
+ err = PARAM_BAD_USE;
+ }
+ else
+ err = getstr(&config->etag_compare_file, nextarg, DENY_BLANK);
break;
case C_CURVES: /* --curves */
err = getstr(&config->ssl_ec_curves, nextarg, DENY_BLANK);
diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
index bcdd965808..bd9a0bbaaf 100644
--- a/tests/data/Makefile.am
+++ b/tests/data/Makefile.am
@@ -78,7 +78,7 @@ test444 test445 test446 test447 test448 test449 test450 test451 test452 \
test453 test454 test455 test456 test457 test458 test459 test460 test461 \
test462 test463 test467 test468 test469 test470 test471 test472 test473 \
test474 test475 test476 test477 test478 test479 test480 test481 test482 \
-test483 \
+test483 test484 test485 \
test490 test491 test492 test493 test494 test495 test496 test497 test498 \
test499 test500 test501 test502 test503 test504 test505 test506 test507 \
test508 test509 test510 test511 test512 test513 test514 test515 test516 \
diff --git a/tests/data/test484 b/tests/data/test484
new file mode 100644
index 0000000000..4c5c4cc250
--- /dev/null
+++ b/tests/data/test484
@@ -0,0 +1,44 @@
+
+
+
+HTTP
+etags
+
+
+
+#
+# Server-side
+
+
+
+#
+# Client-side
+
+
+none
+
+
+Use --etag-compare and -save with more than one URL
+
+
+http://example.com/%TESTNUMBER --etag-compare %LOGDIR/etag%TESTNUMBER --etag-save %LOGDIR/etag%TESTNUMBER --url http://example.net/fooo
+
+
+
+#
+# Verify data after the test has been "shot"
+
+
+2
+
+
+curl: The etag options only work on a single URL
+curl: option --url: is badly used here
+%if manual
+curl: try 'curl --help' or 'curl --manual' for more information
+%else
+curl: try 'curl --help' for more information
+%endif
+
+
+
diff --git a/tests/data/test485 b/tests/data/test485
new file mode 100644
index 0000000000..a6405a61f8
--- /dev/null
+++ b/tests/data/test485
@@ -0,0 +1,44 @@
+
+
+
+HTTP
+etags
+
+
+
+#
+# Server-side
+
+
+
+#
+# Client-side
+
+
+none
+
+
+Use --etag-compare and -save with more than one URL, URLs specified first
+
+
+http://example.com/%TESTNUMBER http://example.net/fooo --etag-save %LOGDIR/etag%TESTNUMBER
+
+
+
+#
+# Verify data after the test has been "shot"
+
+
+2
+
+
+curl: The etag options only work on a single URL
+curl: option --etag-save: is badly used here
+%if manual
+curl: try 'curl --help' or 'curl --manual' for more information
+%else
+curl: try 'curl --help' for more information
+%endif
+
+
+