]> granicus.if.org Git - curl/commitdiff
--request-target: instead of --strip-path-slash
authorDaniel Stenberg <daniel@haxx.se>
Wed, 21 Jun 2017 21:35:08 +0000 (23:35 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Wed, 21 Jun 2017 21:39:10 +0000 (23:39 +0200)
... 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

20 files changed:
docs/cmdline-opts/Makefile.inc
docs/cmdline-opts/request-target.d [new file with mode: 0644]
docs/cmdline-opts/strip-path-slash.d [deleted file]
docs/libcurl/curl_easy_setopt.3
docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3
docs/libcurl/opts/CURLOPT_NOBODY.3
docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3 [moved from docs/libcurl/opts/CURLOPT_STRIP_PATH_SLASH.3 with 80% similarity]
docs/libcurl/opts/Makefile.inc
docs/libcurl/symbols-in-versions
include/curl/curl.h
lib/http.c
lib/url.c
lib/urldata.h
src/tool_cfgable.c
src/tool_cfgable.h
src/tool_getparam.c
src/tool_help.c
src/tool_operate.c
tests/data/test1298
tests/data/test1299

index edc86fe1a1a938a9d15b6a36fee28c55376e3f00..70d0890353c6f63ba5e3352e986804c6be9980c6 100644 (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
diff --git a/docs/cmdline-opts/request-target.d b/docs/cmdline-opts/request-target.d
new file mode 100644 (file)
index 0000000..630f8b3
--- /dev/null
@@ -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 (file)
index 4aee947..0000000
+++ /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 *".
index 70e1ee8fd55edbbdd76053615fa1ef6acf52d162..bf3a0f268ad3198f0ce435789bf1eb4512c73037 100644 (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
index e53504491b7fe9089b1b30c9314016c48995f458..33cce250b7dde4ad94b42d50fd6d71f1eb35d3e1 100644 (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), "
index d0116a9ed803c1d28d48ba99d224aca8d31591fc..02590b21230d81ed6771147d44ced48f7634bd1e 100644 (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), "
similarity index 80%
rename from docs/libcurl/opts/CURLOPT_STRIP_PATH_SLASH.3
rename to docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3
index 5d08867823194005de311148bc3645e6d876fb73..eabefaa2dfb01e0c28befb7f0f9ed3949af63a1f 100644 (file)
 .\" *
 .\" **************************************************************************
 .\"
-.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);
index 40930dc5d28e3d075eab42831c41e9a6a41f4503..c094604d9d2846ec87a92259ace2ed008b22aba4 100644 (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                       \
index c9a53cb1c28adced83cc231bdc1419c1f180ce82..b1a671cd1eab9fb16a457e9ac8e1b43466c41d45 100644 (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
index 521aa5e7838e15aa7f1e1ede0ceabc88cacd2150..0b741e82d2a37b2a954fd778838747ee6a04a4f6 100644 (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;
index 2d04705baa20635c5526a52e1929f64d5a82f7c7..b8f4c8a21e9cbe86d5e8fff1371935110068abf6 100644 (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)
index 23b243f8381393286019cdcd0f0d78822ea2f04b..3b3143ab8a9d0f175b02e442a9b07ca533dfbe95 100644 (file)
--- 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:
     /*
index 9310abc17f171e08e2988d54c123b54b5a2dab11..8c4a029fe66b039ebfb295ae91cdebf04121eae3 100644 (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,
index f00a0d1e7f1865612c8a84a315f85a9942aa106a..675e88b45618e6c7c59565e074b2295e0ff010ad 100644 (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);
 
index f6536e8e494be6c3d3cd2ae427aa324c2997564f..8b6e0cfa7f21274f0a4f10326754f05fec5d1a4b 100644 (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 */
index 642bba832b765257cc3c72ba9f7a12e3a43d4877..6cb394139d42b9a3949833bd218fb5e748081da1 100644 (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;
index 6d36e550fdf12183fcecbfcd24a321720b309247..2acc994d54749dfda9b94ff30f2d9bd057f27a21 100644 (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",
index 51a9aa9f64819d0c8fbae548c8b7f3b2f43b07e0..147081438d45cef6f0fbf7047a357d3a337b6982 100644 (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);
index c9c8b383ac0a86ef3f113515ee24ce35eee72ea1..061a4e1e004c78cf2a3b6a98bb114f6d6850b601 100644 (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>
 
index 51bb712485d122a38fff2d7f0c896be5dadc6fe8..5ed92da5ca1ee0ae79a3edf0f145a3b7a0f39e55 100644 (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>