Initial SSL Implementation

This commit is contained in:
Me No Dev
2016-08-24 22:32:27 +03:00
parent dab3077f2b
commit a14e93dd84
3 changed files with 25 additions and 11 deletions

View File

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

View File

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

View File

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