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  // ---------------------------------------------------------------------------