attempt at outgoing stream
This commit is contained in:
parent
e70ba5da32
commit
36853c9122
|
@ -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_ */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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){
|
||||
|
|
Loading…
Reference in New Issue