From 05ffe948949abb7c1d67a40068050091ef4a2bdc Mon Sep 17 00:00:00 2001 From: cdle Date: Wed, 14 Jun 2023 20:50:09 +0800 Subject: [PATCH] x --- core/node_request.go | 86 ++++++++++++++++++------------------------ core/node_response.go | 16 +++----- core/node_transport.go | 2 +- core/plugin_utils.go | 26 ++++++------- 4 files changed, 55 insertions(+), 75 deletions(-) diff --git a/core/node_request.go b/core/node_request.go index e0eb7fa..12f72a9 100644 --- a/core/node_request.go +++ b/core/node_request.go @@ -14,8 +14,7 @@ import ( "github.com/goccy/go-json" ) -func fetch(vm *goja.Runtime, resolve func(result interface{}), reject func(reason interface{}), wts ...interface{}) interface{} { - var block = resolve == nil +func fetch(vm *goja.Runtime, wts ...interface{}) (interface{}, error) { var method = "get" var url = "" var req *http.Request @@ -93,22 +92,14 @@ func fetch(vm *goja.Runtime, resolve func(result interface{}), reject func(reaso var err error transport, err = GetTransport(url, user, password) if err != nil { - info := "proxy config error " + err.Error() - console.Error() - if block { - panic(Error(vm, info)) - } else { - reject(Error(vm, info)) - // return nil - } - return nil + return nil, err } } } } } method = strings.ToUpper(method) - + var err error if len(formData) > 0 { data := u.Values{} for key, value := range formData { @@ -125,10 +116,16 @@ func fetch(vm *goja.Runtime, resolve func(result interface{}), reject func(reaso } } - req, _ = http.NewRequest(method, url, strings.NewReader(data.Encode())) + req, err = http.NewRequest(method, url, strings.NewReader(data.Encode())) + if err != nil { + return nil, err + } req.Header.Set("Content-Type", "application/x-www-form-urlencoded") } else { - req, _ = http.NewRequest(method, url, bytes.NewBuffer([]byte(body))) + req, err = http.NewRequest(method, url, bytes.NewBuffer([]byte(body))) + if err != nil { + return nil, err + } if isJsonBody { req.Header.Set("Content-Type", "application/json") } @@ -158,41 +155,30 @@ func fetch(vm *goja.Runtime, resolve func(result interface{}), reject func(reaso } } rsp, err = client.Do(req) - if err == nil { - defer rsp.Body.Close() - rspObj = vm.NewProxy(MakeResponseObject(vm, reject, rsp, responseType), &goja.ProxyTrapConfig{ - Get: func(target *goja.Object, property string, receiver goja.Value) (value goja.Value) { - obj := target.Get(property) - if obj != nil { - return obj - } - switch property { - case "statusText", "statusMessage": - return vm.ToValue("") - case "statusCode": - return target.Get("status") - // case "body": - // return vm.ToValue(target.Get("getBody").Export().(func() interface{})()) - case "then": - return goja.Undefined() - } - console.Error("response has no property " + property) - return goja.Undefined() - }, - }) - if block { - return rspObj - } else { - resolve(rspObj) - - } - } else { - if block { - return rspObj - } else { - reject(Error(vm, err)) - - } + if err != nil { + return nil, err } - return nil + defer rsp.Body.Close() + obj, err := MakeResponseObject(vm, rsp, responseType) + rspObj = vm.NewProxy(obj, &goja.ProxyTrapConfig{ + Get: func(target *goja.Object, property string, receiver goja.Value) (value goja.Value) { + obj := target.Get(property) + if obj != nil { + return obj + } + switch property { + case "statusText", "statusMessage": + return vm.ToValue("") + case "statusCode": + return target.Get("status") + // case "body": + // return vm.ToValue(target.Get("getBody").Export().(func() interface{})()) + case "then": + return goja.Undefined() + } + console.Error("response has no property " + property) + return goja.Undefined() + }, + }) + return rspObj, err } diff --git a/core/node_response.go b/core/node_response.go index 9698358..8e77b69 100644 --- a/core/node_response.go +++ b/core/node_response.go @@ -11,12 +11,11 @@ import ( // type Reason map[string]interface{} -func MakeResponseObject(vm *goja.Runtime, reject func(reason interface{}), resp *http.Response, responseType string) *goja.Object { +func MakeResponseObject(vm *goja.Runtime, resp *http.Response, responseType string) (*goja.Object, error) { obj := vm.NewObject() data, err := ioutil.ReadAll(resp.Body) - if err != nil { - reject(Error(vm, err)) - return obj + if err != nil { /////// + return obj, err } var body interface{} if Contains([]string{"blob", "arraybuffer"}, responseType) { @@ -26,11 +25,8 @@ func MakeResponseObject(vm *goja.Runtime, reject func(reason interface{}), resp } else if responseType == "json" { var v interface{} err := json.Unmarshal(data, &v) - if err != nil { - // console.Error("response body is not json data") - // panic("response body is not json data") - // reject() - defer reject(Error(vm, "response body is not json data")) + if err != nil { ///// + return obj, err } else { body = v } @@ -89,5 +85,5 @@ func MakeResponseObject(vm *goja.Runtime, reject func(reason interface{}), resp return true }, })) - return obj + return obj, nil } diff --git a/core/node_transport.go b/core/node_transport.go index de877d0..d4e6843 100644 --- a/core/node_transport.go +++ b/core/node_transport.go @@ -12,7 +12,7 @@ import ( func GetTransport(proxyUrl string, user, password string) (*http.Transport, error) { var auth *proxy.Auth - if user != "" && password != "" { + if user != "" || password != "" { auth = &proxy.Auth{User: user, Password: password} } switch { diff --git a/core/plugin_utils.go b/core/plugin_utils.go index f931769..dcd807d 100644 --- a/core/plugin_utils.go +++ b/core/plugin_utils.go @@ -365,24 +365,22 @@ func SetPluginMethod(vm *goja.Runtime, uuid string, on_start bool, running func( }) vm.Set("fetch", func(wts ...interface{}) interface{} { promise, resolve, reject := vm.NewPromise() - func() { - func() { - v := recover() - if v != nil { - if err, ok := v.(error); ok { - reject(Error(vm, err)) - } else { - reject(Error(vm, fmt.Sprint(v))) - } - - } - }() - fetch(vm, resolve, reject, wts...) + go func() { + obj, err := fetch(vm, wts...) + if err != nil { + reject(err) + } else { + resolve(obj) + } }() return promise }) vm.Set("request", func(wts ...interface{}) interface{} { - return fetch(vm, nil, nil, wts...) + obj, err := fetch(vm, wts...) + if err != nil { + panic(Error(vm, err)) + } + return obj }) // for _, method := range []string{"get", "post", "delete", "put", "fetch"} { // vm.Set(method, )