diff options
Diffstat (limited to 'rpc')
-rw-r--r-- | rpc/api.go | 17 | ||||
-rw-r--r-- | rpc/args.go | 29 | ||||
-rw-r--r-- | rpc/http/server.go | 8 | ||||
-rw-r--r-- | rpc/ws/server.go | 121 |
4 files changed, 31 insertions, 144 deletions
diff --git a/rpc/api.go b/rpc/api.go index ddba422f8..617e4998d 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -2,7 +2,6 @@ package rpc import ( "encoding/json" - "fmt" "math/big" "strings" "sync" @@ -16,7 +15,6 @@ import ( "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/event/filter" "github.com/ethereum/go-ethereum/state" - "github.com/ethereum/go-ethereum/ui" "github.com/ethereum/go-ethereum/xeth" ) @@ -76,7 +74,7 @@ func NewEthereumApi(eth *xeth.XEth) *EthereumApi { // block = chain.GetBlockByNumber(uint64(num)) // if block != nil { -// self.useState(state.New(block.Root(), self.xeth().Backend().Db())) +// self.useState(state.New(block.Root(), self.xeth().Backend().StateDb())) // } else { // self.useState(chain.State()) // } @@ -649,17 +647,6 @@ func (self *EthereumApi) useState(statedb *state.StateDB) { self.eth = self.eth.UseState(statedb) } -func t(f ui.Frontend) { - // Call the password dialog - ret, err := f.Call("PasswordDialog") - if err != nil { - fmt.Println(err) - } - // Get the first argument - t, _ := ret.Get(0) - fmt.Println("return:", t) -} - func toFilterOptions(options *FilterOptions) core.FilterOptions { var opts core.FilterOptions @@ -678,7 +665,7 @@ func toFilterOptions(options *FilterOptions) core.FilterOptions { opts.Earliest = options.Earliest opts.Latest = options.Latest - opts.Topics = make([][]byte, len(options.Topic)) + opts.Topics = make([][][]byte, len(options.Topic)) for i, topic := range options.Topic { opts.Topics[i] = fromHex(topic) } diff --git a/rpc/args.go b/rpc/args.go index 43cad5fde..d34cfb2fa 100644 --- a/rpc/args.go +++ b/rpc/args.go @@ -333,19 +333,19 @@ type FilterOptions struct { Earliest int64 Latest int64 Address interface{} - Topic []string + Topic []interface{} Skip int Max int } func (args *FilterOptions) UnmarshalJSON(b []byte) (err error) { var obj []struct { - FromBlock string `json:"fromBlock"` - ToBlock string `json:"toBlock"` - Limit string `json:"limit"` - Offset string `json:"offset"` - Address string `json:"address"` - Topics []string `json:"topics"` + FromBlock string `json:"fromBlock"` + ToBlock string `json:"toBlock"` + Limit string `json:"limit"` + Offset string `json:"offset"` + Address string `json:"address"` + Topics []interface{} `json:"topics"` } if err = json.Unmarshal(b, &obj); err != nil { @@ -360,7 +360,20 @@ func (args *FilterOptions) UnmarshalJSON(b []byte) (err error) { args.Max = int(ethutil.Big(obj[0].Limit).Int64()) args.Skip = int(ethutil.Big(obj[0].Offset).Int64()) args.Address = obj[0].Address - args.Topic = obj[0].Topics + + topics := make([][][]byte, len(obj[0].Topics)) + for i, topicDat := range obj[0].Topics { + if slice, ok := topicDat.([]interface{}); ok { + topics[i] = make([][]byte, len(slice)) + for j, topic := range slice { + topics[i][j] = fromHex(topic.(string)) + } + } else if str, ok := topicDat.(string); ok { + topics[i] = make([][]byte, 1) + topics[i][0] = fromHex(str) + } + } + args.Topics = topics return nil } diff --git a/rpc/http/server.go b/rpc/http/server.go index 452b7c9af..d8f0157f1 100644 --- a/rpc/http/server.go +++ b/rpc/http/server.go @@ -29,6 +29,8 @@ import ( var rpchttplogger = logger.NewLogger("RPC-HTTP") var JSON rpc.JsonWrapper +const maxSizeReqLength = 1024 * 1024 // 1MB + func NewRpcHttpServer(pipe *xeth.XEth, address string, port int) (*RpcHttpServer, error) { sport := fmt.Sprintf("%s:%d", address, port) l, err := net.Listen("tcp", sport) @@ -92,6 +94,12 @@ func (s *RpcHttpServer) apiHandler(api *rpc.EthereumApi) http.Handler { rpchttplogger.DebugDetailln("Handling request") + if req.ContentLength > maxSizeReqLength { + jsonerr := &rpc.RpcErrorObject{-32700, "Error: Request too large"} + JSON.Send(w, &rpc.RpcErrorResponse{JsonRpc: jsonrpcver, ID: nil, Error: jsonerr}) + return + } + reqParsed, reqerr := JSON.ParseRequestBody(req) if reqerr != nil { jsonerr := &rpc.RpcErrorObject{-32700, "Error: Could not parse request"} diff --git a/rpc/ws/server.go b/rpc/ws/server.go deleted file mode 100644 index 2c2988f5d..000000000 --- a/rpc/ws/server.go +++ /dev/null @@ -1,121 +0,0 @@ -/* - This file is part of go-ethereum - - go-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - go-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with go-ethereum. If not, see <http://www.gnu.org/licenses/>. -*/ -package rpcws - -import ( - "fmt" - "net" - "net/http" - - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/xeth" - "golang.org/x/net/websocket" -) - -var wslogger = logger.NewLogger("RPC-WS") -var JSON rpc.JsonWrapper - -type WebSocketServer struct { - pipe *xeth.XEth - port int - doneCh chan bool - listener net.Listener -} - -func NewWebSocketServer(pipe *xeth.XEth, port int) (*WebSocketServer, error) { - sport := fmt.Sprintf(":%d", port) - l, err := net.Listen("tcp", sport) - if err != nil { - return nil, err - } - - return &WebSocketServer{ - pipe, - port, - make(chan bool), - l, - }, nil -} - -func (self *WebSocketServer) handlerLoop() { - for { - select { - case <-self.doneCh: - wslogger.Infoln("Shutdown RPC-WS server") - return - } - } -} - -func (self *WebSocketServer) Stop() { - close(self.doneCh) -} - -func (self *WebSocketServer) Start() { - wslogger.Infof("Starting RPC-WS server on port %d", self.port) - go self.handlerLoop() - - api := rpc.NewEthereumApi(self.pipe) - h := self.apiHandler(api) - http.Handle("/ws", h) - - err := http.Serve(self.listener, nil) - if err != nil { - wslogger.Errorln("Error on RPC-WS interface:", err) - } -} - -func (s *WebSocketServer) apiHandler(api *rpc.EthereumApi) http.Handler { - fn := func(w http.ResponseWriter, req *http.Request) { - h := sockHandler(api) - s := websocket.Server{Handler: h} - s.ServeHTTP(w, req) - } - - return http.HandlerFunc(fn) -} - -func sockHandler(api *rpc.EthereumApi) websocket.Handler { - var jsonrpcver string = "2.0" - fn := func(conn *websocket.Conn) { - for { - wslogger.Debugln("Handling connection") - var reqParsed rpc.RpcRequest - - // reqParsed, reqerr := JSON.ParseRequestBody(conn.Request()) - if err := websocket.JSON.Receive(conn, &reqParsed); err != nil { - jsonerr := &rpc.RpcErrorObject{-32700, "Error: Could not parse request"} - JSON.Send(conn, &rpc.RpcErrorResponse{JsonRpc: jsonrpcver, ID: nil, Error: jsonerr}) - continue - } - - var response interface{} - reserr := api.GetRequestReply(&reqParsed, &response) - if reserr != nil { - wslogger.Warnln(reserr) - jsonerr := &rpc.RpcErrorObject{-32603, reserr.Error()} - JSON.Send(conn, &rpc.RpcErrorResponse{JsonRpc: jsonrpcver, ID: reqParsed.ID, Error: jsonerr}) - continue - } - - wslogger.Debugf("Generated response: %T %s", response, response) - JSON.Send(conn, &rpc.RpcSuccessResponse{JsonRpc: jsonrpcver, ID: reqParsed.ID, Result: response}) - } - } - return websocket.Handler(fn) -} |