summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2017-06-21 23:35:08 +0200
committerDaniel Stenberg <daniel@haxx.se>2017-06-21 23:39:10 +0200
commit9b167fd090f596eac828817d48c247eeae53407f (patch)
treed89ba04374722be9ca36d633a82e07616abbe0f6
parent8de8f4eb7e7c276eb2b2a2f7888c88d0779bed39 (diff)
downloadcurl-9b167fd090f596eac828817d48c247eeae53407f.tar.gz
--request-target: instead of --strip-path-slash
... and CURLOPT_REQUEST_TARGET instead of CURLOPT_STRIP_PATH_SLASH. This option instead provides the full "alternative" target to use in the request, instead of extracting the path from the URL. Test 1298 and 1299 updated accordingly. Idea-by: Evert Pot Suggestion: https://daniel.haxx.se/blog/2017/06/19/options-with-curl/comment-page-1/#comment-18373 Closes #1593
-rw-r--r--docs/cmdline-opts/Makefile.inc2
-rw-r--r--docs/cmdline-opts/request-target.d8
-rw-r--r--docs/cmdline-opts/strip-path-slash.d7
-rw-r--r--docs/libcurl/curl_easy_setopt.34
-rw-r--r--docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.32
-rw-r--r--docs/libcurl/opts/CURLOPT_NOBODY.32
-rw-r--r--docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3 (renamed from docs/libcurl/opts/CURLOPT_STRIP_PATH_SLASH.3)14
-rw-r--r--docs/libcurl/opts/Makefile.inc2
-rw-r--r--docs/libcurl/symbols-in-versions2
-rw-r--r--include/curl/curl.h4
-rw-r--r--lib/http.c4
-rw-r--r--lib/url.c6
-rw-r--r--lib/urldata.h2
-rw-r--r--src/tool_cfgable.c4
-rw-r--r--src/tool_cfgable.h2
-rw-r--r--src/tool_getparam.c6
-rw-r--r--src/tool_help.c12
-rw-r--r--src/tool_operate.c3
-rw-r--r--tests/data/test12986
-rw-r--r--tests/data/test12996
20 files changed, 49 insertions, 49 deletions
diff --git a/docs/cmdline-opts/Makefile.inc b/docs/cmdline-opts/Makefile.inc
index edc86fe1a..70d089035 100644
--- a/docs/cmdline-opts/Makefile.inc
+++ b/docs/cmdline-opts/Makefile.inc
@@ -42,6 +42,6 @@ DPAGES = abstract-unix-socket.d anyauth.d append.d basic.d cacert.d capath.d cer
tlsauthtype.d tlspassword.d tlsuser.d tlsv1.0.d tlsv1.1.d tlsv1.2.d \
tlsv1.3.d tlsv1.d trace-ascii.d trace.d trace-time.d tr-encoding.d \
unix-socket.d upload-file.d url.d use-ascii.d user-agent.d user.d \
- verbose.d version.d write-out.d xattr.d strip-path-slash.d
+ verbose.d version.d write-out.d xattr.d request-target.d
OTHERPAGES = page-footer page-header
diff --git a/docs/cmdline-opts/request-target.d b/docs/cmdline-opts/request-target.d
new file mode 100644
index 000000000..630f8b3b4
--- /dev/null
+++ b/docs/cmdline-opts/request-target.d
@@ -0,0 +1,8 @@
+Long: request-target
+Help: Specify the target for this request
+Protocols: HTTP
+---
+Tells curl to use an alternative "target" (path) instead of using the path as
+provided in the URL. Particularly useful when wanting to issue HTTP requests
+without leading slash or other data that doesn't follow the regular URL
+pattern, like "OPTIONS *".
diff --git a/docs/cmdline-opts/strip-path-slash.d b/docs/cmdline-opts/strip-path-slash.d
deleted file mode 100644
index 4aee947dd..000000000
--- a/docs/cmdline-opts/strip-path-slash.d
+++ /dev/null
@@ -1,7 +0,0 @@
-Long: strip-path-slash
-Help: Strip off the first slash of the path
-Protocols: HTTP
----
-Tells curl to strip the leading slash from the path when it sends the path to
-the server. Useful when wanting to issue HTTP requests without leading slash,
-like "OPTIONS *".
diff --git a/docs/libcurl/curl_easy_setopt.3 b/docs/libcurl/curl_easy_setopt.3
index 70e1ee8fd..bf3a0f268 100644
--- a/docs/libcurl/curl_easy_setopt.3
+++ b/docs/libcurl/curl_easy_setopt.3
@@ -303,8 +303,8 @@ Start a new cookie session. See \fICURLOPT_COOKIESESSION(3)\fP
Add or control cookies. See \fICURLOPT_COOKIELIST(3)\fP
.IP CURLOPT_HTTPGET
Do a HTTP GET request. See \fICURLOPT_HTTPGET(3)\fP
-.IP CURLOPT_STRIP_PATH_SLASH
-Cut off the leading slash from the path. \fICURLOPT_STRIP_PATH_SLASH(3)\fP
+.IP CURLOPT_REQUEST_TARGET
+Set the request target. \fICURLOPT_REQUEST_TARGET(3)\fP
.IP CURLOPT_HTTP_VERSION
HTTP version to use. \fICURLOPT_HTTP_VERSION(3)\fP
.IP CURLOPT_IGNORE_CONTENT_LENGTH
diff --git a/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3 b/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3
index e53504491..33cce250b 100644
--- a/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3
+++ b/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3
@@ -108,4 +108,4 @@ Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
CURLE_OUT_OF_MEMORY if there was insufficient heap space.
.SH "SEE ALSO"
.BR CURLOPT_HTTPHEADER "(3), " CURLOPT_NOBODY "(3), "
-.BR CURLOPT_STRIP_PATH_SLASH "(3), "
+.BR CURLOPT_REQUEST_TARGET "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_NOBODY.3 b/docs/libcurl/opts/CURLOPT_NOBODY.3
index d0116a9ed..02590b212 100644
--- a/docs/libcurl/opts/CURLOPT_NOBODY.3
+++ b/docs/libcurl/opts/CURLOPT_NOBODY.3
@@ -57,4 +57,4 @@ Always
Returns CURLE_OK
.SH "SEE ALSO"
.BR CURLOPT_HTTPGET "(3), " CURLOPT_POST "(3), "
-.BR CURLOPT_STRIP_PATH_SLASH "(3), "
+.BR CURLOPT_REQUEST_TARGET "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_STRIP_PATH_SLASH.3 b/docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3
index 5d0886782..eabefaa2d 100644
--- a/docs/libcurl/opts/CURLOPT_STRIP_PATH_SLASH.3
+++ b/docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3
@@ -20,18 +20,18 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_STRIP_PATH_SLASH 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_REQUEST_TARGET 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
.SH NAME
-CURLOPT_STRIP_PATH_SLASH \- strip the leading slash from the path
+CURLOPT_REQUEST_TARGET \- specify an alternative target for this request
.SH SYNOPSIS
#include <curl/curl.h>
-CURLcode curl_easy_setopt(CURL *handle, CURLOPT_STRIP_PATH_SLASH, value);
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_REQUEST_TARGET, string);
.SH DESCRIPTION
-Pass a long set to 1 to tell libcurl to strip out the leading slash from the
-path when used on the server.
+Pass a char * to string which libcurl uses in the upcoming request instead of
+the path as extracted from the URL.
.SH DEFAULT
-0 - use the leading slash.
+NULL
.SH PROTOCOLS
HTTP
.SH EXAMPLE
@@ -42,7 +42,7 @@ if(curl) {
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "OPTIONS");
/* issue an OPTIONS * request (no leading slash) */
- curl_easy_setopt(curl, CURLOPT_STRIP_PATH_SLASH, 1L);
+ curl_easy_setopt(curl, CURLOPT_REQUEST_TARGET, "*");
/* Perform the request */
curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/Makefile.inc b/docs/libcurl/opts/Makefile.inc
index 40930dc5d..c094604d9 100644
--- a/docs/libcurl/opts/Makefile.inc
+++ b/docs/libcurl/opts/Makefile.inc
@@ -231,6 +231,7 @@ man_MANS = \
CURLOPT_READFUNCTION.3 \
CURLOPT_REDIR_PROTOCOLS.3 \
CURLOPT_REFERER.3 \
+ CURLOPT_REQUEST_TARGET.3 \
CURLOPT_RESOLVE.3 \
CURLOPT_RESUME_FROM.3 \
CURLOPT_RESUME_FROM_LARGE.3 \
@@ -278,7 +279,6 @@ man_MANS = \
CURLOPT_STREAM_DEPENDS.3 \
CURLOPT_STREAM_DEPENDS_E.3 \
CURLOPT_STREAM_WEIGHT.3 \
- CURLOPT_STRIP_PATH_SLASH.3 \
CURLOPT_SUPPRESS_CONNECT_HEADERS.3 \
CURLOPT_TCP_FASTOPEN.3 \
CURLOPT_TCP_KEEPALIVE.3 \
diff --git a/docs/libcurl/symbols-in-versions b/docs/libcurl/symbols-in-versions
index c9a53cb1c..b1a671cd1 100644
--- a/docs/libcurl/symbols-in-versions
+++ b/docs/libcurl/symbols-in-versions
@@ -409,7 +409,6 @@ CURLOPT_HTTPPOST 7.1
CURLOPT_HTTPPROXYTUNNEL 7.3
CURLOPT_HTTPREQUEST 7.1 - 7.15.5
CURLOPT_HTTP_CONTENT_DECODING 7.16.2
-CURLOPT_STRIP_PATH_SLASH 7.55.0
CURLOPT_HTTP_TRANSFER_DECODING 7.16.2
CURLOPT_HTTP_VERSION 7.9.1
CURLOPT_IGNORE_CONTENT_LENGTH 7.14.1
@@ -509,6 +508,7 @@ CURLOPT_READDATA 7.9.7
CURLOPT_READFUNCTION 7.1
CURLOPT_REDIR_PROTOCOLS 7.19.4
CURLOPT_REFERER 7.1
+CURLOPT_REQUEST_TARGET 7.55.0
CURLOPT_RESOLVE 7.21.3
CURLOPT_RESUME_FROM 7.1
CURLOPT_RESUME_FROM_LARGE 7.11.0
diff --git a/include/curl/curl.h b/include/curl/curl.h
index 521aa5e78..0b741e82d 100644
--- a/include/curl/curl.h
+++ b/include/curl/curl.h
@@ -1780,8 +1780,8 @@ typedef enum {
/* Suppress proxy CONNECT response headers from user callbacks */
CINIT(SUPPRESS_CONNECT_HEADERS, LONG, 265),
- /* Strip the initial slash from the path taken from the URL */
- CINIT(STRIP_PATH_SLASH, LONG, 266),
+ /* The request target, instead of extracted from the URL */
+ CINIT(REQUEST_TARGET, STRINGPOINT, 266),
CURLOPT_LASTENTRY /* the last unused */
} CURLoption;
diff --git a/lib/http.c b/lib/http.c
index 2d04705ba..b8f4c8a21 100644
--- a/lib/http.c
+++ b/lib/http.c
@@ -2269,8 +2269,8 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
if(result)
return result;
- if(data->set.strip_path_slash)
- ppath++;
+ if(data->set.str[STRING_TARGET])
+ ppath = data->set.str[STRING_TARGET];
/* url */
if(paste_ftp_userpwd)
diff --git a/lib/url.c b/lib/url.c
index 23b243f83..3b3143ab8 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -829,9 +829,9 @@ CURLcode Curl_setopt(struct Curl_easy *data, CURLoption option,
then this can be changed to HEAD later on) */
data->set.httpreq = HTTPREQ_GET;
break;
- case CURLOPT_STRIP_PATH_SLASH:
- arg = va_arg(param, long);
- data->set.strip_path_slash = (bool)arg;
+ case CURLOPT_REQUEST_TARGET:
+ result = setstropt(&data->set.str[STRING_TARGET],
+ va_arg(param, char *));
break;
case CURLOPT_FILETIME:
/*
diff --git a/lib/urldata.h b/lib/urldata.h
index 9310abc17..8c4a029fe 100644
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@ -1588,7 +1588,7 @@ enum dupstring {
#ifdef USE_UNIX_SOCKETS
STRING_UNIX_SOCKET_PATH, /* path to Unix socket, if used */
#endif
-
+ STRING_TARGET, /* CURLOPT_REQUEST_TARGET */
/* -- end of zero-terminated strings -- */
STRING_LASTZEROTERMINATED,
diff --git a/src/tool_cfgable.c b/src/tool_cfgable.c
index f00a0d1e7..675e88b45 100644
--- a/src/tool_cfgable.c
+++ b/src/tool_cfgable.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -123,7 +123,7 @@ static void free_config_fields(struct OperationConfig *config)
Curl_safefree(config->pubkey);
Curl_safefree(config->hostpubmd5);
Curl_safefree(config->engine);
-
+ Curl_safefree(config->request_target);
Curl_safefree(config->customrequest);
Curl_safefree(config->krblevel);
diff --git a/src/tool_cfgable.h b/src/tool_cfgable.h
index f6536e8e4..8b6e0cfa7 100644
--- a/src/tool_cfgable.h
+++ b/src/tool_cfgable.h
@@ -139,12 +139,12 @@ struct OperationConfig {
bool crlf;
char *customrequest;
char *krblevel;
+ char *request_target;
long httpversion;
bool nobuffer;
bool readbusy; /* set when reading input returns EAGAIN */
bool globoff;
bool use_httpget;
- bool strip_path_slash;
bool insecure_ok; /* set TRUE to allow insecure SSL connects */
bool proxy_insecure_ok; /* set TRUE to allow insecure SSL connects
for proxy */
diff --git a/src/tool_getparam.c b/src/tool_getparam.c
index 642bba832..6cb394139 100644
--- a/src/tool_getparam.c
+++ b/src/tool_getparam.c
@@ -257,7 +257,7 @@ static const struct LongShort aliases[]= {
{"Fs", "form-string", ARG_STRING},
{"g", "globoff", ARG_BOOL},
{"G", "get", ARG_NONE},
- {"Ga", "strip-path-slash", ARG_BOOL},
+ {"Ga", "request-target", ARG_STRING},
{"h", "help", ARG_BOOL},
{"H", "header", ARG_STRING},
{"Hp", "proxy-header", ARG_STRING},
@@ -1592,8 +1592,8 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
break;
case 'G': /* HTTP GET */
- if(subletter == 'a') { /* --strip-path-slash */
- config->strip_path_slash = TRUE;
+ if(subletter == 'a') { /* --request-target */
+ GetStr(&config->request_target, nextarg);
}
else
config->use_httpget = TRUE;
diff --git a/src/tool_help.c b/src/tool_help.c
index 6d36e550f..2acc994d5 100644
--- a/src/tool_help.c
+++ b/src/tool_help.c
@@ -160,8 +160,8 @@ static const struct helptxt helptext[] = {
"Disable URL sequences and ranges using {} and []"},
{"-I, --head",
"Show document info only"},
- {"-H, --header <header>",
- "Pass custom header LINE to server"},
+ {"-H, --header <header/@file>",
+ "Pass custom header(s) to server"},
{"-h, --help",
"This help text"},
{" --hostpubmd5 <md5>",
@@ -298,8 +298,8 @@ static const struct helptxt helptext[] = {
"Set a CRL list for proxy"},
{" --proxy-digest",
"Use Digest authentication on the proxy"},
- {" --proxy-header <header>",
- "Pass custom header LINE to proxy"},
+ {" --proxy-header <header/@file>",
+ "Pass custom header(s) to proxy"},
{" --proxy-insecure",
"Do HTTPS proxy connections without verifying the proxy"},
{" --proxy-key <key>",
@@ -352,6 +352,8 @@ static const struct helptxt helptext[] = {
"Set the remote file's time on the local output"},
{"-X, --request <command>",
"Specify request command to use"},
+ {" --request-target",
+ "Specify the target for this request"},
{" --resolve <host:port:address>",
"Resolve the host+port to this address"},
{" --retry <num>",
@@ -400,8 +402,6 @@ static const struct helptxt helptext[] = {
"Use SSLv3"},
{" --stderr",
"Where to redirect stderr"},
- {" --strip-path-slash",
- "Strip off the first slash of the path"},
{" --suppress-connect-headers",
"Suppress proxy CONNECT response headers"},
{" --tcp-fastopen",
diff --git a/src/tool_operate.c b/src/tool_operate.c
index 51a9aa9f6..147081438 100644
--- a/src/tool_operate.c
+++ b/src/tool_operate.c
@@ -972,8 +972,7 @@ static CURLcode operate_do(struct GlobalConfig *global,
#endif /* !CURL_DISABLE_PROXY */
my_setopt(curl, CURLOPT_FAILONERROR, config->failonerror?1L:0L);
- my_setopt(curl, CURLOPT_STRIP_PATH_SLASH,
- config->strip_path_slash?1L:0L);
+ my_setopt(curl, CURLOPT_REQUEST_TARGET, config->request_target);
my_setopt(curl, CURLOPT_UPLOAD, uploadfile?1L:0L);
my_setopt(curl, CURLOPT_DIRLISTONLY, config->dirlistonly?1L:0L);
my_setopt(curl, CURLOPT_APPEND, config->ftp_append?1L:0L);
diff --git a/tests/data/test1298 b/tests/data/test1298
index c9c8b383a..061a4e1e0 100644
--- a/tests/data/test1298
+++ b/tests/data/test1298
@@ -3,7 +3,7 @@
<keywords>
HTTP
HTTP GET
---strip-path-slash
+--request-target
</keywords>
</info>
@@ -32,10 +32,10 @@ Funny-head: yesyes
http
</server>
<name>
-HTTP GET special path with --strip-path-slash
+HTTP GET special path with --request-target
</name>
<command>
---strip-path-slash "http://%HOSTIP:%HTTPPORT/XXX" -H "Testno: 1298"
+--request-target "XXX" "http://%HOSTIP:%HTTPPORT/" -H "Testno: 1298"
</command>
</client>
diff --git a/tests/data/test1299 b/tests/data/test1299
index 51bb71248..5ed92da5c 100644
--- a/tests/data/test1299
+++ b/tests/data/test1299
@@ -2,7 +2,7 @@
<info>
<keywords>
HTTP
---strip-path-slash
+--request-target
</keywords>
</info>
@@ -31,10 +31,10 @@ Funny-head: yesyes
http
</server>
<name>
-Send "OPTIONS *" with --strip-path-slash
+Send "OPTIONS *" with --request-target
</name>
<command>
---strip-path-slash -X OPTIONS http://%HOSTIP:%HTTPPORT/* -H "Testno: 1299"
+--request-target "*" -X OPTIONS http://%HOSTIP:%HTTPPORT/ -H "Testno: 1299"
</command>
</client>