controller.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. package ctl
  2. import (
  3. "Yunlot/RunCode/context"
  4. service "Yunlot/RunCode/service"
  5. context2 "context"
  6. "fmt"
  7. "io/ioutil"
  8. "net/http"
  9. "os"
  10. "strings"
  11. "time"
  12. )
  13. var Go_Main string
  14. func init() {
  15. // 获取 执行文件
  16. content, err := os.ReadFile("./RunCode/config/main.txt")
  17. if err != nil {
  18. panic(any(err))
  19. }
  20. //fmt.Println(string(content))
  21. Go_Main = string(content)
  22. }
  23. // LanguagesController Get /languages
  24. func LanguagesController(writer http.ResponseWriter, request *http.Request) {
  25. ctx := &context.Context{Writer: writer, Req: request}
  26. if !ctx.IsGet() {
  27. ctx.NotAllow()
  28. return
  29. }
  30. var languages []string
  31. for lang := range service.DockerRunner.Runners {
  32. languages = append(languages, lang)
  33. }
  34. _ = ctx.JSON(http.StatusOK, languages)
  35. return
  36. }
  37. // RunController Post /run?lang={lang}
  38. func RunController(writer http.ResponseWriter, request *http.Request) {
  39. ctx := &context.Context{Writer: writer, Req: request}
  40. if !ctx.IsPost() {
  41. ctx.NotAllow()
  42. return
  43. }
  44. lang := ctx.Get("lang", "")
  45. if lang == "" {
  46. ctx.Bad("lang 参数不能为空!")
  47. return
  48. } else {
  49. if !service.DockerRunner.RunnerExists(lang) {
  50. ctx.Bad(lang + "语言编译异常!")
  51. return
  52. }
  53. body, _ := ioutil.ReadAll(request.Body)
  54. if len(body) == 0 {
  55. ctx.Bad("Body 内容为空!")
  56. return
  57. }
  58. code := "package main\n" + string(body) + Go_Main
  59. cancelCtx, cancelFn := context2.WithTimeout(context2.Background(), time.Second*time.Duration(service.DockerRunner.Timeout))
  60. defer cancelFn()
  61. content, err := service.DockerRunner.Exec(cancelCtx, lang, code)
  62. if err == nil {
  63. content_list := strings.Split(string(content), "|-=&")
  64. fmt.Println("content_list:", content_list)
  65. if len(content_list) != 4 {
  66. ctx.Error("解析错误!!!" + string(content))
  67. return
  68. }
  69. ctx.RunOK(lang, "success", content_list[1], content_list[2], content_list[3])
  70. return
  71. }
  72. if err == service.TimeoutError {
  73. ctx.Timeout("运行超时!")
  74. return
  75. }
  76. ctx.Error(string(content))
  77. }
  78. }
  79. // RunController Post /run?lang={lang}
  80. func BuildController(writer http.ResponseWriter, request *http.Request) {
  81. ctx := &context.Context{Writer: writer, Req: request}
  82. if !ctx.IsPost() {
  83. ctx.NotAllow()
  84. return
  85. }
  86. lang := ctx.Get("lang", "")
  87. if lang == "" {
  88. ctx.Bad("lang 参数不能为空!")
  89. return
  90. } else {
  91. if !service.DockerRunner.RunnerExists(lang) {
  92. ctx.Bad(lang + "语言编译异常!")
  93. return
  94. }
  95. body, _ := ioutil.ReadAll(request.Body)
  96. if len(body) == 0 {
  97. ctx.Bad("Body 内容为空!")
  98. return
  99. }
  100. code := "package main\n" + string(body)
  101. cancelCtx, cancelFn := context2.WithTimeout(context2.Background(), time.Second*time.Duration(service.DockerRunner.Timeout))
  102. defer cancelFn()
  103. name_so := time.Now().UnixMilli()
  104. //fmt.Println("code:",code)
  105. content, err := service.DockerRunner.Build(cancelCtx, name_so, lang, code)
  106. fmt.Println("content:", content)
  107. if len(content) > 0 {
  108. ctx.Error(string(content))
  109. return
  110. }
  111. if err == nil {
  112. ctx.RunOK(lang, fmt.Sprintf("%d", name_so), "", "", "")
  113. return
  114. }
  115. // 编译超时
  116. //if err == service.TimeoutError {
  117. // ctx.Timeout("运行超时!")
  118. // return
  119. //}
  120. ctx.Error("E:" + string(content))
  121. }
  122. }