script.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package clashapi
  2. import (
  3. "net/http"
  4. "github.com/go-chi/chi/v5"
  5. "github.com/go-chi/render"
  6. )
  7. func scriptRouter() http.Handler {
  8. r := chi.NewRouter()
  9. r.Post("/", testScript)
  10. r.Patch("/", patchScript)
  11. return r
  12. }
  13. /*type TestScriptRequest struct {
  14. Script *string `json:"script"`
  15. Metadata C.Metadata `json:"metadata"`
  16. }*/
  17. func testScript(w http.ResponseWriter, r *http.Request) {
  18. /* req := TestScriptRequest{}
  19. if err := render.DecodeJSON(r.Body, &req); err != nil {
  20. render.Status(r, http.StatusBadRequest)
  21. render.JSON(w, r, ErrBadRequest)
  22. return
  23. }
  24. fn := tunnel.ScriptFn()
  25. if req.Script == nil && fn == nil {
  26. render.Status(r, http.StatusBadRequest)
  27. render.JSON(w, r, newError("should send `script`"))
  28. return
  29. }
  30. if !req.Metadata.Valid() {
  31. render.Status(r, http.StatusBadRequest)
  32. render.JSON(w, r, newError("metadata not valid"))
  33. return
  34. }
  35. if req.Script != nil {
  36. var err error
  37. fn, err = script.ParseScript(*req.Script)
  38. if err != nil {
  39. render.Status(r, http.StatusBadRequest)
  40. render.JSON(w, r, newError(err.Error()))
  41. return
  42. }
  43. }
  44. ctx, _ := script.MakeContext(tunnel.ProxyProviders(), tunnel.RuleProviders())
  45. thread := &starlark.Thread{}
  46. ret, err := starlark.Call(thread, fn, starlark.Tuple{ctx, script.MakeMetadata(&req.Metadata)}, nil)
  47. if err != nil {
  48. render.Status(r, http.StatusBadRequest)
  49. render.JSON(w, r, newError(err.Error()))
  50. return
  51. }
  52. elm, ok := ret.(starlark.String)
  53. if !ok {
  54. render.Status(r, http.StatusBadRequest)
  55. render.JSON(w, r, "script fn must return a string")
  56. return
  57. }
  58. render.JSON(w, r, render.M{
  59. "result": string(elm),
  60. })*/
  61. render.Status(r, http.StatusBadRequest)
  62. render.JSON(w, r, newError("not implemented"))
  63. }
  64. type PatchScriptRequest struct {
  65. Script string `json:"script"`
  66. }
  67. func patchScript(w http.ResponseWriter, r *http.Request) {
  68. /*req := PatchScriptRequest{}
  69. if err := render.DecodeJSON(r.Body, &req); err != nil {
  70. render.Status(r, http.StatusBadRequest)
  71. render.JSON(w, r, ErrBadRequest)
  72. return
  73. }
  74. fn, err := script.ParseScript(req.Script)
  75. if err != nil {
  76. render.Status(r, http.StatusBadRequest)
  77. render.JSON(w, r, newError(err.Error()))
  78. return
  79. }
  80. tunnel.UpdateScript(fn)*/
  81. render.NoContent(w, r)
  82. }