diff --git a/CHANGELOG.md b/CHANGELOG.md index 768a0d845..224458501 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ All notable changes to this project will be documented in this file. - ESP32 Webcam add boundary marker before sending mjpeg image (#12376) - DDS238-2 wrong reactive power value (#12283) - NO VALID JSON regression from may 4th (#12440) +- Telegram response decoding stopped working after 20210621 and exception on long result message (#12451) ## [Released] diff --git a/RELEASENOTES.md b/RELEASENOTES.md index e5839a07a..f5fe6f296 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -108,6 +108,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - DDS238-2 wrong reactive power value [#12283](https://github.com/arendst/Tasmota/issues/12283) - ESP32 Webcam add boundary marker before sending mjpeg image [#12376](https://github.com/arendst/Tasmota/issues/12376) - NO VALID JSON regression from may 4th [#12440](https://github.com/arendst/Tasmota/issues/12440) +- Telegram response decoding stopped working after 20210621 and exception on long result message [#12451](https://github.com/arendst/Tasmota/issues/12451) ### Noted - ESP32 single core **tasmota32solo1.bin** binary can only be uploaded using the GUI as OTA upload will trigger the watchdog timer \ No newline at end of file diff --git a/tasmota/xdrv_40_telegram.ino b/tasmota/xdrv_40_telegram.ino index bfc9dfd4a..f50d14a88 100644 --- a/tasmota/xdrv_40_telegram.ino +++ b/tasmota/xdrv_40_telegram.ino @@ -103,49 +103,54 @@ bool TelegramInit(void) { return init_done; } -String TelegramConnectToTelegram(String command) { - AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("TGM: Cmnd %s"), command.c_str()); +String TelegramConnectToTelegram(const String &command) { +// AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("TGM: Cmnd '%s'"), command.c_str()); if (!TelegramInit()) { return ""; } + String host = F("api.telegram.org"); String response = ""; uint32_t tls_connect_time = millis(); - if (telegramClient->connect("api.telegram.org", 443)) { + if (telegramClient->connect(host.c_str(), 443)) { // AddLog(LOG_LEVEL_DEBUG, PSTR("TGM: Connected in %d ms, max ThunkStack used %d"), millis() - tls_connect_time, telegramClient->getMaxThunkStackUse()); -// telegramClient->println("GET /"+command); - - String request = String("GET /") + command + - " HTTP/1.1\r\n" + - "Host: api.telegram.org" + - "\r\n" + "Connection: close\r\n\r\n"; +// telegramClient->println("GET /"+command); // Fails after 20210621 + String request = "GET /" + command + " HTTP/1.1\r\nHost: " + host + "\r\nConnection: close\r\n\r\n"; telegramClient->print(request); +/* + Response before 20210621: + {"ok":true,"result":[]} + Response after 20210621: + HTTP/1.1 200 OK + Server: nginx/1.18.0 + Date: Thu, 24 Jun 2021 15:26:20 GMT + Content-Type: application/json + Content-Length: 23 + Connection: close + Strict-Transport-Security: max-age=31536000; includeSubDomains; preload + Access-Control-Allow-Origin: * + Access-Control-Allow-Methods: GET, POST, OPTIONS + Access-Control-Expose-Headers: Content-Length,Content-Type,Date,Server,Connection - + {"ok":true,"result":[]} +*/ char c; - int ch_count=0; + bool available = false; uint32_t now = millis(); - bool avail = false; - bool start = false; - while (millis() -now < 1500) { + while (!available && (millis() -now < 1500)) { while (telegramClient->available()) { - char c = telegramClient->read(); - if (ch_count < 1000) { // Allow up to two messages - - if (c == '{') { - start = true; - } - if (start) { - response = response + c; - ch_count++; + c = telegramClient->read(); + if (c == '{') { + available = true; // Skip headers (+-400 bytes) and start response at first JSON + } + if (available) { + response += c; + if (response.length() > 800) { // Allow up to two messages + break; } } - avail = true; - } - if (avail) { - break; } } @@ -216,7 +221,7 @@ void TelegramGetUpdates(uint32_t offset) { // } // ]} - AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("TGM: Response %s"), response.c_str()); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("TGM: Response '%s'"), response.c_str()); JsonParser parser((char*)response.c_str()); JsonParserObject root = parser.getRootObject(); @@ -260,7 +265,7 @@ void TelegramGetUpdates(uint32_t offset) { } } -bool TelegramSendMessage(String chat_id, String text) { +bool TelegramSendMessage(const String &chat_id, const String &text) { AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("TGM: sendMessage")); if (!TelegramInit()) { return false; }