diff options
-rw-r--r-- | rpc/api.go | 19 | ||||
-rw-r--r-- | rpc/args.go | 82 | ||||
-rw-r--r-- | rpc/args_test.go | 61 |
3 files changed, 158 insertions, 4 deletions
diff --git a/rpc/api.go b/rpc/api.go index 8bbe80bd8..44b8ee834 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -167,7 +167,10 @@ func (self *EthereumApi) NewFilter(args *FilterOptions, reply *interface{}) erro } func (self *EthereumApi) UninstallFilter(id int, reply *interface{}) error { - delete(self.logs, id) + if _, ok := self.logs[id]; ok { + delete(self.logs, id) + } + self.filterManager.UninstallFilter(id) *reply = true return nil @@ -377,7 +380,13 @@ func (p *EthereumApi) NewWhisperFilter(args *WhisperFilterArgs, reply *interface } id = p.xeth().Whisper().Watch(opts) p.messages[id] = &whisperFilter{timeout: time.Now()} - *reply = id + *reply = toHex(big.NewInt(int64(id)).Bytes()) + return nil +} + +func (p *EthereumApi) UninstallWhisperFilter(id int, reply *interface{}) error { + delete(p.messages, id) + *reply = true return nil } @@ -733,7 +742,11 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error } return p.NewWhisperFilter(args, reply) case "shh_uninstallFilter": - return errNotImplemented + args := new(FilterIdArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { + return err + } + return p.UninstallWhisperFilter(args.Id, reply) case "shh_getFilterChanges": args := new(FilterIdArgs) if err := json.Unmarshal(req.Params, &args); err != nil { diff --git a/rpc/args.go b/rpc/args.go index d4d807060..40f8575b2 100644 --- a/rpc/args.go +++ b/rpc/args.go @@ -188,9 +188,33 @@ type GetBalanceArgs struct { } func (args *GetBalanceArgs) UnmarshalJSON(b []byte) (err error) { - if err = UnmarshalRawMessages(b, &args.Address, &args.BlockNumber); err != nil { + var obj []interface{} + r := bytes.NewReader(b) + if err := json.NewDecoder(r).Decode(&obj); err != nil { + return errDecodeArgs + } + + if len(obj) < 1 { + return errArguments + } + + addstr, ok := obj[0].(string) + if !ok { return errDecodeArgs } + args.Address = addstr + + if len(obj) > 1 { + if obj[1].(string) == "latest" { + args.BlockNumber = -1 + } else { + args.BlockNumber = ethutil.Big(obj[1].(string)).Int64() + } + } + + // if err = UnmarshalRawMessages(b, &args.Address, &args.BlockNumber); err != nil { + // return errDecodeArgs + // } return nil } @@ -227,11 +251,67 @@ type BlockNumIndexArgs struct { Index int64 } +func (args *BlockNumIndexArgs) UnmarshalJSON(b []byte) (err error) { + var obj []interface{} + r := bytes.NewReader(b) + if err := json.NewDecoder(r).Decode(&obj); err != nil { + return errDecodeArgs + } + + if len(obj) < 1 { + return errArguments + } + + arg0, ok := obj[0].(string) + if !ok { + return errDecodeArgs + } + args.BlockNumber = ethutil.Big(arg0).Int64() + + if len(obj) > 1 { + arg1, ok := obj[1].(string) + if !ok { + return errDecodeArgs + } + args.Index = ethutil.Big(arg1).Int64() + } + + return nil +} + type HashIndexArgs struct { BlockHash string Index int64 } +func (args *HashIndexArgs) UnmarshalJSON(b []byte) (err error) { + var obj []interface{} + r := bytes.NewReader(b) + if err := json.NewDecoder(r).Decode(&obj); err != nil { + return errDecodeArgs + } + + if len(obj) < 1 { + return errArguments + } + + arg0, ok := obj[0].(string) + if !ok { + return errDecodeArgs + } + args.BlockHash = arg0 + + if len(obj) > 1 { + arg1, ok := obj[1].(string) + if !ok { + return errDecodeArgs + } + args.Index = ethutil.Big(arg1).Int64() + } + + return nil +} + type Sha3Args struct { Data string } diff --git a/rpc/args_test.go b/rpc/args_test.go index 027624500..6b6d3c3c0 100644 --- a/rpc/args_test.go +++ b/rpc/args_test.go @@ -43,6 +43,17 @@ func TestGetBalanceArgs(t *testing.T) { } } +func TestGetBalanceEmptyArgs(t *testing.T) { + input := `[]` + + args := new(GetBalanceArgs) + err := json.Unmarshal([]byte(input), &args) + if err == nil { + t.Error("Expected error but didn't get one") + } + +} + func TestGetBlockByHashArgs(t *testing.T) { input := `["0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331", true]` expected := new(GetBlockByHashArgs) @@ -418,6 +429,16 @@ func TestFilterStringArgs(t *testing.T) { } } +func TestFilterStringEmptyArgs(t *testing.T) { + input := `[]` + + args := new(FilterStringArgs) + err := json.Unmarshal([]byte(input), &args) + if err == nil { + t.Error("Expected error but didn't get one") + } +} + func TestWhisperIdentityArgs(t *testing.T) { input := `["0xc931d93e97ab07fe42d923478ba2465f283"]` expected := new(WhisperIdentityArgs) @@ -432,3 +453,43 @@ func TestWhisperIdentityArgs(t *testing.T) { t.Errorf("Identity shoud be %#v but is %#v", expected.Identity, args.Identity) } } + +func TestBlockNumIndexArgs(t *testing.T) { + input := `["0x29a", "0x0"]` + expected := new(BlockNumIndexArgs) + expected.BlockNumber = 666 + expected.Index = 0 + + args := new(BlockNumIndexArgs) + if err := json.Unmarshal([]byte(input), &args); err != nil { + t.Error(err) + } + + if expected.BlockNumber != args.BlockNumber { + t.Errorf("BlockNumber shoud be %#v but is %#v", expected.BlockNumber, args.BlockNumber) + } + + if expected.Index != args.Index { + t.Errorf("Index shoud be %#v but is %#v", expected.Index, args.Index) + } +} + +func TestHashIndexArgs(t *testing.T) { + input := `["0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", "0x1"]` + expected := new(HashIndexArgs) + expected.BlockHash = "0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b" + expected.Index = 1 + + args := new(HashIndexArgs) + if err := json.Unmarshal([]byte(input), &args); err != nil { + t.Error(err) + } + + if expected.BlockHash != args.BlockHash { + t.Errorf("BlockHash shoud be %#v but is %#v", expected.BlockHash, args.BlockHash) + } + + if expected.Index != args.Index { + t.Errorf("Index shoud be %#v but is %#v", expected.Index, args.Index) + } +} |