Skip to content

Commit 5d1f89a

Browse files
authored
Merge pull request #17 from Aircoookie/improve-stream-response
Improve AsyncResponseStream
2 parents bbe8bdb + 2a96c83 commit 5d1f89a

3 files changed

Lines changed: 29 additions & 17 deletions

File tree

src/ESPAsyncWebServer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ class AsyncWebServerRequest {
249249
AsyncWebServerResponse *beginResponse(Stream &stream, const String& contentType, size_t len, AwsTemplateProcessor callback=nullptr);
250250
AsyncWebServerResponse *beginResponse(const String& contentType, size_t len, AwsResponseFiller callback, AwsTemplateProcessor templateCallback=nullptr);
251251
AsyncWebServerResponse *beginChunkedResponse(const String& contentType, AwsResponseFiller callback, AwsTemplateProcessor templateCallback=nullptr);
252-
AsyncResponseStream *beginResponseStream(const String& contentType, size_t bufferSize=1460);
252+
AsyncResponseStream *beginResponseStream(const String& contentType, size_t bufferSize=TCP_MSS);
253253
AsyncWebServerResponse *beginResponse_P(int code, const String& contentType, const uint8_t * content, size_t len, AwsTemplateProcessor callback=nullptr);
254254
AsyncWebServerResponse *beginResponse_P(int code, const String& contentType, PGM_P content, AwsTemplateProcessor callback=nullptr);
255255

src/WebResponseImpl.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
#endif
2929
#include <vector>
3030
#include "default_init_allocator.h"
31+
#include "DynamicBuffer.h"
32+
3133
// It is possible to restore these defines, but one can use _min and _max instead. Or std::min, std::max.
3234

3335
class AsyncBasicResponse: public AsyncWebServerResponse {
@@ -119,13 +121,13 @@ class AsyncProgmemResponse: public AsyncAbstractResponse {
119121
virtual size_t _fillBuffer(uint8_t *buf, size_t maxLen) override;
120122
};
121123

122-
class cbuf;
123-
124124
class AsyncResponseStream: public AsyncAbstractResponse, public Print {
125125
private:
126-
cbuf *_content;
126+
DynamicBufferList _content;
127+
DynamicBufferListPrint _print;
128+
size_t _offset;
127129
public:
128-
AsyncResponseStream(const String& contentType, size_t bufferSize);
130+
AsyncResponseStream(const String& contentType, size_t bufferSize=TCP_MSS);
129131
~AsyncResponseStream();
130132
bool _sourceValid() const { return (_state < RESPONSE_END); }
131133
virtual size_t _fillBuffer(uint8_t *buf, size_t maxLen) override;

src/WebResponses.cpp

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -714,32 +714,42 @@ size_t AsyncProgmemResponse::_fillBuffer(uint8_t *data, size_t len){
714714
* Response Stream (You can print/write/printf to it, up to the contentLen bytes)
715715
* */
716716

717-
AsyncResponseStream::AsyncResponseStream(const String& contentType, size_t bufferSize){
717+
AsyncResponseStream::AsyncResponseStream(const String& contentType, size_t bufferSize) : _print(_content, bufferSize), _offset(0) {
718718
_code = 200;
719719
_contentLength = 0;
720720
_contentType = contentType;
721-
_content = new cbuf(bufferSize);
722721
}
723722

724723
AsyncResponseStream::~AsyncResponseStream(){
725-
delete _content;
724+
;
726725
}
727726

728727
size_t AsyncResponseStream::_fillBuffer(uint8_t *buf, size_t maxLen){
729-
return _content->read((char*)buf, maxLen);
728+
size_t read = 0;
729+
while((maxLen > 0) && !_content.empty()) {
730+
auto& dbuf = _content.front();
731+
auto to_read = std::min(dbuf.size() - _offset, maxLen);
732+
memcpy(buf, dbuf.data() + _offset, to_read);
733+
buf += to_read;
734+
maxLen -= to_read;
735+
read += to_read;
736+
_offset += to_read;
737+
if (_offset == dbuf.size()) {
738+
_content.pop_front();
739+
_offset = 0;
740+
}
741+
}
742+
743+
return read;
730744
}
731745

732746
size_t AsyncResponseStream::write(const uint8_t *data, size_t len){
733747
if(_started())
734748
return 0;
735-
736-
if(len > _content->room()){
737-
size_t needed = len - _content->room();
738-
_content->resizeAdd(needed);
739-
}
740-
size_t written = _content->write((const char*)data, len);
741-
_contentLength += written;
742-
return written;
749+
750+
auto size = _print.write(data, len);
751+
_contentLength += size;
752+
return size;
743753
}
744754

745755
size_t AsyncResponseStream::write(uint8_t data){

0 commit comments

Comments
 (0)