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 similarity index 80% rename from docs/libcurl/opts/CURLOPT_STRIP_PATH_SLASH.3 rename to 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 -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, , et al. + * Copyright (C) 1998 - 2017, Daniel Stenberg, , 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
", - "Pass custom header LINE to server"}, + {"-H, --header
", + "Pass custom header(s) to server"}, {"-h, --help", "This help text"}, {" --hostpubmd5 ", @@ -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
", - "Pass custom header LINE to proxy"}, + {" --proxy-header
", + "Pass custom header(s) to proxy"}, {" --proxy-insecure", "Do HTTPS proxy connections without verifying the proxy"}, {" --proxy-key ", @@ -352,6 +352,8 @@ static const struct helptxt helptext[] = { "Set the remote file's time on the local output"}, {"-X, --request ", "Specify request command to use"}, + {" --request-target", + "Specify the target for this request"}, {" --resolve ", "Resolve the host+port to this address"}, {" --retry ", @@ -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 @@ HTTP HTTP GET ---strip-path-slash +--request-target @@ -32,10 +32,10 @@ Funny-head: yesyes http -HTTP GET special path with --strip-path-slash +HTTP GET special path with --request-target ---strip-path-slash "http://%HOSTIP:%HTTPPORT/XXX" -H "Testno: 1298" +--request-target "XXX" "http://%HOSTIP:%HTTPPORT/" -H "Testno: 1298" 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 @@ HTTP ---strip-path-slash +--request-target @@ -31,10 +31,10 @@ Funny-head: yesyes http -Send "OPTIONS *" with --strip-path-slash +Send "OPTIONS *" with --request-target ---strip-path-slash -X OPTIONS http://%HOSTIP:%HTTPPORT/* -H "Testno: 1299" +--request-target "*" -X OPTIONS http://%HOSTIP:%HTTPPORT/ -H "Testno: 1299"