--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
This commit is contained in:
Daniel Stenberg 2017-06-21 23:35:08 +02:00
parent 8de8f4eb7e
commit 9b167fd090
20 changed files with 49 additions and 49 deletions

View File

@ -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

View File

@ -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 *".

View File

@ -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 *".

View File

@ -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

View File

@ -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), "

View File

@ -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), "

View File

@ -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);

View File

@ -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 \

View File

@ -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

View File

@ -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;

View File

@ -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)

View File

@ -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:
/*

View File

@ -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,

View File

@ -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);

View File

@ -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 */

View File

@ -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;

View File

@ -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",

View File

@ -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);

View File

@ -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>

View File

@ -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>