Ho provato la tua libreria (ho commentato alcuni on(...) che erano in conflitto col mio codice) ed in effetti non da quel problema.
Ho visto che la differenza principale della handleClient() è la presenza, nel core del seguente pezzo di codice:
if (_currentClient.isSSE()) {
_currentStatus = HC_WAIT_CLOSE;
_statusChange = millis();
keepCurrentClient = true;
}
l'ho commentato e non ha dato più quel problema, ma se c'è quel codice ha il suo motivo e penso che la soluzione proposta da me sia più valida.
Comunque, non accontentandomi, ho voluto provare la async, non la tua ma direttamente quella principale.
Questa proprio non sono riuscita a farla funzionare.
Se deve caricare pochi file o comunque di piccola dimensione è ok (es. la pagina di login), ma quando passa all'index si blocca nella write().
Anche se non è colpa di questo codice che si occupa del trasferimento, lo posto per completezza:
//---------------------------------------
char g_Buff2[1024 * 4];
#define chunk g_Buff2
#define sizeChunk (sizeof(chunk))
//---------------------------------------
template<typename T> void loadAndsendFile(AsyncWebServerRequest* request, T filename, int mime)
{
DEBUG_WEB(Serial.printf("FileToSend:%s, mime:%s\n", filename, getContentType(mime)))
if (!openFile(filename)) {
handle404(request);
return;
}
int32_t _dim = myFile.size();
AsyncClient* client = request->client();
DEBUG_WEB(Serial.printf("Client %s, dim:%d\n", (client ? "Ok" : "Err"), _dim))
sendHeader(client, mime, _dim, (eHTML == mime) ? no_cache : ok_cache);
int32_t dim = _dim;
int fail = 0;
while(dim > 0 && fail < 5) {
int len = min((unsigned int)dim, sizeChunk);
len = myFile.read((uint8_t*)chunk, len);
if (!len)
break;
bool inside = dim > sizeChunk;
const char* t = (const char*)chunk;
fail = 0;
do {
// non cambia nulla tra i due
// int sent = client->write(t, len);
int sent = client->write(t, len, inside ? ASYNC_WRITE_FLAG_MORE : 0);
DEBUG_WEB(Serial.printf("Dim =%d, Remain=%d, Len=%d, Sent=%d\n", _dim, dim, len, sent))
dim -= sent;
if(sent == len)
break;
t += sent;
len -= sent;
vTaskDelay(10);
if(!sent)
++fail;
} while(fail < 5);
}
DEBUG_WEB(if(dim) Serial.println(" Failed "); else Serial.println(" Done "))
myFile.close();
}
//-------------------------------------------------------------------
se volete posto qui un paio di log, uno quando cerca di caricare l'index, l'altro mettendo direttamente il nome di un'immagine abbastanza corposa, ma sono un po' lunghetti. Intanto metto i link diretti (senza nemmeno zipparli):
log_site (7kB)
log_solo_file (4kB)
Qualcuno sa da cosa può dipendere?