agi.serverless.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package agi
  2. import (
  3. "io/ioutil"
  4. "net/http"
  5. "github.com/robertkrimen/otto"
  6. user "imuslab.com/arozos/mod/user"
  7. "imuslab.com/arozos/mod/utils"
  8. )
  9. /*
  10. AGI Serverless Request Handler
  11. This script allow AGI script to access raw GET / POST parameters for serverless applications
  12. Author: tobychui
  13. */
  14. func (g *Gateway) injectServerlessFunctions(vm *otto.Otto, scriptFile string, scriptScope string, u *user.User, r *http.Request) {
  15. vm.Set("REQ_METHOD", r.Method)
  16. vm.Set("getPara", func(call otto.FunctionCall) otto.Value {
  17. key, _ := call.Argument(0).ToString()
  18. if key == "" {
  19. return otto.NullValue()
  20. }
  21. value, err := utils.Mv(r, key, false)
  22. if err != nil {
  23. return otto.NullValue()
  24. }
  25. r, err := vm.ToValue(value)
  26. if err != nil {
  27. return otto.NullValue()
  28. }
  29. return r
  30. })
  31. vm.Set("postPara", func(call otto.FunctionCall) otto.Value {
  32. key, _ := call.Argument(0).ToString()
  33. if key == "" {
  34. return otto.NullValue()
  35. }
  36. value, err := utils.Mv(r, key, true)
  37. if err != nil {
  38. return otto.NullValue()
  39. }
  40. r, err := vm.ToValue(value)
  41. if err != nil {
  42. return otto.NullValue()
  43. }
  44. return r
  45. })
  46. vm.Set("readBody", func(call otto.FunctionCall) otto.Value {
  47. if r.Body == nil {
  48. return otto.NullValue()
  49. }
  50. bodyContent, err := ioutil.ReadAll(r.Body)
  51. if err != nil {
  52. return otto.NullValue()
  53. }
  54. r, err := vm.ToValue(string(bodyContent))
  55. if err != nil {
  56. return otto.NullValue()
  57. }
  58. return r
  59. })
  60. }