From 4374d8c5d98fbc9e2589074cd0f05266db6a10e1 Mon Sep 17 00:00:00 2001 From: unwox Date: Thu, 13 Jun 2024 13:12:17 +0600 Subject: implement unsafe evaluation of lua code in workers --- main.go | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) (limited to 'main.go') diff --git a/main.go b/main.go index a9b47b8..7575c11 100644 --- a/main.go +++ b/main.go @@ -10,29 +10,30 @@ import ( func main() { rch := make(chan *WorkerRequest, 4096) mux := http.NewServeMux() + wrks := []*Worker{} for i := 0; i < 8; i++ { log.Printf("worker %d started\n", i) - w := NewWorker(rch) - err := w.Start("init.lua") + wrk := NewWorker(rch) + err := wrk.Start("init.lua") if err != nil { log.Fatal(err) } if i == 0 { - for _, route := range w.ListRoutes() { + for _, route := range wrk.ListRoutes() { // we need to copy route otherwise it's going // to change with every next iteration route := route mux.HandleFunc( route, - func (wr http.ResponseWriter, r *http.Request) { + func (w http.ResponseWriter, r *http.Request) { start := time.Now() - resCh := w.Request(route, r) + resCh := wrk.Request(route, r, *debug) res := <- resCh for k, h := range res.Headers { - wr.Header().Set(k, h) + w.Header().Set(k, h) } - wr.WriteHeader(int(res.Code)) - fmt.Fprint(wr, string(res.Body)) + w.WriteHeader(int(res.Code)) + fmt.Fprint(w, string(res.Body)) log.Printf( "%s %s (%s) -> %d\n", r.Method, @@ -44,9 +45,23 @@ func main() { ) } } - go w.Listen() - defer w.Stop() + wrks = append(wrks, wrk) + go wrk.Listen() + defer wrk.Stop() } + go func () { + reader := bufio.NewReader(os.Stdin) + for { + text, _ := reader.ReadString('\n') + for _, w := range wrks { + err := w.Eval(text) + if err != nil { + log.Printf("error: %s\n", err) + break + } + } + } + }() fmt.Println("luna is running...") log.Fatal(http.ListenAndServe("127.0.0.1:3002", mux)) } -- cgit v1.2.3