From 0a2ee59cc3f0fb980263370d6ad452781124bf9b Mon Sep 17 00:00:00 2001 From: Steffen Pohle Date: Sun, 15 Feb 2026 18:57:33 +0100 Subject: [PATCH] webserver exited on file not found. --- Changelog | 3 +++ Makefile | 1 + UDPTCPNetwork-webutils.h | 1 + webserver.cc | 54 +++++++++++++++++++++++----------------- 4 files changed, 36 insertions(+), 23 deletions(-) diff --git a/Changelog b/Changelog index f7eebfd..5ee1e6d 100644 --- a/Changelog +++ b/Changelog @@ -1,3 +1,6 @@ +2026-02-15: +- webserver exited if file was not found. Return error code and keep running + 2026-02-06: - fixed: character '=' was ignored in the request diff --git a/Makefile b/Makefile index d52f0ee..ba15741 100644 --- a/Makefile +++ b/Makefile @@ -60,6 +60,7 @@ install: $(TARGET) cp -f $(TARGET) $(PREFIX)/lib/ ln -sf $(PREFIX)/lib/$(TARGET) $(PREFIX)/lib/lib$(OBJLIB_NAME).so cp -f UDPTCPNetwork*.h $(PREFIX)/include/ + ldconfig uninstall: rm -f $(PREFIX)/lib/$(TARGET) diff --git a/UDPTCPNetwork-webutils.h b/UDPTCPNetwork-webutils.h index 9e78419..5c23bbe 100644 --- a/UDPTCPNetwork-webutils.h +++ b/UDPTCPNetwork-webutils.h @@ -97,6 +97,7 @@ class WebServerClient { int SendResponseFileFromMemory (WebRequestBuffer *request, std::string fname, std::string addheader, void *memptr, int memsize); WebRequestBuffer * Loop(); + std::string GenErrorHtml(int errorcode, std::string errortext); }; diff --git a/webserver.cc b/webserver.cc index d12fd9a..5fdd3fc 100644 --- a/webserver.cc +++ b/webserver.cc @@ -264,40 +264,40 @@ int WebServerClient::SendResponseFile (WebRequestBuffer *request, std::string fn error = 404; fullfname = Get_WebFile_FullPath("error404.html"); filefd = open(fullfname.c_str(), O_RDONLY); - if (filefd < 0) errorexit ("could not open file '%s' for reading. Error:%s\n", - fullfname.c_str(), strerror(errno)); } - if (fstat (filefd, &filestat) != 0) { + if ((filefd != 0) && (fstat (filefd, &filestat) != 0)) { debug ("could not get stats on file '%s'. Error:%s\n", fullfname.c_str(), strerror(errno)); error = 500; fullfname = Get_WebFile_FullPath("error500.html"); filefd = open(fullfname.c_str(), O_RDONLY); - if (filefd < 0) - errorexit ("could not open file '%s' for reading. Error:%s\n", - fullfname.c_str(), strerror(errno)); - if (fstat (filefd, &filestat) != 0) - errorexit ("could not get stats on file '%s'. Error:%s\n", - fullfname.c_str(), strerror(errno)); } // // send header and file - header = CreateHeader (request, error, filetype, filestat.st_size, addheader); - outbufferpos = header.length(); - outbuffer = (char*) malloc (outbufferpos + filestat.st_size + 16); - memcpy (outbuffer, header.c_str(), outbufferpos); - - filereadbytes = read (filefd, outbuffer+outbufferpos, filestat.st_size); - close (filefd); - if (filereadbytes <= 0) { - debug ("could not read all data from file '%s'. Error:%s\n", - fullfname.c_str(), strerror(errno)); - free (outbuffer); - return 0; - } - filereadbytes += outbufferpos; + if (filefd <= 0) { + header = CreateHeader (request, error, filetype, filestat.st_size, addheader); + outbufferpos = header.length(); + outbuffer = (char*) malloc (outbufferpos + filestat.st_size + 16); + memcpy (outbuffer, header.c_str(), outbufferpos); + + filereadbytes = read (filefd, outbuffer+outbufferpos, filestat.st_size); + close (filefd); + if (filereadbytes <= 0) { + debug ("could not read all data from file '%s'. Error:%s\n", + fullfname.c_str(), strerror(errno)); + free (outbuffer); + return 0; + } + filereadbytes += outbufferpos; + } + else { + header = CreateHeader (request, error, filetype, filestat.st_size, addheader); + header = header + GenErrorHtml(error, "some internal server error"); + outbuffer = (char*) malloc (header.length() + 16); + memcpy (outbuffer, header.c_str(), header.length()); + } if (ssl) l = ssl->Write(outbuffer, filereadbytes); else l = tcp->Write(outbuffer, filereadbytes); @@ -331,6 +331,14 @@ std::string WebServerClient::Get_WebFile_FullPath(std::string file) { return ret; }; +std::string WebServerClient::GenErrorHtml(int errorcode, std::string errortext) { + std::string text; + text = "ERROR - " + to_string(errorcode) + ""; + text += "

"+to_string(errorcode)+"

"+errortext+"

"; + return text; +}; + + WebServer::WebServer() { running = 0;