|
|
package jsonrpc
import ( "context" "net/http"
"github.com/intel-go/fastjson" )
// Handler links a method of JSON-RPC request.
type Handler interface { ServeJSONRPC(c context.Context, params *fastjson.RawMessage) (result interface{}, err *Error) }
// ServeHTTP provides basic JSON-RPC handling.
func (mr *MethodRepository) ServeHTTP(w http.ResponseWriter, r *http.Request) {
rs, batch, err := ParseRequest(r) if err != nil { SendResponse(w, []*Response{ { Version: Version, Error: err, }, }, false) return }
resp := make([]*Response, len(rs)) for i := range rs { resp[i] = mr.InvokeMethod(r.Context(), rs[i]) }
if err := SendResponse(w, resp, batch); err != nil { w.WriteHeader(http.StatusInternalServerError) } }
// InvokeMethod invokes JSON-RPC method.
func (mr *MethodRepository) InvokeMethod(c context.Context, r *Request) *Response { var h Handler res := NewResponse(r) h, res.Error = mr.TakeMethod(r) if res.Error != nil { return res } res.Result, res.Error = h.ServeJSONRPC(WithRequestID(c, r.ID), r.Params) if res.Error != nil { res.Result = nil } return res }
|