node_response.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. package core
  2. import (
  3. "bufio"
  4. "errors"
  5. "io/ioutil"
  6. "net/http"
  7. "strings"
  8. "time"
  9. "github.com/dop251/goja"
  10. "github.com/goccy/go-json"
  11. )
  12. // type Reason map[string]interface{}
  13. // func readEvent(body io.Reader) (string, error) {
  14. // var data []rune
  15. // bufReader := bufio.NewReader(body)
  16. // for {
  17. // r, _, err := bufReader.ReadRune()
  18. // if err != nil {
  19. // return "", err
  20. // }
  21. // if r != '\n' {
  22. // data = append(data, r)
  23. // } else {
  24. // return strings.Replace(string(data), "data: ", "", 1), nil
  25. // }
  26. // }
  27. // panic(string(data))
  28. // }
  29. func MakeResponseObject(vm *goja.Runtime, resp *http.Response, responseType string) (*goja.Object, error) {
  30. obj := vm.NewObject()
  31. var data []byte
  32. var err error
  33. obj.Set("status", resp.StatusCode)
  34. obj.Set("headers", vm.NewProxy(MakeHeadersObject(vm, resp.Header), &goja.ProxyTrapConfig{
  35. Get: func(target *goja.Object, property string, receiver goja.Value) (value goja.Value) {
  36. obj := target.Get(property)
  37. if obj != nil {
  38. return obj
  39. }
  40. result := target.Get("get").Export().(func(name string) string)(property)
  41. return vm.ToValue(result)
  42. },
  43. Set: func(target *goja.Object, property string, value, receiver goja.Value) (success bool) {
  44. target.Get("set").Export().(func(name, value string))(
  45. property, value.String(),
  46. )
  47. return true
  48. },
  49. }))
  50. if resp.Header.Get("Content-Type") == "text/event-stream" {
  51. var evc = make(chan interface{}, 100)
  52. var closed = false
  53. go func() {
  54. defer resp.Body.Close()
  55. // var data2 []rune
  56. var data []rune
  57. bufReader := bufio.NewReader(resp.Body)
  58. for {
  59. r, _, err := bufReader.ReadRune()
  60. if err != nil {
  61. evc <- err
  62. break
  63. }
  64. // data2 = append(data2, r)
  65. if r != '\n' {
  66. data = append(data, r)
  67. } else {
  68. event := strings.TrimSpace(strings.Replace(string(data), "data: ", "", 1))
  69. if event != "" {
  70. evc <- event
  71. }
  72. data = nil
  73. }
  74. }
  75. // fmt.Println(string(data2))
  76. time.Sleep(time.Minute * 5)
  77. if !closed {
  78. close(evc)
  79. evc = nil
  80. closed = true
  81. }
  82. }()
  83. obj.Set("on", func(event string) interface{} {
  84. switch event {
  85. case "data", "json":
  86. var rs = <-evc
  87. switch v := rs.(type) {
  88. case error:
  89. if !closed {
  90. close(evc)
  91. evc = nil
  92. closed = true
  93. }
  94. panic(Error(vm, v))
  95. case string:
  96. if event == "json" {
  97. var r interface{}
  98. err := json.Unmarshal([]byte([]byte(v)), &r)
  99. if err != nil {
  100. panic(Error(vm, err))
  101. }
  102. return r
  103. }
  104. return v
  105. }
  106. }
  107. return nil
  108. })
  109. return obj, err
  110. } else {
  111. defer resp.Body.Close()
  112. data, err = ioutil.ReadAll(resp.Body)
  113. if err != nil {
  114. return obj, err
  115. }
  116. }
  117. var body interface{}
  118. if Contains([]string{"blob", "arraybuffer"}, responseType) {
  119. body = data
  120. } else if Contains([]string{"text", "document"}, responseType) {
  121. body = string(data)
  122. } else if responseType == "json" {
  123. var v interface{}
  124. err := json.Unmarshal(data, &v)
  125. if err != nil { /////
  126. return obj, errors.New("请求返回数据不是json格式:" + string(data))
  127. } else {
  128. body = v
  129. }
  130. }
  131. if body == nil {
  132. contentType := resp.Header.Get("Content-Type")
  133. if strings.HasPrefix(contentType, "text/") {
  134. body = string(data)
  135. } else if strings.HasPrefix(contentType, "image/") {
  136. body = data
  137. }
  138. }
  139. if body == nil {
  140. isBinary := false
  141. for _, b := range data {
  142. if b < 32 || b > 126 {
  143. isBinary = true
  144. break
  145. }
  146. }
  147. if isBinary {
  148. body = data
  149. } else {
  150. body = string(data)
  151. }
  152. }
  153. obj.Set("body", body)
  154. obj.Set("getBody", func() interface{} {
  155. return body
  156. })
  157. obj.Set("json", func() interface{} {
  158. var v interface{}
  159. json.Unmarshal(data, &v)
  160. return v
  161. })
  162. obj.Set("text", func() string {
  163. return string(data)
  164. })
  165. return obj, nil
  166. }