in protocol/jsonrpc/json.go [214:263]
func (r *serverRequest) UnmarshalJSON(raw []byte) error {
r.reset()
type req *serverRequest
// Attention: if do not define a new struct named @req, the json.Unmarshal will invoke
// (*serverRequest)UnmarshalJSON recursively.
if err := json.Unmarshal(raw, req(r)); err != nil {
return perrors.New("bad request")
}
o := make(map[string]*json.RawMessage)
if err := json.Unmarshal(raw, &o); err != nil {
return perrors.New("bad request")
}
if o["jsonrpc"] == nil || o["method"] == nil {
return perrors.New("bad request")
}
_, okID := o["id"]
_, okParams := o["params"]
if len(o) == 3 && !(okID || okParams) || len(o) == 4 && !(okID && okParams) || len(o) > 4 {
return perrors.New("bad request")
}
if r.Version != Version {
return perrors.New("bad request")
}
if okParams {
if r.Params == nil || len(*r.Params) == 0 {
return perrors.New("bad request")
}
switch []byte(*r.Params)[0] {
case '[', '{':
default:
return perrors.New("bad request")
}
}
if okID && r.ID == nil {
r.ID = &null
}
if okID {
if len(*r.ID) == 0 {
return perrors.New("bad request")
}
switch []byte(*r.ID)[0] {
case 't', 'f', '{', '[':
return perrors.New("bad request")
}
}
return nil
}