From 36853c9122b3cd4683109127e5aa5bcb15d9455c Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Tue, 19 Jan 2016 21:47:26 +0200 Subject: [PATCH] attempt at outgoing stream --- src/AsyncWebServerResponseImpl.h | 12 ++++++++++++ src/WebResponses.cpp | 30 +++++++++++++++++++++++++++++- src/WebServerClient.cpp | 5 ++++- 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/AsyncWebServerResponseImpl.h b/src/AsyncWebServerResponseImpl.h index 1e3a89a..170dfea 100644 --- a/src/AsyncWebServerResponseImpl.h +++ b/src/AsyncWebServerResponseImpl.h @@ -57,4 +57,16 @@ class AsyncCallbackResponse: public AsyncAbstractResponse { size_t _fillBuffer(uint8_t *buf, size_t maxLen); }; +class AsyncResponseStream: public AsyncAbstractResponse, public Print { + private: + cbuf *_content; + public: + AsyncResponseStream(String contentType, size_t len); + ~AsyncResponseStream(); + bool _sourceValid(){ return (_state < RESPONSE_END); } + size_t _fillBuffer(uint8_t *buf, size_t maxLen); + size_t write(const uint8_t *data, size_t len); + size_t write(uint8_t data); +}; + #endif /* ASYNCWEBSERVERRESPONSEIMPL_H_ */ diff --git a/src/WebResponses.cpp b/src/WebResponses.cpp index 10031e0..1a628e8 100644 --- a/src/WebResponses.cpp +++ b/src/WebResponses.cpp @@ -1,5 +1,7 @@ #include "ESPAsyncWebServer.h" #include "AsyncWebServerResponseImpl.h" +#include "cbuf.h" + /* * Abstract Response @@ -220,7 +222,8 @@ size_t AsyncAbstractResponse::_ack(AsyncWebServerRequest *request, size_t len, u size_t outLen = (remaining > space)?space:remaining; uint8_t *buf = (uint8_t *)malloc(outLen); outLen = _fillBuffer(buf, outLen); - request->client()->write((const char*)buf, outLen); + if(outLen) + request->client()->write((const char*)buf, outLen); _sentLength += outLen; free(buf); if(_sentLength == _contentLength){ @@ -335,5 +338,30 @@ size_t AsyncCallbackResponse::_fillBuffer(uint8_t *data, size_t len){ } +/* + * Response Stream (You can print/write/printf to it, up to the contentLen bytes) + * */ +AsyncResponseStream::AsyncResponseStream(String contentType, size_t len){ + _code = 200; + _contentLength = len; + _contentType = contentType; + _content = new cbuf(1460); +} + +AsyncResponseStream::~AsyncResponseStream(){ + delete _content; +} + +size_t AsyncResponseStream::_fillBuffer(uint8_t *buf, size_t maxLen){ + return _content->read((char*)buf, maxLen); +} + +size_t AsyncResponseStream::write(const uint8_t *data, size_t len){ + return _content->write((const char*)data, len); +} + +size_t AsyncResponseStream::write(uint8_t data){ + return write(&data, 1); +} diff --git a/src/WebServerClient.cpp b/src/WebServerClient.cpp index dee87fd..f460bc4 100644 --- a/src/WebServerClient.cpp +++ b/src/WebServerClient.cpp @@ -51,7 +51,7 @@ AsyncWebServerRequest::AsyncWebServerRequest(AsyncWebServer* s, AsyncClient* c) c->onDisconnect([](void *r, AsyncClient* c){ AsyncWebServerRequest *req = (AsyncWebServerRequest*)r; req->_onDisconnect(); }, this); c->onTimeout([](void *r, AsyncClient* c, uint32_t time){ AsyncWebServerRequest *req = (AsyncWebServerRequest*)r; req->_onTimeout(time); }, this); c->onData([](void *r, AsyncClient* c, void *buf, size_t len){ AsyncWebServerRequest *req = (AsyncWebServerRequest*)r; req->_onData(buf, len); }, this); - //c->onPoll([](void *r, AsyncClient* c){ AsyncWebServerRequest *req = (AsyncWebServerRequest*)r; req->_onPoll(); }, this); + c->onPoll([](void *r, AsyncClient* c){ AsyncWebServerRequest *req = (AsyncWebServerRequest*)r; req->_onPoll(); }, this); } AsyncWebServerRequest::~AsyncWebServerRequest(){ @@ -127,6 +127,9 @@ void AsyncWebServerRequest::_onData(void *buf, size_t len){ void AsyncWebServerRequest::_onPoll(){ //os_printf("p\n"); + if(_response != NULL && !_response->_finished() && _client->canSend()){ + _response->_ack(this, 0, 0); + } } void AsyncWebServerRequest::_onAck(size_t len, uint32_t time){