Skip to content
This repository was archived by the owner on Mar 5, 2026. It is now read-only.

Commit 1078e91

Browse files
committed
Add option to skip a callback if source data is not yet available
1 parent 28cdcf6 commit 1078e91

2 files changed

Lines changed: 32 additions & 12 deletions

File tree

src/ESPAsyncWebServer.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ typedef enum {
6464
} WebRequestMethod;
6565
#endif
6666

67+
//if this value is returned when asked for data, packet will not be sent and you will be asked for data again
68+
#define RESPONSE_TRY_AGAIN 0xFFFFFFFF
69+
6770
typedef uint8_t WebRequestMethodComposite;
6871
typedef std::function<void(void)> ArDisconnectHandler;
6972

src/WebResponses.cpp

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -302,9 +302,7 @@ size_t AsyncAbstractResponse::_ack(AsyncWebServerRequest *request, size_t len, u
302302
}
303303

304304
if(headLen){
305-
//TODO: memcpy should be faster?
306-
sprintf((char*)buf, "%s", _head.c_str());
307-
_head = String();
305+
memcpy(buf, _head.c_str(), _head.length());
308306
}
309307

310308
size_t readLen = 0;
@@ -313,6 +311,10 @@ size_t AsyncAbstractResponse::_ack(AsyncWebServerRequest *request, size_t len, u
313311
// HTTP 1.1 allows leading zeros in chunk length. Or spaces may be added.
314312
// See RFC2616 sections 2, 3.6.1.
315313
readLen = _fillBufferAndProcessTemplates(buf+headLen+6, outLen - 8);
314+
if(readLen == RESPONSE_TRY_AGAIN){
315+
free(buf);
316+
return 0;
317+
}
316318
outLen = sprintf((char*)buf+headLen, "%x", readLen) + headLen;
317319
while(outLen < headLen + 4) buf[outLen++] = ' ';
318320
buf[outLen++] = '\r';
@@ -321,16 +323,27 @@ size_t AsyncAbstractResponse::_ack(AsyncWebServerRequest *request, size_t len, u
321323
buf[outLen++] = '\r';
322324
buf[outLen++] = '\n';
323325
} else {
324-
outLen = _fillBufferAndProcessTemplates(buf+headLen, outLen) + headLen;
326+
readLen = _fillBufferAndProcessTemplates(buf+headLen, outLen);
327+
if(readLen == RESPONSE_TRY_AGAIN){
328+
free(buf);
329+
return 0;
330+
}
331+
outLen = readLen + headLen;
325332
}
326333

327-
if(outLen)
328-
_writtenLength += request->client()->write((const char*)buf, outLen);
334+
if(headLen){
335+
_head = String();
336+
}
329337

330-
if(_chunked)
331-
_sentLength += readLen;
332-
else
333-
_sentLength += outLen - headLen;
338+
if(outLen){
339+
_writtenLength += request->client()->write((const char*)buf, outLen);
340+
}
341+
342+
if(_chunked){
343+
_sentLength += readLen;
344+
} else {
345+
_sentLength += outLen - headLen;
346+
}
334347

335348
free(buf);
336349

@@ -593,7 +606,9 @@ AsyncCallbackResponse::AsyncCallbackResponse(const String& contentType, size_t l
593606

594607
size_t AsyncCallbackResponse::_fillBuffer(uint8_t *data, size_t len){
595608
size_t ret = _content(data, len, _filledLength);
596-
_filledLength += ret;
609+
if(ret != RESPONSE_TRY_AGAIN){
610+
_filledLength += ret;
611+
}
597612
return ret;
598613
}
599614

@@ -613,7 +628,9 @@ AsyncChunkedResponse::AsyncChunkedResponse(const String& contentType, AwsRespons
613628

614629
size_t AsyncChunkedResponse::_fillBuffer(uint8_t *data, size_t len){
615630
size_t ret = _content(data, len, _filledLength);
616-
_filledLength += ret;
631+
if(ret != RESPONSE_TRY_AGAIN){
632+
_filledLength += ret;
633+
}
617634
return ret;
618635
}
619636

0 commit comments

Comments
 (0)