@@ -235,6 +235,7 @@ HTTPUpdateResult ESP8266HTTPUpdate::handleUpdate(HTTPClient& http, const String&
235
235
DEBUG_HTTP_UPDATE (" [httpUpdate] ESP8266 info:\n " );
236
236
DEBUG_HTTP_UPDATE (" [httpUpdate] - free Space: %d\n " , ESP.getFreeSketchSpace ());
237
237
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 ());
238
239
239
240
if (currentVersion && currentVersion[0 ] != 0x00 ) {
240
241
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,
440
441
return true ;
441
442
}
442
443
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
+
443
554
#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_HTTPUPDATE)
444
555
ESP8266HTTPUpdate ESPhttpUpdate;
445
556
#endif
0 commit comments