Skip to content

Commit 60d2c77

Browse files
committed
added getAvailableVersion(), debug output current current Sketch MD5
1 parent 61785b2 commit 60d2c77

File tree

1 file changed

+111
-0
lines changed

1 file changed

+111
-0
lines changed

Diff for: libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp

+111
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ HTTPUpdateResult ESP8266HTTPUpdate::handleUpdate(HTTPClient& http, const String&
235235
DEBUG_HTTP_UPDATE("[httpUpdate] ESP8266 info:\n");
236236
DEBUG_HTTP_UPDATE("[httpUpdate] - free Space: %d\n", ESP.getFreeSketchSpace());
237237
DEBUG_HTTP_UPDATE("[httpUpdate] - current Sketch Size: %d\n", ESP.getSketchSize());
238+
DEBUG_HTTP_UPDATE("[httpUpdate] - current Sketch MD5: %s\n", ESP.getSketchMD5().c_str());
238239

239240
if(currentVersion && currentVersion[0] != 0x00) {
240241
DEBUG_HTTP_UPDATE("[httpUpdate] - current version: %s\n", currentVersion.c_str() );
@@ -440,6 +441,116 @@ bool ESP8266HTTPUpdate::runUpdate(Stream& in, uint32_t size, const String& md5,
440441
return true;
441442
}
442443

444+
/**
445+
* @brief Get avialable firmware version from update server
446+
* @author Holger Mueller
447+
* @date 2023-08-03
448+
*
449+
* @param client WiFiClient to use (see HTTPClient::begin)
450+
* @param host Update host name or IP (see HTTPClient::begin)
451+
* @param port Port on host (see HTTPClient::begin)
452+
* @param uri Update URI on server (see HTTPClient::begin)
453+
* @param current_version Current firmware version
454+
* @param available_version Firmware version available on update server
455+
* @return ESP8266HTTPUpdate::HTTPUpdateResult, HTTP_UPDATE_OK in case of success
456+
*/
457+
HTTPUpdateResult ESP8266HTTPUpdate::getAvailableVersion(WiFiClient& client, const String& host, uint16_t port, const String& uri, const String& current_version, String& available_version) {
458+
HTTPUpdateResult ret = HTTP_UPDATE_FAILED;
459+
HTTPClient http;
460+
http.begin(client, host, port, uri);
461+
462+
// use HTTP/1.0 for update since the update handler not support any transfer Encoding
463+
http.useHTTP10(true);
464+
http.setTimeout(_httpClientTimeout);
465+
http.setFollowRedirects(_followRedirects);
466+
http.setUserAgent(F("ESP8266-http-Update"));
467+
http.addHeader(F("x-ESP8266-Chip-ID"), String(ESP.getChipId()));
468+
http.addHeader(F("x-ESP8266-STA-MAC"), WiFi.macAddress());
469+
http.addHeader(F("x-ESP8266-AP-MAC"), WiFi.softAPmacAddress());
470+
http.addHeader(F("x-ESP8266-free-space"), String(ESP.getFreeSketchSpace()));
471+
http.addHeader(F("x-ESP8266-sketch-size"), String(ESP.getSketchSize()));
472+
http.addHeader(F("x-ESP8266-sketch-md5"), String(ESP.getSketchMD5()));
473+
http.addHeader(F("x-ESP8266-chip-size"), String(ESP.getFlashChipRealSize()));
474+
http.addHeader(F("x-ESP8266-sdk-version"), ESP.getSdkVersion());
475+
476+
http.addHeader(F("x-ESP8266-mode"), F("version"));
477+
478+
if (current_version && current_version[0] != 0x00) {
479+
http.addHeader(F("x-ESP8266-version"), current_version);
480+
}
481+
482+
if (!_user.isEmpty() && !_password.isEmpty()) {
483+
http.setAuthorization(_user.c_str(), _password.c_str());
484+
}
485+
486+
if (!_auth.isEmpty()) {
487+
http.setAuthorization(_auth.c_str());
488+
}
489+
490+
const char* headerkeys[] = {"x-MD5", "x-version"};
491+
size_t headerkeyssize = sizeof(headerkeys) / sizeof(char*);
492+
493+
// track these headers
494+
http.collectHeaders(headerkeys, headerkeyssize);
495+
496+
int code = http.GET();
497+
498+
if (code <= 0) {
499+
DEBUG_HTTP_UPDATE("[httpUpdate] HTTP error: %s\n", http.errorToString(code).c_str());
500+
_setLastError(code);
501+
http.end();
502+
return HTTP_UPDATE_FAILED;
503+
}
504+
505+
DEBUG_HTTP_UPDATE("[httpUpdate] Header read fin.\n");
506+
DEBUG_HTTP_UPDATE("[httpUpdate] Server header:\n");
507+
DEBUG_HTTP_UPDATE("[httpUpdate] - code: %d\n", code);
508+
DEBUG_HTTP_UPDATE("[httpUpdate] - len: %d\n", http.getSize());
509+
if (code != HTTP_CODE_OK) {
510+
DEBUG_HTTP_UPDATE("[httpUpdate] - payload: %s\n", http.getString().c_str());
511+
}
512+
513+
switch (code) {
514+
case HTTP_CODE_OK: ///< OK (check for version)
515+
if (http.hasHeader("x-version")) {
516+
available_version = http.header("x-version");
517+
ret = HTTP_UPDATE_OK;
518+
DEBUG_HTTP_UPDATE("[httpUpdate] - current version: %s\n", current_version.c_str());
519+
DEBUG_HTTP_UPDATE("[httpUpdate] - server version: %s\n", available_version.c_str());
520+
} else {
521+
_setLastError(HTTP_UE_SERVER_NOT_REPORT_VERSION);
522+
ret = HTTP_UPDATE_FAILED;
523+
DEBUG_HTTP_UPDATE("[httpUpdate] Server did not respond with a firmware version\n");
524+
}
525+
526+
if (http.hasHeader("x-MD5")) {
527+
DEBUG_HTTP_UPDATE("[httpUpdate] - current Sketch MD5: %s\n", ESP.getSketchMD5().c_str());
528+
DEBUG_HTTP_UPDATE("[httpUpdate] - server Sketch MD5: %s\n", http.header("x-MD5").c_str());
529+
}
530+
break;
531+
case HTTP_CODE_NOT_FOUND:
532+
_setLastError(HTTP_UE_SERVER_FILE_NOT_FOUND);
533+
ret = HTTP_UPDATE_FAILED;
534+
break;
535+
case HTTP_CODE_FORBIDDEN:
536+
_setLastError(HTTP_UE_SERVER_FORBIDDEN);
537+
ret = HTTP_UPDATE_FAILED;
538+
break;
539+
case HTTP_CODE_UNAUTHORIZED:
540+
_setLastError(HTTP_UE_SERVER_UNAUTHORIZED);
541+
ret = HTTP_UPDATE_FAILED;
542+
break;
543+
default:
544+
_setLastError(HTTP_UE_SERVER_WRONG_HTTP_CODE);
545+
ret = HTTP_UPDATE_FAILED;
546+
DEBUG_HTTP_UPDATE("[httpUpdate] HTTP Code is (%d)\n", code);
547+
break;
548+
}
549+
550+
http.end();
551+
return ret;
552+
}
553+
443554
#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_HTTPUPDATE)
444555
ESP8266HTTPUpdate ESPhttpUpdate;
445556
#endif

0 commit comments

Comments
 (0)