github.com/qiniu/x@v1.11.9/rpc/gob/gobrpc_client.go (about) 1 package gob 2 3 import ( 4 "bytes" 5 "encoding/gob" 6 "io" 7 "io/ioutil" 8 "net/http" 9 "strconv" 10 11 "github.com/qiniu/x/rpc" 12 13 . "context" 14 ) 15 16 // --------------------------------------------------------------------------- 17 18 func Register(value interface{}) { 19 20 gob.Register(value) 21 } 22 23 func RegisterName(name string, value interface{}) { 24 25 gob.RegisterName(name, value) 26 } 27 28 // --------------------------------------------------------------------------- 29 30 func ResponseError(resp *http.Response) (err error) { 31 32 e := &rpc.ErrorInfo{ 33 Reqid: resp.Header.Get("X-Reqid"), 34 Code: resp.StatusCode, 35 } 36 if resp.StatusCode > 299 { 37 e.Err = resp.Header.Get("X-Err") 38 if errno := resp.Header.Get("X-Errno"); errno != "" { 39 v, err2 := strconv.ParseInt(errno, 10, 32) 40 if err2 != nil { 41 e.Err = err2.Error() 42 } 43 e.Errno = int(v) 44 } 45 } 46 return e 47 } 48 49 func CallRet(ctx Context, ret interface{}, resp *http.Response) (err error) { 50 51 defer func() { 52 io.Copy(ioutil.Discard, resp.Body) 53 resp.Body.Close() 54 }() 55 56 if resp.StatusCode/100 == 2 { 57 if ret != nil && resp.ContentLength != 0 { 58 err = gob.NewDecoder(resp.Body).Decode(ret) 59 if err != nil { 60 return 61 } 62 } 63 if resp.StatusCode == 200 { 64 return nil 65 } 66 } 67 return ResponseError(resp) 68 } 69 70 // --------------------------------------------------------------------------- 71 72 type Client struct { 73 rpc.Client 74 } 75 76 var ( 77 DefaultClient = Client{rpc.DefaultClient} 78 ) 79 80 func (r Client) Call( 81 ctx Context, ret interface{}, method, url1 string) (err error) { 82 83 resp, err := r.DoRequestWith(ctx, method, url1, "application/gob", nil, 0) 84 if err != nil { 85 return err 86 } 87 return CallRet(ctx, ret, resp) 88 } 89 90 func (r Client) CallWithGob( 91 ctx Context, ret interface{}, method, url1 string, params interface{}) (err error) { 92 93 var b bytes.Buffer 94 err = gob.NewEncoder(&b).Encode(params) 95 if err != nil { 96 return err 97 } 98 99 resp, err := r.DoRequestWith(ctx, method, url1, "application/gob", &b, b.Len()) 100 if err != nil { 101 return err 102 } 103 return CallRet(ctx, ret, resp) 104 } 105 106 // ---------------------------------------------------------------------------