aboutsummaryrefslogtreecommitdiffhomepage
path: root/worker
diff options
context:
space:
mode:
Diffstat (limited to 'worker')
-rw-r--r--worker/Dockerfile13
-rw-r--r--worker/Makefile7
-rw-r--r--worker/go.mod3
-rw-r--r--worker/main.go57
4 files changed, 80 insertions, 0 deletions
diff --git a/worker/Dockerfile b/worker/Dockerfile
new file mode 100644
index 0000000..1d1523d
--- /dev/null
+++ b/worker/Dockerfile
@@ -0,0 +1,13 @@
+FROM golang:1.22.3 AS builder
+
+WORKDIR /build
+COPY . /build
+RUN go build -o /build/server .
+
+################################################################################
+FROM golang:1.22.3
+
+WORKDIR /app
+COPY --from=builder /build/server /app/server
+
+CMD ["/app/server"]
diff --git a/worker/Makefile b/worker/Makefile
new file mode 100644
index 0000000..4d6cf39
--- /dev/null
+++ b/worker/Makefile
@@ -0,0 +1,7 @@
+.PHONY: fmt
+fmt:
+ go fmt ./...
+
+.PHONY: check
+check:
+ go build -o /dev/null ./...
diff --git a/worker/go.mod b/worker/go.mod
new file mode 100644
index 0000000..456ce16
--- /dev/null
+++ b/worker/go.mod
@@ -0,0 +1,3 @@
+module github.com/nsfisis/iosdc-2024-albatross/worker
+
+go 1.22.3
diff --git a/worker/main.go b/worker/main.go
new file mode 100644
index 0000000..0a52b0e
--- /dev/null
+++ b/worker/main.go
@@ -0,0 +1,57 @@
+package main
+
+import (
+ "encoding/json"
+ "net/http"
+ "strconv"
+ "time"
+)
+
+type RequestBody struct {
+ Code string `json:"code"`
+ Stdin string `json:"stdin"`
+}
+
+type ResponseBody struct {
+ Result string `json:"result"`
+ Stdout string `json:"stdout"`
+ Stderr string `json:"stderr"`
+}
+
+func doExec(code string, stdin string, maxDuration time.Duration) ResponseBody {
+ _ = code
+ _ = stdin
+ _ = maxDuration
+
+ return ResponseBody{
+ Result: "success",
+ Stdout: "42",
+ Stderr: "",
+ }
+}
+
+func execHandler(w http.ResponseWriter, r *http.Request) {
+ maxDurationStr := r.URL.Query().Get("max_duration")
+ maxDuration, err := strconv.Atoi(maxDurationStr)
+ if err != nil || maxDuration <= 0 {
+ http.Error(w, "Invalid max_duration parameter", http.StatusBadRequest)
+ return
+ }
+
+ var reqBody RequestBody
+ err = json.NewDecoder(r.Body).Decode(&reqBody)
+ if err != nil {
+ http.Error(w, "Invalid request body", http.StatusBadRequest)
+ return
+ }
+
+ resBody := doExec(reqBody.Code, reqBody.Stdin, time.Duration(maxDuration)*time.Second)
+
+ w.Header().Set("Content-Type", "application/json")
+ json.NewEncoder(w).Encode(resBody)
+}
+
+func main() {
+ http.HandleFunc("/api/exec", execHandler)
+ http.ListenAndServe(":80", nil)
+}