WebServer: serve static files from SPIFFS

This commit is contained in:
Thomas Kolb 2019-12-08 22:56:59 +01:00
parent 642ce82144
commit 13a758b01f

View file

@ -15,11 +15,17 @@ WebServer::WebServer(void)
m_server = new httpsserver::HTTPServer(); m_server = new httpsserver::HTTPServer();
} }
void WebServer::serveFile(String filename, httpsserver::HTTPResponse *res) bool WebServer::serveFile(String filename, httpsserver::HTTPResponse *res)
{ {
uint8_t buf[1024]; uint8_t buf[1024];
File f = SPIFFS.open(filename.c_str(), "r"); File f = SPIFFS.open(filename.c_str(), "r");
if(!f) {
return false;
}
res->setHeader("Content-Length", httpsserver::intToString(f.size()));
size_t nread = 1; size_t nread = 1;
while(nread > 0) { while(nread > 0) {
nread = f.readBytes(reinterpret_cast<char*>(buf), 1024); nread = f.readBytes(reinterpret_cast<char*>(buf), 1024);
@ -31,6 +37,8 @@ void WebServer::serveFile(String filename, httpsserver::HTTPResponse *res)
} }
f.close(); f.close();
return true;
} }
void WebServer::handleRoot(httpsserver::HTTPRequest *req, httpsserver::HTTPResponse *res) void WebServer::handleRoot(httpsserver::HTTPRequest *req, httpsserver::HTTPResponse *res)
@ -174,14 +182,18 @@ void WebServer::handleAuthTest(httpsserver::HTTPRequest *req, httpsserver::HTTPR
} }
} }
void WebServer::handle404(httpsserver::HTTPRequest *req, httpsserver::HTTPResponse *res) void WebServer::handleStatic(httpsserver::HTTPRequest *req, httpsserver::HTTPResponse *res)
{ {
req->discardRequestBody(); std::string filename = "/htdocs" + req->getRequestString();
res->setStatusCode(404); if(!serveFile(filename.c_str(), res)) {
res->setHeader("Content-Type", "text/plain"); req->discardRequestBody();
res->println("Error 404: Not found"); res->setStatusCode(404);
res->setHeader("Content-Type", "text/plain");
res->println("Error 404: Not found");
}
} }
void WebServer::serverTask(void *arg) void WebServer::serverTask(void *arg)
@ -196,8 +208,10 @@ void WebServer::serverTask(void *arg)
WebServer::handleChallenge); WebServer::handleChallenge);
httpsserver::ResourceNode *nodeAuthTest = new httpsserver::ResourceNode("/authtest", "GET", httpsserver::ResourceNode *nodeAuthTest = new httpsserver::ResourceNode("/authtest", "GET",
WebServer::handleAuthTest); WebServer::handleAuthTest);
httpsserver::ResourceNode *node404 = new httpsserver::ResourceNode("", "GET",
WebServer::handle404); // handle all remaining requests by trying to serve static files. If no file is found, 404 is generated.
httpsserver::ResourceNode *nodeStatic = new httpsserver::ResourceNode("", "GET",
WebServer::handleStatic);
WebServer &server = WebServer::instance(); WebServer &server = WebServer::instance();
@ -206,7 +220,7 @@ void WebServer::serverTask(void *arg)
server.m_server->registerNode(nodeUpdate); server.m_server->registerNode(nodeUpdate);
server.m_server->registerNode(nodeChallenge); server.m_server->registerNode(nodeChallenge);
server.m_server->registerNode(nodeAuthTest); server.m_server->registerNode(nodeAuthTest);
server.m_server->setDefaultNode(node404); server.m_server->setDefaultNode(nodeStatic);
Serial.println("[server] Starting HTTP Server..."); Serial.println("[server] Starting HTTP Server...");
server.m_server->start(); server.m_server->start();
@ -234,4 +248,4 @@ bool WebServer::start(void)
NULL); /* Task handle to keep track of created task */ NULL); /* Task handle to keep track of created task */
return true; return true;
} }