diff options
author | Daniel A. Nagy <nagy.da@gmail.com> | 2015-05-11 18:47:14 +0800 |
---|---|---|
committer | Daniel A. Nagy <nagy.da@gmail.com> | 2015-05-11 18:47:14 +0800 |
commit | a9e1d38612cfde56c285a5de5b5bfe5326bdc9b5 (patch) | |
tree | 6c16d3e2b216fdf0027a477a8975c9052930e34a /rpc | |
parent | 1fe70a66ba2ef0f148affa7a72b4e65023474859 (diff) | |
parent | 5176fbc6faaa5e7f0305ad7f2b896c092781deaa (diff) | |
download | dexon-a9e1d38612cfde56c285a5de5b5bfe5326bdc9b5.tar dexon-a9e1d38612cfde56c285a5de5b5bfe5326bdc9b5.tar.gz dexon-a9e1d38612cfde56c285a5de5b5bfe5326bdc9b5.tar.bz2 dexon-a9e1d38612cfde56c285a5de5b5bfe5326bdc9b5.tar.lz dexon-a9e1d38612cfde56c285a5de5b5bfe5326bdc9b5.tar.xz dexon-a9e1d38612cfde56c285a5de5b5bfe5326bdc9b5.tar.zst dexon-a9e1d38612cfde56c285a5de5b5bfe5326bdc9b5.zip |
Merge branch 'develop' of github.com:ethereum/go-ethereum into develop
Conflicts:
rpc/jeth.go
Diffstat (limited to 'rpc')
-rw-r--r-- | rpc/api.go | 33 | ||||
-rw-r--r-- | rpc/http.go | 2 | ||||
-rw-r--r-- | rpc/jeth.go | 2 | ||||
-rw-r--r-- | rpc/types.go | 16 |
4 files changed, 52 insertions, 1 deletions
diff --git a/rpc/api.go b/rpc/api.go index 7fab589f2..309c161ad 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -450,10 +450,18 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err *reply = newHexData(res) case "shh_version": + // Short circuit if whisper is not running + if api.xeth().Whisper() == nil { + return NewNotAvailableError(req.Method, "whisper offline") + } // Retrieves the currently running whisper protocol version *reply = api.xeth().WhisperVersion() case "shh_post": + // Short circuit if whisper is not running + if api.xeth().Whisper() == nil { + return NewNotAvailableError(req.Method, "whisper offline") + } // Injects a new message into the whisper network args := new(WhisperMessageArgs) if err := json.Unmarshal(req.Params, &args); err != nil { @@ -466,10 +474,18 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err *reply = true case "shh_newIdentity": + // Short circuit if whisper is not running + if api.xeth().Whisper() == nil { + return NewNotAvailableError(req.Method, "whisper offline") + } // Creates a new whisper identity to use for sending/receiving messages *reply = api.xeth().Whisper().NewIdentity() case "shh_hasIdentity": + // Short circuit if whisper is not running + if api.xeth().Whisper() == nil { + return NewNotAvailableError(req.Method, "whisper offline") + } // Checks if an identity if owned or not args := new(WhisperIdentityArgs) if err := json.Unmarshal(req.Params, &args); err != nil { @@ -478,6 +494,10 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err *reply = api.xeth().Whisper().HasIdentity(args.Identity) case "shh_newFilter": + // Short circuit if whisper is not running + if api.xeth().Whisper() == nil { + return NewNotAvailableError(req.Method, "whisper offline") + } // Create a new filter to watch and match messages with args := new(WhisperFilterArgs) if err := json.Unmarshal(req.Params, &args); err != nil { @@ -487,6 +507,10 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err *reply = newHexNum(big.NewInt(int64(id)).Bytes()) case "shh_uninstallFilter": + // Short circuit if whisper is not running + if api.xeth().Whisper() == nil { + return NewNotAvailableError(req.Method, "whisper offline") + } // Remove an existing filter watching messages args := new(FilterIdArgs) if err := json.Unmarshal(req.Params, &args); err != nil { @@ -495,6 +519,10 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err *reply = api.xeth().UninstallWhisperFilter(args.Id) case "shh_getFilterChanges": + // Short circuit if whisper is not running + if api.xeth().Whisper() == nil { + return NewNotAvailableError(req.Method, "whisper offline") + } // Retrieve all the new messages arrived since the last request args := new(FilterIdArgs) if err := json.Unmarshal(req.Params, &args); err != nil { @@ -503,12 +531,17 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err *reply = api.xeth().WhisperMessagesChanged(args.Id) case "shh_getMessages": + // Short circuit if whisper is not running + if api.xeth().Whisper() == nil { + return NewNotAvailableError(req.Method, "whisper offline") + } // Retrieve all the cached messages matching a specific, existing filter args := new(FilterIdArgs) if err := json.Unmarshal(req.Params, &args); err != nil { return err } *reply = api.xeth().WhisperMessages(args.Id) + case "eth_hashrate": *reply = newHexNum(api.xeth().HashRate()) diff --git a/rpc/http.go b/rpc/http.go index 4760601d8..c5bb10c80 100644 --- a/rpc/http.go +++ b/rpc/http.go @@ -116,7 +116,7 @@ func RpcResponse(api *EthereumApi, request *RpcRequest) *interface{} { switch reserr.(type) { case nil: response = &RpcSuccessResponse{Jsonrpc: jsonrpcver, Id: request.Id, Result: reply} - case *NotImplementedError: + case *NotImplementedError, *NotAvailableError: jsonerr := &RpcErrorObject{-32601, reserr.Error()} response = &RpcErrorResponse{Jsonrpc: jsonrpcver, Id: request.Id, Error: jsonerr} case *DecodeParamError, *InsufficientParamsError, *ValidationError, *InvalidTypeError: diff --git a/rpc/jeth.go b/rpc/jeth.go index ad52b72d7..2097ac30d 100644 --- a/rpc/jeth.go +++ b/rpc/jeth.go @@ -2,6 +2,7 @@ package rpc import ( "encoding/json" + "fmt" "github.com/ethereum/go-ethereum/jsre" "github.com/robertkrimen/otto" ) @@ -50,6 +51,7 @@ func (self *Jeth) Send(call otto.FunctionCall) (response otto.Value) { var respif interface{} err = self.ethApi.GetRequestReply(&req, &respif) if err != nil { + fmt.Println("Error response:", err) return self.err(call, -32603, err.Error(), req.Id) } call.Otto.Set("ret_jsonrpc", jsonrpcver) diff --git a/rpc/types.go b/rpc/types.go index 1784759a4..e6eb4f856 100644 --- a/rpc/types.go +++ b/rpc/types.go @@ -209,6 +209,22 @@ func NewNotImplementedError(method string) *NotImplementedError { } } +type NotAvailableError struct { + Method string + Reason string +} + +func (e *NotAvailableError) Error() string { + return fmt.Sprintf("%s method not available: %s", e.Method, e.Reason) +} + +func NewNotAvailableError(method string, reason string) *NotAvailableError { + return &NotAvailableError{ + Method: method, + Reason: reason, + } +} + type DecodeParamError struct { err string } |