123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- 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))
- }
- }
|