From 0f32cfa9b8044e798c1c6088ab852d748c3788d6 Mon Sep 17 00:00:00 2001 From: TudbuT Date: Sun, 13 Oct 2024 19:10:42 +0200 Subject: [PATCH] begin SimpleServer impl --- SimpleServer/index.html | 21 +++++++++++++ SimpleServer/server.spl | 70 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 SimpleServer/index.html create mode 100644 SimpleServer/server.spl diff --git a/SimpleServer/index.html b/SimpleServer/index.html new file mode 100644 index 0000000..d0ab4b2 --- /dev/null +++ b/SimpleServer/index.html @@ -0,0 +1,21 @@ + + + + BaseBand download server + + +

BaseBand downloads

+ + This website serves the version information and downloads of BaseBand. + +

Artifacts

+ + +

Version information

+ + /latest + diff --git a/SimpleServer/server.spl b/SimpleServer/server.spl new file mode 100644 index 0000000..43bcbb3 --- /dev/null +++ b/SimpleServer/server.spl @@ -0,0 +1,70 @@ + +"#httpserver/base.spl" import +"#httpserver/static.spl" import +use net:http:Server + +construct Latest { + release + main + loader + ; + construct { this | with this ; + func read-commit { s | with file ; + [ "unzip" "-p" file "commit" ] StreamTypes:cmd:create:read-to-end<32>:to-str + } + "BaseBand-release.jar" read-commit this:=release + "BaseBand-main.jar" read-commit this:=main + "BaseBand-Loader.jar" read-commit this:=loader + this properties props-to-json + } +} + +construct Object404 { + error + ; + construct { this | with this ; + "Endpoint not found" this:=error + this properties props-to-json + } +} + +func props-to-json { | with props ; + "{" + props + :iter + :filter<{ b | :to-stack pop with key ; key ":" eq not key ";" eq not and }> + :map<{ s | + :to-stack with key value ; + "\"" + key :replace<"\\" "\\\\">:replace<"\"" "\\\""> concat + "\": \"" concat + value _str :replace<"\\" "\\\\">:replace<"\"" "\\\""> concat + "\"" concat + }> + :join<", "> concat + "}" concat +} + +func main { exitcode | with args ; + def server Server:new<"::0" 40002> =server + while { 1 } { + server:accept &handle-client fork; + } +} + +func handle-client { | with client ; + client:read; + "index.html" "/" client:serve-html-cached; + + "BaseBand-release.jar" "/download/client/release" client:serve-file-cached;<"application/octet-stream"> + "BaseBand-main.jar" "/download/client/main" client:serve-file-cached;<"application/octet-stream"> + "BaseBand-Loader.jar" "/download/loader" client:serve-file-cached;<"application/octet-stream"> + + "/latest" client:path eq if { + Latest:new client:write-ok:write-content-type<"application/json">:write-str-body:finish; + } + + client:wrote-body not if { + Object404:new client:write-head<404 "Not Found">:write-content-type<"application/json">:write-str-body:finish; + } +}