forked from me-no-dev/ESPAsyncWebServer
Initial SSL Implementation
This commit is contained in:
@@ -332,6 +332,7 @@ class AsyncWebServerResponse {
|
|||||||
size_t _headLength;
|
size_t _headLength;
|
||||||
size_t _sentLength;
|
size_t _sentLength;
|
||||||
size_t _ackedLength;
|
size_t _ackedLength;
|
||||||
|
size_t _writtenLength;
|
||||||
WebResponseState _state;
|
WebResponseState _state;
|
||||||
const char* _responseCodeToString(int code);
|
const char* _responseCodeToString(int code);
|
||||||
|
|
||||||
@@ -360,17 +361,21 @@ typedef std::function<void(AsyncWebServerRequest *request, String filename, size
|
|||||||
typedef std::function<void(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total)> ArBodyHandlerFunction;
|
typedef std::function<void(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total)> ArBodyHandlerFunction;
|
||||||
|
|
||||||
class AsyncWebServer {
|
class AsyncWebServer {
|
||||||
private:
|
protected:
|
||||||
AsyncServer _server;
|
AsyncServer _server;
|
||||||
AsyncWebRewrite* _rewrites;
|
AsyncWebRewrite* _rewrites;
|
||||||
AsyncWebHandler* _handlers;
|
AsyncWebHandler* _handlers;
|
||||||
AsyncWebHandler* _catchAllHandler;
|
AsyncWebHandler* _catchAllHandler;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
AsyncWebServer(uint16_t port);
|
AsyncWebServer(uint16_t port);
|
||||||
~AsyncWebServer();
|
~AsyncWebServer();
|
||||||
|
|
||||||
void begin();
|
void begin();
|
||||||
|
|
||||||
|
void onSslFileRequest(AcSSlFileHandler cb, void* arg);
|
||||||
|
void beginSecure(const char *cert, const char *private_key_file, const char *password);
|
||||||
|
|
||||||
AsyncWebRewrite& addRewrite(AsyncWebRewrite* rewrite);
|
AsyncWebRewrite& addRewrite(AsyncWebRewrite* rewrite);
|
||||||
|
|
||||||
AsyncWebRewrite& rewrite(const char* from, const char* to);
|
AsyncWebRewrite& rewrite(const char* from, const char* to);
|
||||||
|
@@ -81,6 +81,7 @@ AsyncWebServerResponse::AsyncWebServerResponse()
|
|||||||
, _headLength(0)
|
, _headLength(0)
|
||||||
, _sentLength(0)
|
, _sentLength(0)
|
||||||
, _ackedLength(0)
|
, _ackedLength(0)
|
||||||
|
, _writtenLength(0)
|
||||||
, _state(RESPONSE_SETUP)
|
, _state(RESPONSE_SETUP)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
@@ -181,18 +182,18 @@ void AsyncBasicResponse::_respond(AsyncWebServerRequest *request){
|
|||||||
size_t outLen = out.length();
|
size_t outLen = out.length();
|
||||||
size_t space = request->client()->space();
|
size_t space = request->client()->space();
|
||||||
if(!_contentLength && space >= outLen){
|
if(!_contentLength && space >= outLen){
|
||||||
request->client()->write(out.c_str(), outLen);
|
_writtenLength += request->client()->write(out.c_str(), outLen);
|
||||||
_state = RESPONSE_WAIT_ACK;
|
_state = RESPONSE_WAIT_ACK;
|
||||||
} else if(_contentLength && space >= outLen + _contentLength){
|
} else if(_contentLength && space >= outLen + _contentLength){
|
||||||
out += _content;
|
out += _content;
|
||||||
outLen += _contentLength;
|
outLen += _contentLength;
|
||||||
request->client()->write(out.c_str(), outLen);
|
_writtenLength += request->client()->write(out.c_str(), outLen);
|
||||||
_state = RESPONSE_WAIT_ACK;
|
_state = RESPONSE_WAIT_ACK;
|
||||||
} else if(space && space < out.length()){
|
} else if(space && space < out.length()){
|
||||||
String partial = out.substring(0, space);
|
String partial = out.substring(0, space);
|
||||||
_content = out.substring(space) + _content;
|
_content = out.substring(space) + _content;
|
||||||
_contentLength += outLen - space;
|
_contentLength += outLen - space;
|
||||||
request->client()->write(partial.c_str(), partial.length());
|
_writtenLength += request->client()->write(partial.c_str(), partial.length());
|
||||||
_state = RESPONSE_CONTENT;
|
_state = RESPONSE_CONTENT;
|
||||||
} else if(space > outLen && space < (outLen + _contentLength)){
|
} else if(space > outLen && space < (outLen + _contentLength)){
|
||||||
size_t shift = space - outLen;
|
size_t shift = space - outLen;
|
||||||
@@ -200,7 +201,7 @@ void AsyncBasicResponse::_respond(AsyncWebServerRequest *request){
|
|||||||
_sentLength += shift;
|
_sentLength += shift;
|
||||||
out += _content.substring(0, shift);
|
out += _content.substring(0, shift);
|
||||||
_content = _content.substring(shift);
|
_content = _content.substring(shift);
|
||||||
request->client()->write(out.c_str(), outLen);
|
_writtenLength += request->client()->write(out.c_str(), outLen);
|
||||||
_state = RESPONSE_CONTENT;
|
_state = RESPONSE_CONTENT;
|
||||||
} else {
|
} else {
|
||||||
_content = out + _content;
|
_content = out + _content;
|
||||||
@@ -216,7 +217,7 @@ size_t AsyncBasicResponse::_ack(AsyncWebServerRequest *request, size_t len, uint
|
|||||||
size_t space = request->client()->space();
|
size_t space = request->client()->space();
|
||||||
//we can fit in this packet
|
//we can fit in this packet
|
||||||
if(space > available){
|
if(space > available){
|
||||||
request->client()->write(_content.c_str(), available);
|
_writtenLength += request->client()->write(_content.c_str(), available);
|
||||||
_content = String();
|
_content = String();
|
||||||
_state = RESPONSE_WAIT_ACK;
|
_state = RESPONSE_WAIT_ACK;
|
||||||
return available;
|
return available;
|
||||||
@@ -225,10 +226,10 @@ size_t AsyncBasicResponse::_ack(AsyncWebServerRequest *request, size_t len, uint
|
|||||||
String out = _content.substring(0, space);
|
String out = _content.substring(0, space);
|
||||||
_content = _content.substring(space);
|
_content = _content.substring(space);
|
||||||
_sentLength += space;
|
_sentLength += space;
|
||||||
request->client()->write(out.c_str(), space);
|
_writtenLength += request->client()->write(out.c_str(), space);
|
||||||
return space;
|
return space;
|
||||||
} else if(_state == RESPONSE_WAIT_ACK){
|
} else if(_state == RESPONSE_WAIT_ACK){
|
||||||
if(_ackedLength >= (_headLength+_contentLength)){
|
if(_ackedLength >= _writtenLength){
|
||||||
_state = RESPONSE_END;
|
_state = RESPONSE_END;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -264,7 +265,7 @@ size_t AsyncAbstractResponse::_ack(AsyncWebServerRequest *request, size_t len, u
|
|||||||
} else {
|
} else {
|
||||||
String out = _head.substring(0, space);
|
String out = _head.substring(0, space);
|
||||||
_head = _head.substring(space);
|
_head = _head.substring(space);
|
||||||
request->client()->write(out.c_str(), out.length());
|
_writtenLength += request->client()->write(out.c_str(), out.length());
|
||||||
return out.length();
|
return out.length();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -306,7 +307,7 @@ size_t AsyncAbstractResponse::_ack(AsyncWebServerRequest *request, size_t len, u
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(outLen)
|
if(outLen)
|
||||||
outLen = request->client()->write((const char*)buf, outLen);
|
_writtenLength += request->client()->write((const char*)buf, outLen);
|
||||||
|
|
||||||
if(_chunked)
|
if(_chunked)
|
||||||
_sentLength += readLen;
|
_sentLength += readLen;
|
||||||
@@ -321,7 +322,7 @@ size_t AsyncAbstractResponse::_ack(AsyncWebServerRequest *request, size_t len, u
|
|||||||
return outLen;
|
return outLen;
|
||||||
|
|
||||||
} else if(_state == RESPONSE_WAIT_ACK){
|
} else if(_state == RESPONSE_WAIT_ACK){
|
||||||
if(!_sendContentLength || _ackedLength >= (_headLength+_contentLength)){
|
if(!_sendContentLength || _ackedLength >= _writtenLength){
|
||||||
_state = RESPONSE_END;
|
_state = RESPONSE_END;
|
||||||
if(!_chunked && !_sendContentLength)
|
if(!_chunked && !_sendContentLength)
|
||||||
request->client()->close(true);
|
request->client()->close(true);
|
||||||
|
@@ -84,6 +84,14 @@ void AsyncWebServer::begin(){
|
|||||||
_server.begin();
|
_server.begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AsyncWebServer::onSslFileRequest(AcSSlFileHandler cb, void* arg){
|
||||||
|
_server.onSslFileRequest(cb, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AsyncWebServer::beginSecure(const char *cert, const char *key, const char *password){
|
||||||
|
_server.beginSecure(cert, key, password);
|
||||||
|
}
|
||||||
|
|
||||||
void AsyncWebServer::_handleDisconnect(AsyncWebServerRequest *request){
|
void AsyncWebServer::_handleDisconnect(AsyncWebServerRequest *request){
|
||||||
delete request;
|
delete request;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user