mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-29 05:36:39 +00:00
Add command `WebQuery <url> GET|POST|PUT|PATCH [<headers>] <body>
`
Add command ``WebQuery <url> GET|POST|PUT|PATCH [<headers>] <body>`` to extent HTTP requests (#13209)
This commit is contained in:
parent
883a9fb12c
commit
7c71c3bdd8
@ -14,6 +14,7 @@ All notable changes to this project will be documented in this file.
|
|||||||
- Berry support for Serial
|
- Berry support for Serial
|
||||||
- Support for Sensirion SCD40/SCD41 CO2 sensor (#13139)
|
- Support for Sensirion SCD40/SCD41 CO2 sensor (#13139)
|
||||||
- Support for BL0939 energy monitor as used in ESP32 based Sonoff Dual R3 V2 Pow (#13195)
|
- Support for BL0939 energy monitor as used in ESP32 based Sonoff Dual R3 V2 Pow (#13195)
|
||||||
|
- Command ``WebQuery <url> GET|POST|PUT|PATCH [<headers>] <body>`` to extent HTTP requests (#13209)
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
- M5 Stack Core2 uses UNIVERSAL_DISPLAY with enabled LVGL as default now
|
- M5 Stack Core2 uses UNIVERSAL_DISPLAY with enabled LVGL as default now
|
||||||
|
@ -107,6 +107,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo
|
|||||||
- Command ``SetSensor1..127 0|1`` to globally disable individual sensor driver
|
- Command ``SetSensor1..127 0|1`` to globally disable individual sensor driver
|
||||||
- Command ``Subscribe2 ...`` to subscribe to a MQTT topic without appended "/#" [#12858](https://github.com/arendst/Tasmota/issues/12858)
|
- Command ``Subscribe2 ...`` to subscribe to a MQTT topic without appended "/#" [#12858](https://github.com/arendst/Tasmota/issues/12858)
|
||||||
- Command ``WebGetConfig <url>`` if ``#define USE_WEBGETCONFIG`` is enabled to restore/init configuration from external webserver [#13034](https://github.com/arendst/Tasmota/issues/13034)
|
- Command ``WebGetConfig <url>`` if ``#define USE_WEBGETCONFIG`` is enabled to restore/init configuration from external webserver [#13034](https://github.com/arendst/Tasmota/issues/13034)
|
||||||
|
- Command ``WebQuery <url> GET|POST|PUT|PATCH [<headers>] <body>`` to extent HTTP requests [#13209](https://github.com/arendst/Tasmota/issues/13209)
|
||||||
- Optional IP filter to command ``TCPStart`` [#12806](https://github.com/arendst/Tasmota/issues/12806)
|
- Optional IP filter to command ``TCPStart`` [#12806](https://github.com/arendst/Tasmota/issues/12806)
|
||||||
- Neopool commands ``NPPHRes``, ``NPCLRes`` and ``NPIonRes`` [#12813](https://github.com/arendst/Tasmota/issues/12813)
|
- Neopool commands ``NPPHRes``, ``NPCLRes`` and ``NPIonRes`` [#12813](https://github.com/arendst/Tasmota/issues/12813)
|
||||||
- Support for second DNS server
|
- Support for second DNS server
|
||||||
|
@ -415,6 +415,7 @@
|
|||||||
#define D_CMND_WEBLOG "WebLog"
|
#define D_CMND_WEBLOG "WebLog"
|
||||||
#define D_CMND_WEBREFRESH "WebRefresh"
|
#define D_CMND_WEBREFRESH "WebRefresh"
|
||||||
#define D_CMND_WEBSEND "WebSend"
|
#define D_CMND_WEBSEND "WebSend"
|
||||||
|
#define D_CMND_WEBQUERY "WebQuery"
|
||||||
#define D_CMND_WEBCOLOR "WebColor"
|
#define D_CMND_WEBCOLOR "WebColor"
|
||||||
#define D_CMND_WEBBUTTON "WebButton"
|
#define D_CMND_WEBBUTTON "WebButton"
|
||||||
#define D_CMND_WEBSENSOR "WebSensor"
|
#define D_CMND_WEBSENSOR "WebSensor"
|
||||||
|
@ -3098,14 +3098,67 @@ int WebSend(char *buffer)
|
|||||||
}
|
}
|
||||||
url += F("cmnd="); // url = |http://192.168.178.86/cm?cmnd=| or |http://192.168.178.86/cm?user=admin&password=joker&cmnd=|
|
url += F("cmnd="); // url = |http://192.168.178.86/cm?cmnd=| or |http://192.168.178.86/cm?user=admin&password=joker&cmnd=|
|
||||||
}
|
}
|
||||||
url += command; // url = |http://192.168.178.86/cm?cmnd=POWER1 ON|
|
url += UrlEncode(command); // url = |http://192.168.178.86/cm?cmnd=POWER1%20ON|
|
||||||
|
url += F(" GET"); // url = |http://192.168.178.86/cm?cmnd=POWER1%20ON GET|
|
||||||
|
|
||||||
DEBUG_CORE_LOG(PSTR("WEB: Uri |%s|"), url.c_str());
|
DEBUG_CORE_LOG(PSTR("WEB: Uri '%s'"), url.c_str());
|
||||||
|
status = WebQuery(const_cast<char*>(url.c_str()));
|
||||||
|
}
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
int WebQuery(char *buffer)
|
||||||
|
{
|
||||||
|
// http://192.168.1.1/path GET -> Sends HTTP GET http://192.168.1.1/path
|
||||||
|
// http://192.168.1.1/path POST {"some":"message"} -> Sends HTTP POST to http://192.168.1.1/path with body {"some":"message"}
|
||||||
|
// http://192.168.1.1/path PUT [Autorization: Bearer abcdxyz] potato -> Sends HTTP PUT to http://192.168.1.1/path with authorization header and body "potato"
|
||||||
|
// http://192.168.1.1/path PATCH patchInfo -> Sends HTTP PATCH to http://192.168.1.1/path with body "potato"
|
||||||
|
|
||||||
|
// Valid HTTP Commands: GET, POST, PUT, and PATCH
|
||||||
|
// An unlimited number of headers can be sent per request, and a body can be sent for all command types
|
||||||
|
// The body will be ignored if sending a GET command
|
||||||
|
|
||||||
|
WiFiClient http_client;
|
||||||
|
HTTPClient http;
|
||||||
|
|
||||||
|
int status = WEBCMND_WRONG_PARAMETERS;
|
||||||
|
|
||||||
|
char *temp;
|
||||||
|
char *url = strtok_r(buffer, " ", &temp);
|
||||||
|
char *method = strtok_r(temp, " ", &temp);
|
||||||
|
|
||||||
|
if (url && method) {
|
||||||
|
if (http.begin(http_client, UrlEncode(url))) {
|
||||||
|
char empty_body[1] = { 0 };
|
||||||
|
char *body = empty_body;
|
||||||
|
if (temp) { // There is a body and/or header
|
||||||
|
if (temp[0] == '[') { // Header information was sent; decode it
|
||||||
|
temp += 1;
|
||||||
|
temp = strtok_r(temp, "]", &body);
|
||||||
|
bool headerFound = true;
|
||||||
|
while (headerFound) {
|
||||||
|
char *header = strtok_r(temp, ":", &temp);
|
||||||
|
if (header) {
|
||||||
|
char *headerBody = strtok_r(temp, "|", &temp);
|
||||||
|
if (headerBody) {
|
||||||
|
http.addHeader(header, headerBody);
|
||||||
|
}
|
||||||
|
else headerFound = false;
|
||||||
|
}
|
||||||
|
else headerFound = false;
|
||||||
|
}
|
||||||
|
} else { // No header information was sent, but there was a body
|
||||||
|
body = temp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int http_code;
|
||||||
|
if (0 == strcasecmp_P(method, PSTR("GET"))) { http_code = http.GET(); }
|
||||||
|
else if (0 == strcasecmp_P(method, PSTR("POST"))) { http_code = http.POST(body); }
|
||||||
|
else if (0 == strcasecmp_P(method, PSTR("PUT"))) { http_code = http.PUT(body); }
|
||||||
|
else if (0 == strcasecmp_P(method, PSTR("PATCH"))) { http_code = http.PATCH(body); }
|
||||||
|
else return status;
|
||||||
|
|
||||||
WiFiClient http_client;
|
|
||||||
HTTPClient http;
|
|
||||||
if (http.begin(http_client, UrlEncode(url))) { // UrlEncode(url) = |http://192.168.178.86/cm?cmnd=POWER1%20ON|
|
|
||||||
int http_code = http.GET(); // Start connection and send HTTP header
|
|
||||||
if (http_code > 0) { // http_code will be negative on error
|
if (http_code > 0) { // http_code will be negative on error
|
||||||
if (http_code == HTTP_CODE_OK || http_code == HTTP_CODE_MOVED_PERMANENTLY) {
|
if (http_code == HTTP_CODE_OK || http_code == HTTP_CODE_MOVED_PERMANENTLY) {
|
||||||
#ifdef USE_WEBSEND_RESPONSE
|
#ifdef USE_WEBSEND_RESPONSE
|
||||||
@ -3125,7 +3178,7 @@ int WebSend(char *buffer)
|
|||||||
// recursive call must be possible in this case
|
// recursive call must be possible in this case
|
||||||
tasm_cmd_activ = 0;
|
tasm_cmd_activ = 0;
|
||||||
#endif // USE_SCRIPT
|
#endif // USE_SCRIPT
|
||||||
MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR(D_CMND_WEBSEND));
|
MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR(D_CMND_WEBQUERY));
|
||||||
#endif // USE_WEBSEND_RESPONSE
|
#endif // USE_WEBSEND_RESPONSE
|
||||||
}
|
}
|
||||||
status = WEBCMND_DONE;
|
status = WEBCMND_DONE;
|
||||||
@ -3240,8 +3293,8 @@ const char kWebCommands[] PROGMEM = "|" // No prefix
|
|||||||
#if defined(USE_SENDMAIL) || defined(USE_ESP32MAIL)
|
#if defined(USE_SENDMAIL) || defined(USE_ESP32MAIL)
|
||||||
D_CMND_SENDMAIL "|"
|
D_CMND_SENDMAIL "|"
|
||||||
#endif
|
#endif
|
||||||
D_CMND_WEBSERVER "|" D_CMND_WEBPASSWORD "|" D_CMND_WEBLOG "|" D_CMND_WEBREFRESH "|" D_CMND_WEBSEND "|" D_CMND_WEBCOLOR "|"
|
D_CMND_WEBSERVER "|" D_CMND_WEBPASSWORD "|" D_CMND_WEBLOG "|" D_CMND_WEBREFRESH "|" D_CMND_WEBSEND "|" D_CMND_WEBQUERY "|"
|
||||||
D_CMND_WEBSENSOR "|" D_CMND_WEBBUTTON
|
D_CMND_WEBCOLOR "|" D_CMND_WEBSENSOR "|" D_CMND_WEBBUTTON
|
||||||
#ifdef USE_WEBGETCONFIG
|
#ifdef USE_WEBGETCONFIG
|
||||||
"|" D_CMND_WEBGETCONFIG
|
"|" D_CMND_WEBGETCONFIG
|
||||||
#endif
|
#endif
|
||||||
@ -3257,8 +3310,8 @@ void (* const WebCommand[])(void) PROGMEM = {
|
|||||||
#if defined(USE_SENDMAIL) || defined(USE_ESP32MAIL)
|
#if defined(USE_SENDMAIL) || defined(USE_ESP32MAIL)
|
||||||
&CmndSendmail,
|
&CmndSendmail,
|
||||||
#endif
|
#endif
|
||||||
&CmndWebServer, &CmndWebPassword, &CmndWeblog, &CmndWebRefresh, &CmndWebSend, &CmndWebColor,
|
&CmndWebServer, &CmndWebPassword, &CmndWeblog, &CmndWebRefresh, &CmndWebSend, &CmndWebQuery,
|
||||||
&CmndWebSensor, &CmndWebButton
|
&CmndWebColor, &CmndWebSensor, &CmndWebButton
|
||||||
#ifdef USE_WEBGETCONFIG
|
#ifdef USE_WEBGETCONFIG
|
||||||
, &CmndWebGetConfig
|
, &CmndWebGetConfig
|
||||||
#endif
|
#endif
|
||||||
@ -3359,6 +3412,15 @@ void CmndWebSend(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CmndWebQuery(void)
|
||||||
|
{
|
||||||
|
if (XdrvMailbox.data_len > 0) {
|
||||||
|
uint32_t result = WebQuery(XdrvMailbox.data);
|
||||||
|
char stemp1[20];
|
||||||
|
ResponseCmndChar(GetTextIndexed(stemp1, sizeof(stemp1), result, kWebCmndStatus));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef USE_WEBGETCONFIG
|
#ifdef USE_WEBGETCONFIG
|
||||||
void CmndWebGetConfig(void)
|
void CmndWebGetConfig(void)
|
||||||
{
|
{
|
||||||
@ -3519,4 +3581,4 @@ bool Xdrv01(uint8_t function)
|
|||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
#endif // USE_WEBSERVER
|
#endif // USE_WEBSERVER
|
Loading…
x
Reference in New Issue
Block a user