readRequest requests the next (batch) request from the codec. It will return the collection of requests, an indication if the request was a batch, the invalid request identifier and an error when the request could not be read/parsed.
(codec ServerCodec)
| 375 | // of requests, an indication if the request was a batch, the invalid request identifier and an |
| 376 | // error when the request could not be read/parsed. |
| 377 | func (s *Server) readRequest(codec ServerCodec) ([]*serverRequest, bool, Error) { |
| 378 | reqs, batch, err := codec.ReadRequestHeaders() |
| 379 | if err != nil { |
| 380 | return nil, batch, err |
| 381 | } |
| 382 | |
| 383 | requests := make([]*serverRequest, len(reqs)) |
| 384 | |
| 385 | // verify requests |
| 386 | for i, r := range reqs { |
| 387 | var ok bool |
| 388 | var svc *service |
| 389 | |
| 390 | if r.err != nil { |
| 391 | requests[i] = &serverRequest{id: r.id, err: r.err} |
| 392 | continue |
| 393 | } |
| 394 | |
| 395 | if r.isPubSub && strings.HasSuffix(r.method, unsubscribeMethodSuffix) { |
| 396 | requests[i] = &serverRequest{id: r.id, isUnsubscribe: true} |
| 397 | argTypes := []reflect.Type{reflect.TypeOf("")} // expect subscription id as first arg |
| 398 | if args, err := codec.ParseRequestArguments(argTypes, r.params); err == nil { |
| 399 | requests[i].args = args |
| 400 | } else { |
| 401 | requests[i].err = &invalidParamsError{err.Error()} |
| 402 | } |
| 403 | continue |
| 404 | } |
| 405 | |
| 406 | if svc, ok = s.services[r.service]; !ok { // rpc method isn't available |
| 407 | requests[i] = &serverRequest{id: r.id, err: &methodNotFoundError{r.service, r.method}} |
| 408 | continue |
| 409 | } |
| 410 | |
| 411 | if r.isPubSub { // eth_subscribe, r.method contains the subscription method name |
| 412 | if callb, ok := svc.subscriptions[r.method]; ok { |
| 413 | requests[i] = &serverRequest{id: r.id, svcname: svc.name, callb: callb} |
| 414 | if r.params != nil && len(callb.argTypes) > 0 { |
| 415 | argTypes := []reflect.Type{reflect.TypeOf("")} |
| 416 | argTypes = append(argTypes, callb.argTypes...) |
| 417 | if args, err := codec.ParseRequestArguments(argTypes, r.params); err == nil { |
| 418 | requests[i].args = args[1:] // first one is service.method name which isn't an actual argument |
| 419 | } else { |
| 420 | requests[i].err = &invalidParamsError{err.Error()} |
| 421 | } |
| 422 | } |
| 423 | } else { |
| 424 | requests[i] = &serverRequest{id: r.id, err: &methodNotFoundError{r.service, r.method}} |
| 425 | } |
| 426 | continue |
| 427 | } |
| 428 | |
| 429 | if callb, ok := svc.callbacks[r.method]; ok { // lookup RPC method |
| 430 | requests[i] = &serverRequest{id: r.id, svcname: svc.name, callb: callb} |
| 431 | if r.params != nil && len(callb.argTypes) > 0 { |
| 432 | if args, err := codec.ParseRequestArguments(callb.argTypes, r.params); err == nil { |
| 433 | requests[i].args = args |
| 434 | } else { |
no test coverage detected