From 41846249ec91281b21f350cf869090c0bf579e43 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Thu, 21 Jan 2016 10:29:38 +0200 Subject: [PATCH] some more work on outputting as stream from the loop --- src/AsyncWebServerResponseImpl.h | 1 + src/ESPAsyncWebServer.h | 4 ++++ src/WebResponses.cpp | 7 +++++++ src/WebServerClient.cpp | 7 +++++++ 4 files changed, 19 insertions(+) diff --git a/src/AsyncWebServerResponseImpl.h b/src/AsyncWebServerResponseImpl.h index 170dfea..b587f7f 100644 --- a/src/AsyncWebServerResponseImpl.h +++ b/src/AsyncWebServerResponseImpl.h @@ -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_ */ diff --git a/src/ESPAsyncWebServer.h b/src/ESPAsyncWebServer.h index bb5cf58..036fb81 100644 --- a/src/ESPAsyncWebServer.h +++ b/src/ESPAsyncWebServer.h @@ -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_ */ diff --git a/src/WebResponses.cpp b/src/WebResponses.cpp index 1a628e8..a075f3a 100644 --- a/src/WebResponses.cpp +++ b/src/WebResponses.cpp @@ -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); } diff --git a/src/WebServerClient.cpp b/src/WebServerClient.cpp index f460bc4..e947066 100644 --- a/src/WebServerClient.cpp +++ b/src/WebServerClient.cpp @@ -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)); }