Skip to content

Commit

Permalink
Handle stream timeouts properly, for slow HTTP/HTTPS links (#3752)
Browse files Browse the repository at this point in the history
This patch fixes update timeouts (error #6) on slow HTTP/HTTPS links.
  • Loading branch information
nuclearcat authored Nov 2, 2020
1 parent 76afaf2 commit e4b008e
Showing 1 changed file with 18 additions and 7 deletions.
25 changes: 18 additions & 7 deletions libraries/Update/src/Updater.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,8 @@ size_t UpdateClass::write(uint8_t *data, size_t len) {
size_t UpdateClass::writeStream(Stream &data) {
size_t written = 0;
size_t toRead = 0;
int timeout_failures = 0;

if(hasError() || !isRunning())
return 0;

Expand All @@ -344,15 +346,24 @@ size_t UpdateClass::writeStream(Stream &data) {
bytesToRead = remaining();
}

toRead = data.readBytes(_buffer + _bufferLen, bytesToRead);
if(toRead == 0) { //Timeout
delay(100);
toRead = data.readBytes(_buffer + _bufferLen, bytesToRead);
if(toRead == 0) { //Timeout
_abort(UPDATE_ERROR_STREAM);
return written;
/*
Init read&timeout counters and try to read, if read failed, increase counter,
wait 100ms and try to read again. If counter > 300 (30 sec), give up/abort
*/
toRead = 0;
timeout_failures = 0;
while(!toRead) {
toRead = data.readBytes(_buffer + _bufferLen, bytesToRead);
if(toRead == 0) {
timeout_failures++;
if (timeout_failures >= 300) {
_abort(UPDATE_ERROR_STREAM);
return written;
}
delay(100);
}
}

if(_ledPin != -1) {
digitalWrite(_ledPin, !_ledOn); // Switch LED off
}
Expand Down

0 comments on commit e4b008e

Please sign in to comment.