attempt at outgoing stream

This commit is contained in:
Me No Dev 2016-01-19 21:47:26 +02:00
parent e70ba5da32
commit 36853c9122
3 changed files with 45 additions and 2 deletions

View File

@ -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_ */

View File

@ -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);
}

View File

@ -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){