From 481e0de00a9003b9c5220b120e3fc302d9b0932d Mon Sep 17 00:00:00 2001
From: Daniel Stenberg <daniel@haxx.se>
Date: Sat, 29 Aug 2015 23:56:28 +0200
Subject: [PATCH] curl: point out unnecessary uses of -X in verbose mode

It uses 'Note:' as a prefix as opposed to the common 'Warning:' to take
down the tone a bit.

It adds a warning for using -XHEAD on other methods becasue that may
lead to a hanging connection.
---
 src/tool_helpers.c | 23 +++++++++++++++++++++
 src/tool_helpers.h |  5 ++++-
 src/tool_msgs.c    | 51 ++++++++++++++++++++++++++++++++--------------
 src/tool_msgs.h    |  1 +
 src/tool_operate.c |  1 +
 5 files changed, 65 insertions(+), 16 deletions(-)

diff --git a/src/tool_helpers.c b/src/tool_helpers.c
index 2f74dc1334..f17d09f509 100644
--- a/src/tool_helpers.c
+++ b/src/tool_helpers.c
@@ -89,3 +89,26 @@ int SetHTTPrequest(struct OperationConfig *config, HttpReq req, HttpReq *store)
 
   return 1;
 }
+
+void customrequest_helper(struct OperationConfig *config, HttpReq req,
+                          char *method)
+{
+  /* this mirrors the HttpReq enum in tool_sdecls.h */
+  const char *dflt[]= {
+    "GET",
+    "GET",
+    "HEAD",
+    "POST",
+    "POST"
+  };
+
+  if(curl_strequal(method, dflt[req])) {
+    notef(config->global, "Unnecessary use of -X or --request, %s is already "
+          "inferred.\n", dflt[req]);
+  }
+  else if(curl_strequal(method, "head")) {
+    warnf(config->global,
+          "Setting custom HTTP method to HEAD may not work the way you "
+          "want.\n");
+  }
+}
diff --git a/src/tool_helpers.h b/src/tool_helpers.h
index 73bcfc771f..117334cbc4 100644
--- a/src/tool_helpers.h
+++ b/src/tool_helpers.h
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2015, 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
@@ -28,5 +28,8 @@ const char *param2text(int res);
 int SetHTTPrequest(struct OperationConfig *config, HttpReq req,
                    HttpReq *store);
 
+void customrequest_helper(struct OperationConfig *config, HttpReq req,
+                          char *method);
+
 #endif /* HEADER_CURL_TOOL_HELPERS_H */
 
diff --git a/src/tool_msgs.c b/src/tool_msgs.c
index 38de977aa6..565e283813 100644
--- a/src/tool_msgs.c
+++ b/src/tool_msgs.c
@@ -31,31 +31,27 @@
 #include "memdebug.h" /* keep this as LAST include */
 
 #define WARN_PREFIX "Warning: "
-#define WARN_TEXTWIDTH (79 - (int)strlen(WARN_PREFIX))
+#define NOTE_PREFIX "Note: "
 
-/*
- * Emit warning formatted message on configured 'errors' stream unless
- * mute (--silent) was selected.
- */
-
-void warnf(struct GlobalConfig *config, const char *fmt, ...)
+static void voutf(struct GlobalConfig *config,
+                  const char *prefix,
+                  const char *fmt,
+                  va_list ap)
 {
+  size_t width = (79 - (int)strlen(prefix));
   if(!config->mute) {
-    va_list ap;
-    int len;
+    size_t len;
     char *ptr;
     char print_buffer[256];
 
-    va_start(ap, fmt);
     len = vsnprintf(print_buffer, sizeof(print_buffer), fmt, ap);
-    va_end(ap);
 
     ptr = print_buffer;
     while(len > 0) {
-      fputs(WARN_PREFIX, config->errors);
+      fputs(prefix, config->errors);
 
-      if(len > (int)WARN_TEXTWIDTH) {
-        int cut = WARN_TEXTWIDTH-1;
+      if(len > width) {
+        size_t cut = width-1;
 
         while(!ISSPACE(ptr[cut]) && cut) {
           cut--;
@@ -63,7 +59,7 @@ void warnf(struct GlobalConfig *config, const char *fmt, ...)
         if(0 == cut)
           /* not a single cutting position was found, just cut it at the
              max text width then! */
-          cut = WARN_TEXTWIDTH-1;
+          cut = width-1;
 
         (void)fwrite(ptr, cut + 1, 1, config->errors);
         fputs("\n", config->errors);
@@ -78,6 +74,31 @@ void warnf(struct GlobalConfig *config, const char *fmt, ...)
   }
 }
 
+/*
+ * Emit 'note' formatted message on configured 'errors' stream, if verbose was
+ * selected.
+ */
+void notef(struct GlobalConfig *config, const char *fmt, ...)
+{
+  va_list ap;
+  va_start(ap, fmt);
+  if(config->tracetype)
+    voutf(config, NOTE_PREFIX, fmt, ap);
+  va_end(ap);
+}
+
+/*
+ * Emit warning formatted message on configured 'errors' stream unless
+ * mute (--silent) was selected.
+ */
+
+void warnf(struct GlobalConfig *config, const char *fmt, ...)
+{
+  va_list ap;
+  va_start(ap, fmt);
+  voutf(config, WARN_PREFIX, fmt, ap);
+  va_end(ap);
+}
 /*
  * Emit help formatted message on given stream.
  */
diff --git a/src/tool_msgs.h b/src/tool_msgs.h
index bf97bfba73..e8ad259c51 100644
--- a/src/tool_msgs.h
+++ b/src/tool_msgs.h
@@ -24,6 +24,7 @@
 #include "tool_setup.h"
 
 void warnf(struct GlobalConfig *config, const char *fmt, ...);
+void notef(struct GlobalConfig *config, const char *fmt, ...);
 
 void helpf(FILE *errors, const char *fmt, ...);
 
diff --git a/src/tool_operate.c b/src/tool_operate.c
index b3fa14644d..38d355da58 100644
--- a/src/tool_operate.c
+++ b/src/tool_operate.c
@@ -1108,6 +1108,7 @@ static CURLcode operate_do(struct GlobalConfig *global,
         my_setopt_enum(curl, CURLOPT_TIMECONDITION, (long)config->timecond);
         my_setopt(curl, CURLOPT_TIMEVALUE, (long)config->condtime);
         my_setopt_str(curl, CURLOPT_CUSTOMREQUEST, config->customrequest);
+        customrequest_helper(config, config->httpreq, config->customrequest);
         my_setopt(curl, CURLOPT_STDERR, global->errors);
 
         /* three new ones in libcurl 7.3: */
-- 
GitLab