summaryrefslogtreecommitdiffhomepage
path: root/Starserver/NetFileServlet.cpp
diff options
context:
space:
mode:
authorAki <please@ignore.pl>2022-04-07 00:24:56 +0200
committerAki <please@ignore.pl>2022-04-07 00:24:56 +0200
commitd8c1d5b840acc183e2cef112ebc6760952583f87 (patch)
treefc855d24ec6314c49f5aef61e722a60552e093d7 /Starserver/NetFileServlet.cpp
parent7d00261f6b3bf7da2b9371796848883dc3b40392 (diff)
downloadstarshatter-d8c1d5b840acc183e2cef112ebc6760952583f87.zip
starshatter-d8c1d5b840acc183e2cef112ebc6760952583f87.tar.gz
starshatter-d8c1d5b840acc183e2cef112ebc6760952583f87.tar.bz2
Moved server exclusive files to own module
Diffstat (limited to 'Starserver/NetFileServlet.cpp')
-rw-r--r--Starserver/NetFileServlet.cpp117
1 files changed, 117 insertions, 0 deletions
diff --git a/Starserver/NetFileServlet.cpp b/Starserver/NetFileServlet.cpp
new file mode 100644
index 0000000..6b23d9d
--- /dev/null
+++ b/Starserver/NetFileServlet.cpp
@@ -0,0 +1,117 @@
+/* Starshatter: The Open Source Project
+ Copyright (c) 2021-2022, Starshatter: The Open Source Project Contributors
+ Copyright (c) 2011-2012, Starshatter OpenSource Distribution Contributors
+ Copyright (c) 1997-2006, Destroyer Studios LLC.
+
+ AUTHOR: John DiCamillo
+
+
+ OVERVIEW
+ ========
+ HTTP Servlet for File Transfer
+*/
+
+
+#include "NetFileServlet.h"
+#include "NetAdminServer.h"
+#include "NetLayer.h"
+
+#include "DataLoader.h"
+
+// +-------------------------------------------------------------------+
+
+bool
+NetFileServlet::DoGet(HttpRequest& request, HttpResponse& response)
+{
+ if (!CheckUser(request, response))
+ return true;
+
+ Text content;
+ Text path = request.GetParam("path");
+ Text name = request.GetParam("name");
+
+ if (name.length()) {
+ BYTE* buffer = 0;
+ DataLoader* loader = DataLoader::GetLoader();
+
+ if (loader) {
+ loader->SetDataPath(path);
+ int len = loader->LoadBuffer(name, buffer);
+
+ if (len) {
+ content = Text((const char*) buffer, len);
+ }
+
+ loader->ReleaseBuffer(buffer);
+ loader->SetDataPath(0);
+ }
+ }
+
+ response.SetStatus(HttpResponse::SC_OK);
+ response.AddHeader("MIME-Version", "1.0");
+ response.AddHeader("Cache-Control", "no-cache");
+ response.AddHeader("Expires", "-1");
+ response.AddHeader("Content-Type", "text/plain");
+ response.SetContent(content);
+
+ return true;
+}
+
+// +-------------------------------------------------------------------+
+
+bool
+NetWebServlet::DoGet(HttpRequest& request, HttpResponse& response)
+{
+ Text content;
+ Text name = request.URI();
+ bool found = false;
+
+ if (name.length() > 4) {
+ char filename[256];
+ strcpy_s(filename, name.data() + 1); // skip leading '/'
+
+ FILE* f;
+ ::fopen_s(&f, filename, "rb");
+
+ if (f) {
+ ::fseek(f, 0, SEEK_END);
+ int len = ftell(f);
+ ::fseek(f, 0, SEEK_SET);
+
+ BYTE* buf = new BYTE[len];
+
+ ::fread(buf, len, 1, f);
+ ::fclose(f);
+
+ content = Text((const char*) buf, len);
+ delete [] buf;
+
+ found = true;
+ ::Print("weblog: 200 OK %s %d bytes\n", name.data(), len);
+ }
+ else {
+ ::Print("weblog: 404 Not Found %s\n", name.data());
+ }
+ }
+
+ if (found) {
+ Text content_type = "text/plain";
+
+ if (name.contains(".gif"))
+ content_type = "image/gif";
+ else if (name.contains(".jpg"))
+ content_type = "image/jpeg";
+ else if (name.contains(".htm"))
+ content_type = "text/html";
+
+ response.SetStatus(HttpResponse::SC_OK);
+ response.AddHeader("MIME-Version", "1.0");
+ response.AddHeader("Content-Type", content_type);
+ response.SetContent(content);
+ }
+ else {
+ response.SetStatus(HttpResponse::SC_NOT_FOUND);
+ }
+
+ return true;
+}