gitee.com/liuxuezhan/go-micro-v1.18.0@v1.0.0/codec/jsonrpc/server.go (about) 1 package jsonrpc 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "io" 7 8 "gitee.com/liuxuezhan/go-micro-v1.18.0/codec" 9 ) 10 11 type serverCodec struct { 12 dec *json.Decoder // for reading JSON values 13 enc *json.Encoder // for writing JSON values 14 c io.Closer 15 16 // temporary work space 17 req serverRequest 18 resp serverResponse 19 } 20 21 type serverRequest struct { 22 Method string `json:"method"` 23 Params *json.RawMessage `json:"params"` 24 ID interface{} `json:"id"` 25 } 26 27 type serverResponse struct { 28 ID interface{} `json:"id"` 29 Result interface{} `json:"result"` 30 Error interface{} `json:"error"` 31 } 32 33 func newServerCodec(conn io.ReadWriteCloser) *serverCodec { 34 return &serverCodec{ 35 dec: json.NewDecoder(conn), 36 enc: json.NewEncoder(conn), 37 c: conn, 38 } 39 } 40 41 func (r *serverRequest) reset() { 42 r.Method = "" 43 if r.Params != nil { 44 *r.Params = (*r.Params)[0:0] 45 } 46 if r.ID != nil { 47 r.ID = nil 48 } 49 } 50 51 func (c *serverCodec) ReadHeader(m *codec.Message) error { 52 c.req.reset() 53 if err := c.dec.Decode(&c.req); err != nil { 54 return err 55 } 56 m.Method = c.req.Method 57 m.Id = fmt.Sprintf("%v", c.req.ID) 58 c.req.ID = nil 59 return nil 60 } 61 62 func (c *serverCodec) ReadBody(x interface{}) error { 63 if x == nil { 64 return nil 65 } 66 var params [1]interface{} 67 params[0] = x 68 return json.Unmarshal(*c.req.Params, ¶ms) 69 } 70 71 var null = json.RawMessage([]byte("null")) 72 73 func (c *serverCodec) Write(m *codec.Message, x interface{}) error { 74 var resp serverResponse 75 resp.ID = m.Id 76 resp.Result = x 77 if m.Error == "" { 78 resp.Error = nil 79 } else { 80 resp.Error = m.Error 81 } 82 return c.enc.Encode(resp) 83 } 84 85 func (c *serverCodec) Close() error { 86 return c.c.Close() 87 }