package ctl import ( "Yunlot/RunCode/context" service "Yunlot/RunCode/service" context2 "context" "fmt" "io/ioutil" "net/http" "os" "strings" "time" ) var Go_Main string func init() { // 获取 执行文件 content, err := os.ReadFile("./RunCode/config/main.txt") if err != nil { panic(any(err)) } //fmt.Println(string(content)) Go_Main = string(content) } // LanguagesController Get /languages func LanguagesController(writer http.ResponseWriter, request *http.Request) { ctx := &context.Context{Writer: writer, Req: request} if !ctx.IsGet() { ctx.NotAllow() return } var languages []string for lang := range service.DockerRunner.Runners { languages = append(languages, lang) } _ = ctx.JSON(http.StatusOK, languages) return } // RunController Post /run?lang={lang} func RunController(writer http.ResponseWriter, request *http.Request) { ctx := &context.Context{Writer: writer, Req: request} if !ctx.IsPost() { ctx.NotAllow() return } lang := ctx.Get("lang", "") if lang == "" { ctx.Bad("lang 参数不能为空!") return } else { if !service.DockerRunner.RunnerExists(lang) { ctx.Bad(lang + "语言编译异常!") return } body, _ := ioutil.ReadAll(request.Body) if len(body) == 0 { ctx.Bad("Body 内容为空!") return } code := "package main\n" + string(body) + Go_Main cancelCtx, cancelFn := context2.WithTimeout(context2.Background(), time.Second*time.Duration(service.DockerRunner.Timeout)) defer cancelFn() content, err := service.DockerRunner.Exec(cancelCtx, lang, code) if err == nil { content_list := strings.Split(string(content), "|-=&") fmt.Println("content_list:", content_list) if len(content_list) != 4 { ctx.Error("解析错误!!!" + string(content)) return } ctx.RunOK(lang, "success", content_list[1], content_list[2], content_list[3]) return } if err == service.TimeoutError { ctx.Timeout("运行超时!") return } ctx.Error(string(content)) } } // RunController Post /run?lang={lang} func BuildController(writer http.ResponseWriter, request *http.Request) { ctx := &context.Context{Writer: writer, Req: request} if !ctx.IsPost() { ctx.NotAllow() return } lang := ctx.Get("lang", "") if lang == "" { ctx.Bad("lang 参数不能为空!") return } else { if !service.DockerRunner.RunnerExists(lang) { ctx.Bad(lang + "语言编译异常!") return } body, _ := ioutil.ReadAll(request.Body) if len(body) == 0 { ctx.Bad("Body 内容为空!") return } code := "package main\n" + string(body) cancelCtx, cancelFn := context2.WithTimeout(context2.Background(), time.Second*time.Duration(service.DockerRunner.Timeout)) defer cancelFn() name_so := time.Now().UnixMilli() //fmt.Println("code:",code) content, err := service.DockerRunner.Build(cancelCtx, name_so, lang, code) fmt.Println("content:", content) if len(content) > 0 { ctx.Error(string(content)) return } if err == nil { ctx.RunOK(lang, fmt.Sprintf("%d", name_so), "", "", "") return } // 编译超时 //if err == service.TimeoutError { // ctx.Timeout("运行超时!") // return //} ctx.Error("E:" + string(content)) } }