forked from me-no-dev/ESPAsyncWebServer
attempt at outgoing stream
This commit is contained in:
@@ -57,4 +57,16 @@ class AsyncCallbackResponse: public AsyncAbstractResponse {
|
|||||||
size_t _fillBuffer(uint8_t *buf, size_t maxLen);
|
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_ */
|
#endif /* ASYNCWEBSERVERRESPONSEIMPL_H_ */
|
||||||
|
@@ -1,5 +1,7 @@
|
|||||||
#include "ESPAsyncWebServer.h"
|
#include "ESPAsyncWebServer.h"
|
||||||
#include "AsyncWebServerResponseImpl.h"
|
#include "AsyncWebServerResponseImpl.h"
|
||||||
|
#include "cbuf.h"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Abstract Response
|
* Abstract Response
|
||||||
@@ -220,7 +222,8 @@ size_t AsyncAbstractResponse::_ack(AsyncWebServerRequest *request, size_t len, u
|
|||||||
size_t outLen = (remaining > space)?space:remaining;
|
size_t outLen = (remaining > space)?space:remaining;
|
||||||
uint8_t *buf = (uint8_t *)malloc(outLen);
|
uint8_t *buf = (uint8_t *)malloc(outLen);
|
||||||
outLen = _fillBuffer(buf, outLen);
|
outLen = _fillBuffer(buf, outLen);
|
||||||
request->client()->write((const char*)buf, outLen);
|
if(outLen)
|
||||||
|
request->client()->write((const char*)buf, outLen);
|
||||||
_sentLength += outLen;
|
_sentLength += outLen;
|
||||||
free(buf);
|
free(buf);
|
||||||
if(_sentLength == _contentLength){
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -51,7 +51,7 @@ AsyncWebServerRequest::AsyncWebServerRequest(AsyncWebServer* s, AsyncClient* c)
|
|||||||
c->onDisconnect([](void *r, AsyncClient* c){ AsyncWebServerRequest *req = (AsyncWebServerRequest*)r; req->_onDisconnect(); }, this);
|
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->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->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(){
|
AsyncWebServerRequest::~AsyncWebServerRequest(){
|
||||||
@@ -127,6 +127,9 @@ void AsyncWebServerRequest::_onData(void *buf, size_t len){
|
|||||||
|
|
||||||
void AsyncWebServerRequest::_onPoll(){
|
void AsyncWebServerRequest::_onPoll(){
|
||||||
//os_printf("p\n");
|
//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){
|
void AsyncWebServerRequest::_onAck(size_t len, uint32_t time){
|
||||||
|
Reference in New Issue
Block a user