From e37e4468688d8f6b9038a0d7085f8c0b2695d112 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Mon, 31 Aug 2020 09:45:09 +0200 Subject: [PATCH] mqtt: enable by default No longer considered experimental. Closes #5858 --- .travis.yml | 2 - CMakeLists.txt | 6 +- configure.ac | 7 +- docs/CURL-DISABLE.md | 4 + docs/EXPERIMENTAL.md | 1 - lib/curl_config.h.cmake | 4 +- lib/mqtt.c | 4 +- lib/mqtt.h | 2 +- lib/setopt.c | 190 ++++++++++++++++++++-------------------- lib/url.c | 2 +- lib/version.c | 2 +- 11 files changed, 113 insertions(+), 111 deletions(-) diff --git a/.travis.yml b/.travis.yml index dd9ab3dc7..503d1ced6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -80,8 +80,6 @@ jobs: - env: - T=normal C="--enable-ares" - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8" - - env: - - T=normal C="--enable-mqtt" - env: - T=normal C="--disable-proxy" - env: diff --git a/CMakeLists.txt b/CMakeLists.txt index f55894f11..d8d532751 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -190,8 +190,8 @@ option(CURL_DISABLE_SMTP "to disable SMTP" OFF) mark_as_advanced(CURL_DISABLE_SMTP) option(CURL_DISABLE_GOPHER "to disable Gopher" OFF) mark_as_advanced(CURL_DISABLE_GOPHER) -option(CURL_ENABLE_MQTT "to enable MQTT" OFF) -mark_as_advanced(CURL_ENABLE_MQTT) +option(CURL_DISABLE_MQTT "to disable MQTT" OFF) +mark_as_advanced(CURL_DISABLE_MQTT) if(HTTP_ONLY) set(CURL_DISABLE_FTP ON) @@ -1419,7 +1419,7 @@ _add_if("SCP" USE_LIBSSH2 OR USE_LIBSSH) _add_if("SFTP" USE_LIBSSH2 OR USE_LIBSSH) _add_if("RTSP" NOT CURL_DISABLE_RTSP) _add_if("RTMP" USE_LIBRTMP) -_add_if("MQTT" CURL_ENABLE_MQTT) +_add_if("MQTT" NOT CURL_DISABLE_MQTT) if(_items) list(SORT _items) endif() diff --git a/configure.ac b/configure.ac index b063070d5..433a5c22b 100755 --- a/configure.ac +++ b/configure.ac @@ -645,11 +645,10 @@ AC_HELP_STRING([--disable-mqtt],[Disable MQTT support]), [ case "$enableval" in no) AC_MSG_RESULT(no) + AC_DEFINE(CURL_DISABLE_MQTT, 1, [to disable MQTT]) + AC_SUBST(CURL_DISABLE_MQTT, [1]) ;; *) AC_MSG_RESULT(yes) - experimental="$experimental MQTT" - AC_DEFINE(CURL_ENABLE_MQTT, 1, [to enable MQTT]) - AC_SUBST(CURL_ENABLE_MQTT, [1]) ;; esac ], AC_MSG_RESULT(no) @@ -5082,7 +5081,7 @@ fi if test "x$CURL_DISABLE_GOPHER" != "x1"; then SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS GOPHER" fi -if test "x$CURL_ENABLE_MQTT" = "x1"; then +if test "x$CURL_DISABLE_MQTT" != "x1"; then SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS MQTT" fi if test "x$CURL_DISABLE_POP3" != "x1"; then diff --git a/docs/CURL-DISABLE.md b/docs/CURL-DISABLE.md index f90acda2c..a9e6acaf8 100644 --- a/docs/CURL-DISABLE.md +++ b/docs/CURL-DISABLE.md @@ -62,6 +62,10 @@ Disable the --libcurl option from the curl tool. Disable MIME support. +## CURL_DISABLE_MQTT + +Disable MQTT support. + ## CURL_DISABLE_NETRC Disable the netrc parser. diff --git a/docs/EXPERIMENTAL.md b/docs/EXPERIMENTAL.md index bca2bd910..6a014c3da 100644 --- a/docs/EXPERIMENTAL.md +++ b/docs/EXPERIMENTAL.md @@ -20,5 +20,4 @@ Experimental support in curl means: - HTTP/3 support and options - alt-svc support and options - - MQTT - CURLSSLOPT_NATIVE_CA (No configure option, feature built in when supported) diff --git a/lib/curl_config.h.cmake b/lib/curl_config.h.cmake index dd870789e..eca3734b0 100644 --- a/lib/curl_config.h.cmake +++ b/lib/curl_config.h.cmake @@ -63,8 +63,8 @@ /* to disable LDAPS */ #cmakedefine CURL_DISABLE_LDAPS 1 -/* to enable MQTT */ -#undef CURL_ENABLE_MQTT +/* to disable MQTT */ +#cmakedefine CURL_DISABLE_MQTT 1 /* to disable POP3 */ #cmakedefine CURL_DISABLE_POP3 1 diff --git a/lib/mqtt.c b/lib/mqtt.c index f6f441614..486066fb6 100644 --- a/lib/mqtt.c +++ b/lib/mqtt.c @@ -23,7 +23,7 @@ #include "curl_setup.h" -#ifdef CURL_ENABLE_MQTT +#ifndef CURL_DISABLE_MQTT #include "urldata.h" #include @@ -625,4 +625,4 @@ static CURLcode mqtt_doing(struct connectdata *conn, bool *done) return result; } -#endif /* CURL_ENABLE_MQTT */ +#endif /* CURL_DISABLE_MQTT */ diff --git a/lib/mqtt.h b/lib/mqtt.h index 37463d58a..37c044135 100644 --- a/lib/mqtt.h +++ b/lib/mqtt.h @@ -22,7 +22,7 @@ * ***************************************************************************/ -#ifdef CURL_ENABLE_MQTT +#ifndef CURL_DISABLE_MQTT extern const struct Curl_handler Curl_handler_mqtt; #endif diff --git a/lib/setopt.c b/lib/setopt.c index ef6c7cb9a..c44470e91 100644 --- a/lib/setopt.c +++ b/lib/setopt.c @@ -434,100 +434,8 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param) #endif break; -#ifndef CURL_DISABLE_HTTP - case CURLOPT_AUTOREFERER: - /* - * Switch on automatic referer that gets set if curl follows locations. - */ - data->set.http_auto_referer = (0 != va_arg(param, long)) ? TRUE : FALSE; - break; - - case CURLOPT_ACCEPT_ENCODING: - /* - * String to use at the value of Accept-Encoding header. - * - * If the encoding is set to "" we use an Accept-Encoding header that - * encompasses all the encodings we support. - * If the encoding is set to NULL we don't send an Accept-Encoding header - * and ignore an received Content-Encoding header. - * - */ - argptr = va_arg(param, char *); - if(argptr && !*argptr) { - argptr = Curl_all_content_encodings(); - if(!argptr) - result = CURLE_OUT_OF_MEMORY; - else { - result = Curl_setstropt(&data->set.str[STRING_ENCODING], argptr); - free(argptr); - } - } - else - result = Curl_setstropt(&data->set.str[STRING_ENCODING], argptr); - break; - - case CURLOPT_TRANSFER_ENCODING: - data->set.http_transfer_encoding = (0 != va_arg(param, long)) ? - TRUE : FALSE; - break; - - case CURLOPT_FOLLOWLOCATION: - /* - * Follow Location: header hints on a HTTP-server. - */ - data->set.http_follow_location = (0 != va_arg(param, long)) ? TRUE : FALSE; - break; - - case CURLOPT_UNRESTRICTED_AUTH: - /* - * Send authentication (user+password) when following locations, even when - * hostname changed. - */ - data->set.allow_auth_to_other_hosts = - (0 != va_arg(param, long)) ? TRUE : FALSE; - break; - - case CURLOPT_MAXREDIRS: - /* - * The maximum amount of hops you allow curl to follow Location: - * headers. This should mostly be used to detect never-ending loops. - */ - arg = va_arg(param, long); - if(arg < -1) - return CURLE_BAD_FUNCTION_ARGUMENT; - data->set.maxredirs = arg; - break; - - case CURLOPT_POSTREDIR: - /* - * Set the behaviour of POST when redirecting - * CURL_REDIR_GET_ALL - POST is changed to GET after 301 and 302 - * CURL_REDIR_POST_301 - POST is kept as POST after 301 - * CURL_REDIR_POST_302 - POST is kept as POST after 302 - * CURL_REDIR_POST_303 - POST is kept as POST after 303 - * CURL_REDIR_POST_ALL - POST is kept as POST after 301, 302 and 303 - * other - POST is kept as POST after 301 and 302 - */ - arg = va_arg(param, long); - if(arg < CURL_REDIR_GET_ALL) - /* no return error on too high numbers since the bitmask could be - extended in a future */ - return CURLE_BAD_FUNCTION_ARGUMENT; - data->set.keep_post = arg & CURL_REDIR_POST_ALL; - break; - - case CURLOPT_POST: - /* Does this option serve a purpose anymore? Yes it does, when - CURLOPT_POSTFIELDS isn't used and the POST data is read off the - callback! */ - if(va_arg(param, long)) { - data->set.method = HTTPREQ_POST; - data->set.opt_no_body = FALSE; /* this is implied */ - } - else - data->set.method = HTTPREQ_GET; - break; - + /* MQTT "borrows" some of the HTTP options */ +#if !defined(CURL_DISABLE_HTTP) || !defined(CURL_DISABLE_MQTT) case CURLOPT_COPYPOSTFIELDS: /* * A string with POST data. Makes curl HTTP POST. Even if it is NULL. @@ -622,6 +530,100 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param) data->set.postfieldsize = bigsize; break; +#endif +#ifndef CURL_DISABLE_HTTP + case CURLOPT_AUTOREFERER: + /* + * Switch on automatic referer that gets set if curl follows locations. + */ + data->set.http_auto_referer = (0 != va_arg(param, long)) ? TRUE : FALSE; + break; + + case CURLOPT_ACCEPT_ENCODING: + /* + * String to use at the value of Accept-Encoding header. + * + * If the encoding is set to "" we use an Accept-Encoding header that + * encompasses all the encodings we support. + * If the encoding is set to NULL we don't send an Accept-Encoding header + * and ignore an received Content-Encoding header. + * + */ + argptr = va_arg(param, char *); + if(argptr && !*argptr) { + argptr = Curl_all_content_encodings(); + if(!argptr) + result = CURLE_OUT_OF_MEMORY; + else { + result = Curl_setstropt(&data->set.str[STRING_ENCODING], argptr); + free(argptr); + } + } + else + result = Curl_setstropt(&data->set.str[STRING_ENCODING], argptr); + break; + + case CURLOPT_TRANSFER_ENCODING: + data->set.http_transfer_encoding = (0 != va_arg(param, long)) ? + TRUE : FALSE; + break; + + case CURLOPT_FOLLOWLOCATION: + /* + * Follow Location: header hints on a HTTP-server. + */ + data->set.http_follow_location = (0 != va_arg(param, long)) ? TRUE : FALSE; + break; + + case CURLOPT_UNRESTRICTED_AUTH: + /* + * Send authentication (user+password) when following locations, even when + * hostname changed. + */ + data->set.allow_auth_to_other_hosts = + (0 != va_arg(param, long)) ? TRUE : FALSE; + break; + + case CURLOPT_MAXREDIRS: + /* + * The maximum amount of hops you allow curl to follow Location: + * headers. This should mostly be used to detect never-ending loops. + */ + arg = va_arg(param, long); + if(arg < -1) + return CURLE_BAD_FUNCTION_ARGUMENT; + data->set.maxredirs = arg; + break; + + case CURLOPT_POSTREDIR: + /* + * Set the behaviour of POST when redirecting + * CURL_REDIR_GET_ALL - POST is changed to GET after 301 and 302 + * CURL_REDIR_POST_301 - POST is kept as POST after 301 + * CURL_REDIR_POST_302 - POST is kept as POST after 302 + * CURL_REDIR_POST_303 - POST is kept as POST after 303 + * CURL_REDIR_POST_ALL - POST is kept as POST after 301, 302 and 303 + * other - POST is kept as POST after 301 and 302 + */ + arg = va_arg(param, long); + if(arg < CURL_REDIR_GET_ALL) + /* no return error on too high numbers since the bitmask could be + extended in a future */ + return CURLE_BAD_FUNCTION_ARGUMENT; + data->set.keep_post = arg & CURL_REDIR_POST_ALL; + break; + + case CURLOPT_POST: + /* Does this option serve a purpose anymore? Yes it does, when + CURLOPT_POSTFIELDS isn't used and the POST data is read off the + callback! */ + if(va_arg(param, long)) { + data->set.method = HTTPREQ_POST; + data->set.opt_no_body = FALSE; /* this is implied */ + } + else + data->set.method = HTTPREQ_GET; + break; case CURLOPT_HTTPPOST: /* diff --git a/lib/url.c b/lib/url.c index 2f879a61c..689682c53 100644 --- a/lib/url.c +++ b/lib/url.c @@ -227,7 +227,7 @@ static const struct Curl_handler * const protocols[] = { &Curl_handler_rtsp, #endif -#ifdef CURL_ENABLE_MQTT +#ifndef CURL_DISABLE_MQTT &Curl_handler_mqtt, #endif diff --git a/lib/version.c b/lib/version.c index 0abcb0dec..0d68b2c4a 100644 --- a/lib/version.c +++ b/lib/version.c @@ -298,7 +298,7 @@ static const char * const protocols[] = { "ldaps", #endif #endif -#ifdef CURL_ENABLE_MQTT +#ifndef CURL_DISABLE_MQTT "mqtt", #endif #ifndef CURL_DISABLE_POP3