Unverified Commit e4b008e7 authored by Denys Fedoryshchenko's avatar Denys Fedoryshchenko Committed by GitHub

Handle stream timeouts properly, for slow HTTP/HTTPS links (#3752)

This patch fixes update timeouts (error #6) on slow HTTP/HTTPS links.
parent 76afaf2d
...@@ -323,6 +323,8 @@ size_t UpdateClass::write(uint8_t *data, size_t len) { ...@@ -323,6 +323,8 @@ size_t UpdateClass::write(uint8_t *data, size_t len) {
size_t UpdateClass::writeStream(Stream &data) { size_t UpdateClass::writeStream(Stream &data) {
size_t written = 0; size_t written = 0;
size_t toRead = 0; size_t toRead = 0;
int timeout_failures = 0;
if(hasError() || !isRunning()) if(hasError() || !isRunning())
return 0; return 0;
...@@ -344,15 +346,24 @@ size_t UpdateClass::writeStream(Stream &data) { ...@@ -344,15 +346,24 @@ size_t UpdateClass::writeStream(Stream &data) {
bytesToRead = remaining(); bytesToRead = remaining();
} }
/*
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); toRead = data.readBytes(_buffer + _bufferLen, bytesToRead);
if(toRead == 0) { //Timeout if(toRead == 0) {
delay(100); timeout_failures++;
toRead = data.readBytes(_buffer + _bufferLen, bytesToRead); if (timeout_failures >= 300) {
if(toRead == 0) { //Timeout
_abort(UPDATE_ERROR_STREAM); _abort(UPDATE_ERROR_STREAM);
return written; return written;
} }
delay(100);
}
} }
if(_ledPin != -1) { if(_ledPin != -1) {
digitalWrite(_ledPin, !_ledOn); // Switch LED off digitalWrite(_ledPin, !_ledOn); // Switch LED off
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment