some more work on outputting as stream from the loop

This commit is contained in:
Me No Dev 2016-01-21 10:29:38 +02:00
parent 36853c9122
commit 41846249ec
4 changed files with 19 additions and 0 deletions

View File

@ -67,6 +67,7 @@ class AsyncResponseStream: public AsyncAbstractResponse, public Print {
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);
using Print::write;
};
#endif /* ASYNCWEBSERVERRESPONSEIMPL_H_ */

View File

@ -15,6 +15,7 @@ class AsyncWebServerResponse;
class AsyncWebHeader;
class AsyncWebParameter;
class AsyncWebHandler;
class AsyncResponseStream;
typedef enum {
HTTP_ANY, HTTP_GET, HTTP_POST, HTTP_DELETE, HTTP_PUT, HTTP_PATCH, HTTP_HEAD, HTTP_OPTIONS
@ -136,6 +137,7 @@ class AsyncWebServerRequest {
public:
File _tempFile;
AsyncWebServerRequest *next;
AsyncWebServerRequest(AsyncWebServer*, AsyncClient*);
~AsyncWebServerRequest();
@ -165,6 +167,7 @@ class AsyncWebServerRequest {
AsyncWebServerResponse *beginResponse(FS &fs, String path, String contentType=String(), bool download=false);
AsyncWebServerResponse *beginResponse(Stream &stream, String contentType, size_t len);
AsyncWebServerResponse *beginResponse(String contentType, size_t len, AwsResponseFiller callback);
AsyncResponseStream *getResponseStream(String contentType, size_t len);
int headers(); // get header count
bool hasHeader(String name);
@ -270,5 +273,6 @@ class AsyncWebServer {
void _handleRequest(AsyncWebServerRequest *request);
};
#include "AsyncWebServerResponseImpl.h"
#endif /* _AsyncWebServer_H_ */

View File

@ -354,14 +354,21 @@ AsyncResponseStream::~AsyncResponseStream(){
}
size_t AsyncResponseStream::_fillBuffer(uint8_t *buf, size_t maxLen){
os_printf("fb:%u\n",maxLen);
return _content->read((char*)buf, maxLen);
}
size_t AsyncResponseStream::write(const uint8_t *data, size_t len){
if(_finished())
return 0;
//while(_content->room() < len) delay(1);
return _content->write((const char*)data, len);
}
size_t AsyncResponseStream::write(uint8_t data){
if(_finished())
return 0;
//while(_content->room() == 0) delay(1);
return write(&data, 1);
}

View File

@ -45,6 +45,7 @@ AsyncWebServerRequest::AsyncWebServerRequest(AsyncWebServer* s, AsyncClient* c)
, _itemBuffer(0)
, _itemBufferIndex(0)
, _itemIsFile(false)
, next(NULL)
{
c->onError([](void *r, AsyncClient* c, int8_t error){ AsyncWebServerRequest *req = (AsyncWebServerRequest*)r; req->_onError(error); }, this);
c->onAck([](void *r, AsyncClient* c, size_t len, uint32_t time){ AsyncWebServerRequest *req = (AsyncWebServerRequest*)r; req->_onAck(len, time); }, this);
@ -611,6 +612,12 @@ AsyncWebServerResponse * AsyncWebServerRequest::beginResponse(String contentType
return new AsyncCallbackResponse(contentType, len, callback);
}
AsyncResponseStream * AsyncWebServerRequest::getResponseStream(String contentType, size_t len){
AsyncResponseStream * r = new AsyncResponseStream(contentType, len);
send(r);
return r;
}
void AsyncWebServerRequest::send(int code, String contentType, String content){
send(new AsyncBasicResponse(code, contentType, content));
}