@@ -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
594607size_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
614629size_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