Add option to skip a callback if source data is not yet available
This commit is contained in:
parent
28cdcf666d
commit
1078e9166b
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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){
|
||||||
_sentLength += readLen;
|
_writtenLength += request->client()->write((const char*)buf, outLen);
|
||||||
else
|
}
|
||||||
_sentLength += outLen - headLen;
|
|
||||||
|
if(_chunked){
|
||||||
|
_sentLength += readLen;
|
||||||
|
} else {
|
||||||
|
_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);
|
||||||
_filledLength += ret;
|
if(ret != RESPONSE_TRY_AGAIN){
|
||||||
|
_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);
|
||||||
_filledLength += ret;
|
if(ret != RESPONSE_TRY_AGAIN){
|
||||||
|
_filledLength += ret;
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue