... 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
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
--- /dev/null
+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 *".
+++ /dev/null
-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 *".
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
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), "
Returns CURLE_OK
.SH "SEE ALSO"
.BR CURLOPT_HTTPGET "(3), " CURLOPT_POST "(3), "
-.BR CURLOPT_STRIP_PATH_SLASH "(3), "
+.BR CURLOPT_REQUEST_TARGET "(3), "
.\" *
.\" **************************************************************************
.\"
-.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
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);
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 \
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 \
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
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
/* 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;
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)
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:
/*
#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,
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * 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
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);
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 */
{"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},
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;
"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>",
"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>",
"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>",
"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",
#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);
<keywords>
HTTP
HTTP GET
---strip-path-slash
+--request-target
</keywords>
</info>
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>
<info>
<keywords>
HTTP
---strip-path-slash
+--request-target
</keywords>
</info>
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>