Add option to skip a callback if source data is not yet available

This commit is contained in:
me-no-dev 2018-07-15 10:21:21 +02:00
parent 28cdcf666d
commit 1078e9166b
2 changed files with 32 additions and 12 deletions

View File

@ -64,6 +64,9 @@ typedef enum {
} WebRequestMethod; } WebRequestMethod;
#endif #endif
//if this value is returned when asked for data, packet will not be sent and you will be asked for data again
#define RESPONSE_TRY_AGAIN 0xFFFFFFFF
typedef uint8_t WebRequestMethodComposite; typedef uint8_t WebRequestMethodComposite;
typedef std::function<void(void)> ArDisconnectHandler; typedef std::function<void(void)> ArDisconnectHandler;

View File

@ -302,9 +302,7 @@ size_t AsyncAbstractResponse::_ack(AsyncWebServerRequest *request, size_t len, u
} }
if(headLen){ if(headLen){
//TODO: memcpy should be faster? memcpy(buf, _head.c_str(), _head.length());
sprintf((char*)buf, "%s", _head.c_str());
_head = String();
} }
size_t readLen = 0; size_t readLen = 0;
@ -313,6 +311,10 @@ size_t AsyncAbstractResponse::_ack(AsyncWebServerRequest *request, size_t len, u
// HTTP 1.1 allows leading zeros in chunk length. Or spaces may be added. // HTTP 1.1 allows leading zeros in chunk length. Or spaces may be added.
// See RFC2616 sections 2, 3.6.1. // See RFC2616 sections 2, 3.6.1.
readLen = _fillBufferAndProcessTemplates(buf+headLen+6, outLen - 8); readLen = _fillBufferAndProcessTemplates(buf+headLen+6, outLen - 8);
if(readLen == RESPONSE_TRY_AGAIN){
free(buf);
return 0;
}
outLen = sprintf((char*)buf+headLen, "%x", readLen) + headLen; outLen = sprintf((char*)buf+headLen, "%x", readLen) + headLen;
while(outLen < headLen + 4) buf[outLen++] = ' '; while(outLen < headLen + 4) buf[outLen++] = ' ';
buf[outLen++] = '\r'; buf[outLen++] = '\r';
@ -321,16 +323,27 @@ size_t AsyncAbstractResponse::_ack(AsyncWebServerRequest *request, size_t len, u
buf[outLen++] = '\r'; buf[outLen++] = '\r';
buf[outLen++] = '\n'; buf[outLen++] = '\n';
} else { } else {
outLen = _fillBufferAndProcessTemplates(buf+headLen, outLen) + headLen; readLen = _fillBufferAndProcessTemplates(buf+headLen, outLen);
if(readLen == RESPONSE_TRY_AGAIN){
free(buf);
return 0;
}
outLen = readLen + headLen;
} }
if(outLen) if(headLen){
_writtenLength += request->client()->write((const char*)buf, outLen); _head = String();
}
if(_chunked) if(outLen){
_writtenLength += request->client()->write((const char*)buf, outLen);
}
if(_chunked){
_sentLength += readLen; _sentLength += readLen;
else } else {
_sentLength += outLen - headLen; _sentLength += outLen - headLen;
}
free(buf); free(buf);
@ -593,7 +606,9 @@ AsyncCallbackResponse::AsyncCallbackResponse(const String& contentType, size_t l
size_t AsyncCallbackResponse::_fillBuffer(uint8_t *data, size_t len){ size_t AsyncCallbackResponse::_fillBuffer(uint8_t *data, size_t len){
size_t ret = _content(data, len, _filledLength); size_t ret = _content(data, len, _filledLength);
if(ret != RESPONSE_TRY_AGAIN){
_filledLength += ret; _filledLength += ret;
}
return ret; return ret;
} }
@ -613,7 +628,9 @@ AsyncChunkedResponse::AsyncChunkedResponse(const String& contentType, AwsRespons
size_t AsyncChunkedResponse::_fillBuffer(uint8_t *data, size_t len){ size_t AsyncChunkedResponse::_fillBuffer(uint8_t *data, size_t len){
size_t ret = _content(data, len, _filledLength); size_t ret = _content(data, len, _filledLength);
if(ret != RESPONSE_TRY_AGAIN){
_filledLength += ret; _filledLength += ret;
}
return ret; return ret;
} }