BaseBandRewrite/SimpleServer/server.spl
2024-10-13 23:22:10 +02:00

89 lines
2.1 KiB
Text

"#httpserver/base.spl" import
"#httpserver/static.spl" import
use net:http:Server
1048576 net:http:server:=bufsize
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
}
}
construct Refreshed {
ok
;
construct { this | with this ;
"true" this:=ok
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;
}
"/refresh" client:path eq if {
"refresh" println;
client:server:cached-files if {
client:server:cached-files:clear;
}
Refreshed: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;
}
}