| /*************************************************************************** | 
 |  *                                  _   _ ____  _ | 
 |  *  Project                     ___| | | |  _ \| | | 
 |  *                             / __| | | | |_) | | | 
 |  *                            | (__| |_| |  _ <| |___ | 
 |  *                             \___|\___/|_| \_\_____| | 
 |  * | 
 |  * Copyright (C) 1998 - 2022, 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 | 
 |  * are also available at https://curl.se/docs/copyright.html. | 
 |  * | 
 |  * You may opt to use, copy, modify, merge, publish, distribute and/or sell | 
 |  * copies of the Software, and permit persons to whom the Software is | 
 |  * furnished to do so, under the terms of the COPYING file. | 
 |  * | 
 |  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | 
 |  * KIND, either express or implied. | 
 |  * | 
 |  * SPDX-License-Identifier: curl | 
 |  * | 
 |  ***************************************************************************/ | 
 | #include "tool_setup.h" | 
 |  | 
 | #include "strcase.h" | 
 |  | 
 | #define ENABLE_CURLX_PRINTF | 
 | /* use our own printf() functions */ | 
 | #include "curlx.h" | 
 |  | 
 | #include "tool_cfgable.h" | 
 | #include "tool_msgs.h" | 
 | #include "tool_getparam.h" | 
 | #include "tool_helpers.h" | 
 |  | 
 | #include "memdebug.h" /* keep this as LAST include */ | 
 |  | 
 | /* | 
 | ** Helper functions that are used from more than one source file. | 
 | */ | 
 |  | 
 | const char *param2text(int res) | 
 | { | 
 |   ParameterError error = (ParameterError)res; | 
 |   switch(error) { | 
 |   case PARAM_GOT_EXTRA_PARAMETER: | 
 |     return "had unsupported trailing garbage"; | 
 |   case PARAM_OPTION_UNKNOWN: | 
 |     return "is unknown"; | 
 |   case PARAM_OPTION_AMBIGUOUS: | 
 |     return "is ambiguous"; | 
 |   case PARAM_REQUIRES_PARAMETER: | 
 |     return "requires parameter"; | 
 |   case PARAM_BAD_USE: | 
 |     return "is badly used here"; | 
 |   case PARAM_BAD_NUMERIC: | 
 |     return "expected a proper numerical parameter"; | 
 |   case PARAM_NEGATIVE_NUMERIC: | 
 |     return "expected a positive numerical parameter"; | 
 |   case PARAM_LIBCURL_DOESNT_SUPPORT: | 
 |     return "the installed libcurl version doesn't support this"; | 
 |   case PARAM_LIBCURL_UNSUPPORTED_PROTOCOL: | 
 |     return "a specified protocol is unsupported by libcurl"; | 
 |   case PARAM_NO_MEM: | 
 |     return "out of memory"; | 
 |   case PARAM_NO_PREFIX: | 
 |     return "the given option can't be reversed with a --no- prefix"; | 
 |   case PARAM_NUMBER_TOO_LARGE: | 
 |     return "too large number"; | 
 |   case PARAM_NO_NOT_BOOLEAN: | 
 |     return "used '--no-' for option that isn't a boolean"; | 
 |   case PARAM_CONTDISP_SHOW_HEADER: | 
 |     return "showing headers and --remote-header-name cannot be combined"; | 
 |   case PARAM_CONTDISP_RESUME_FROM: | 
 |     return "--continue-at and --remote-header-name cannot be combined"; | 
 |   case PARAM_READ_ERROR: | 
 |     return "error encountered when reading a file"; | 
 |   default: | 
 |     return "unknown error"; | 
 |   } | 
 | } | 
 |  | 
 | int SetHTTPrequest(struct OperationConfig *config, HttpReq req, HttpReq *store) | 
 | { | 
 |   /* this mirrors the HttpReq enum in tool_sdecls.h */ | 
 |   const char *reqname[]= { | 
 |     "", /* unspec */ | 
 |     "GET (-G, --get)", | 
 |     "HEAD (-I, --head)", | 
 |     "multipart formpost (-F, --form)", | 
 |     "POST (-d, --data)", | 
 |     "PUT (-T, --upload-file)" | 
 |   }; | 
 |  | 
 |   if((*store == HTTPREQ_UNSPEC) || | 
 |      (*store == req)) { | 
 |     *store = req; | 
 |     return 0; | 
 |   } | 
 |   warnf(config->global, "You can only select one HTTP request method! " | 
 |         "You asked for both %s and %s.\n", | 
 |         reqname[req], reqname[*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", | 
 |     "PUT" | 
 |   }; | 
 |  | 
 |   if(!method) | 
 |     ; | 
 |   else 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 with -X/--request may not work " | 
 |           "the way you want. Consider using -I/--head instead.\n"); | 
 |   } | 
 | } |