@@ -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)
444555ESP8266HTTPUpdate ESPhttpUpdate;
445556#endif
0 commit comments