reso-execution/main.go
2024-03-16 08:15:31 -07:00

104 lines
2.5 KiB
Go

package main
/*
fn fetch_python_location() -> String {
let output = Command::new("which python")
.output()
.expect("Failed to execute command");
let output = String::from_utf8_lossy(&output.stdout);
output.trim().to_string()
output
}
*/
import (
"fmt"
"log"
"net/http"
"os"
"strings"
"github.com/gorilla/websocket"
)
const (
WS_HOST = "0.0.0.0"
WS_PORT = 5000
)
var Upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool { return true },
}
func main() {
http.HandleFunc("/", HandleWs)
// output handlers
http.HandleFunc("/lang", HandleLang)
// if ./workspace/ directory does not exist, create it
if _, err := os.Stat("./workspace/"); os.IsNotExist(err) {
os.Mkdir("./workspace/", 0755)
}
addr := fmt.Sprintf("%s:%d", WS_HOST, WS_PORT)
log.Println("Server started at", addr)
log.Fatal(http.ListenAndServe(addr, nil))
}
func HandleWs(w http.ResponseWriter, r *http.Request) {
log.Println("[/] Connection from", r.RemoteAddr)
c, err := Upgrader.Upgrade(w, r, nil)
if err != nil {
log.Print("upgrade:", err)
return
}
defer c.Close()
for {
// get the first line of the message from the client
_, message, err := c.ReadMessage()
if err != nil {
log.Println("read:", err)
break
}
// print the message to the console
log.Printf("recv: %s", message)
// seperate message into chunks by newline
msg := strings.Split(string(message), "\n")
handleCase(msg[0], strings.Join(msg[1:], "\n"))
c.WriteMessage(websocket.TextMessage, []byte("Forwarding to output handler: "+msg[0]+"\n"))
}
}
func HandleLang(w http.ResponseWriter, r *http.Request) {
log.Println("[/lang] Connection from", r.RemoteAddr)
// upgrade the connection to a websocket
c, err := Upgrader.Upgrade(w, r, nil)
if err != nil {
return
}
// defer c.Close()
c.WriteMessage(websocket.TextMessage, []byte("Connected to output handler"))
go func() {
for {
// wait for message from client
_, message, err := c.ReadMessage()
if err != nil {
log.Println("Error reading from client", err)
break
}
// convert message to string
msg := string(message)
log.Println("Received message from client:", msg)
// convert pyReader to string
newstr := make([]byte, 1024)
n, err := pyReader.Read(newstr)
if err != nil {
log.Println("Error reading from pyReader")
break
}
c.WriteMessage(websocket.TextMessage, newstr[:n])
}
}()
}