Merge branch 'tgerring-develop' into develop
This commit is contained in:
		| @@ -96,7 +96,7 @@ func Init() { | ||||
| 	flag.StringVar(&NatType, "nat", "", "NAT support (UPNP|PMP) (none)") | ||||
| 	flag.StringVar(&PMPGateway, "pmp", "", "Gateway IP for PMP") | ||||
| 	flag.IntVar(&MaxPeer, "maxpeer", 30, "maximum desired peers") | ||||
| 	flag.IntVar(&RpcPort, "rpcport", 8080, "port to start json-rpc server on") | ||||
| 	flag.IntVar(&RpcPort, "rpcport", 8545, "port to start json-rpc server on") | ||||
| 	flag.IntVar(&WsPort, "wsport", 40404, "port to start websocket rpc server on") | ||||
| 	flag.BoolVar(&StartRpc, "rpc", false, "start rpc server") | ||||
| 	flag.BoolVar(&StartWebSockets, "ws", false, "start websocket server") | ||||
|   | ||||
| @@ -111,7 +111,7 @@ func Init() { | ||||
| 	flag.StringVar(&OutboundPort, "port", "30303", "listening port") | ||||
| 	flag.BoolVar(&UseUPnP, "upnp", true, "enable UPnP support") | ||||
| 	flag.IntVar(&MaxPeer, "maxpeer", 30, "maximum desired peers") | ||||
| 	flag.IntVar(&RpcPort, "rpcport", 8080, "port to start json-rpc server on") | ||||
| 	flag.IntVar(&RpcPort, "rpcport", 8545, "port to start json-rpc server on") | ||||
| 	flag.IntVar(&WsPort, "wsport", 40404, "port to start websocket rpc server on") | ||||
| 	flag.BoolVar(&StartRpc, "rpc", true, "start rpc server") | ||||
| 	flag.BoolVar(&StartWebSockets, "ws", false, "start websocket server") | ||||
|   | ||||
| @@ -205,7 +205,7 @@ func StartWebSockets(eth *eth.Ethereum, wsPort int) { | ||||
| 	clilogger.Infoln("Starting WebSockets") | ||||
|  | ||||
| 	var err error | ||||
| 	eth.WsServer, err = rpcws.NewWebSocketServer(eth, wsPort) | ||||
| 	eth.WsServer, err = rpcws.NewWebSocketServer(xeth.New(eth), wsPort) | ||||
| 	if err != nil { | ||||
| 		clilogger.Errorf("Could not start RPC interface (port %v): %v", wsPort, err) | ||||
| 	} else { | ||||
|   | ||||
| @@ -84,6 +84,7 @@ func (s *RpcHttpServer) Start() { | ||||
| } | ||||
|  | ||||
| func (s *RpcHttpServer) apiHandler(api *rpc.EthereumApi) http.Handler { | ||||
| 	var jsonrpcver string = "2.0" | ||||
| 	fn := func(w http.ResponseWriter, req *http.Request) { | ||||
| 		w.Header().Set("Access-Control-Allow-Origin", "*") | ||||
|  | ||||
| @@ -91,20 +92,22 @@ func (s *RpcHttpServer) apiHandler(api *rpc.EthereumApi) http.Handler { | ||||
|  | ||||
| 		reqParsed, reqerr := JSON.ParseRequestBody(req) | ||||
| 		if reqerr != nil { | ||||
| 			JSON.Send(w, &rpc.RpcErrorResponse{JsonRpc: reqParsed.JsonRpc, ID: reqParsed.ID, Error: true, ErrorText: rpc.ErrorParseRequest}) | ||||
| 			jsonerr := &rpc.RpcErrorObject{-32700, rpc.ErrorParseRequest} | ||||
| 			JSON.Send(w, &rpc.RpcErrorResponse{JsonRpc: jsonrpcver, ID: nil, Error: jsonerr}) | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		var response interface{} | ||||
| 		reserr := api.GetRequestReply(&reqParsed, &response) | ||||
| 		if reserr != nil { | ||||
| 			rpchttplogger.Errorln(reserr) | ||||
| 			JSON.Send(w, &rpc.RpcErrorResponse{JsonRpc: reqParsed.JsonRpc, ID: reqParsed.ID, Error: true, ErrorText: reserr.Error()}) | ||||
| 			rpchttplogger.Warnln(reserr) | ||||
| 			jsonerr := &rpc.RpcErrorObject{-32603, reserr.Error()} | ||||
| 			JSON.Send(w, &rpc.RpcErrorResponse{JsonRpc: jsonrpcver, ID: &reqParsed.ID, Error: jsonerr}) | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		rpchttplogger.DebugDetailf("Generated response: %T %s", response, response) | ||||
| 		JSON.Send(w, &rpc.RpcSuccessResponse{JsonRpc: reqParsed.JsonRpc, ID: reqParsed.ID, Error: false, Result: response}) | ||||
| 		rpchttplogger.Debugf("Generated response: %T %s", response, response) | ||||
| 		JSON.Send(w, &rpc.RpcSuccessResponse{JsonRpc: jsonrpcver, ID: reqParsed.ID, Result: response}) | ||||
| 	} | ||||
|  | ||||
| 	return http.HandlerFunc(fn) | ||||
|   | ||||
| @@ -33,25 +33,6 @@ const ( | ||||
| 	ErrorDecodeArgs     = "Error: Could not decode arguments" | ||||
| ) | ||||
|  | ||||
| type ErrorResponse struct { | ||||
| 	Error     bool   `json:"error"` | ||||
| 	ErrorText string `json:"errorText"` | ||||
| } | ||||
|  | ||||
| type RpcSuccessResponse struct { | ||||
| 	ID      int         `json:"id"` | ||||
| 	JsonRpc string      `json:"jsonrpc"` | ||||
| 	Error   bool        `json:"error"` | ||||
| 	Result  interface{} `json:"result"` | ||||
| } | ||||
|  | ||||
| type RpcErrorResponse struct { | ||||
| 	ID        int    `json:"id"` | ||||
| 	JsonRpc   string `json:"jsonrpc"` | ||||
| 	Error     bool   `json:"error"` | ||||
| 	ErrorText string `json:"errortext"` | ||||
| } | ||||
|  | ||||
| type RpcRequest struct { | ||||
| 	JsonRpc string            `json:"jsonrpc"` | ||||
| 	ID      int               `json:"id"` | ||||
| @@ -59,6 +40,24 @@ type RpcRequest struct { | ||||
| 	Params  []json.RawMessage `json:"params"` | ||||
| } | ||||
|  | ||||
| type RpcSuccessResponse struct { | ||||
| 	ID      int         `json:"id"` | ||||
| 	JsonRpc string      `json:"jsonrpc"` | ||||
| 	Result  interface{} `json:"result"` | ||||
| } | ||||
|  | ||||
| type RpcErrorResponse struct { | ||||
| 	ID      *int            `json:"id"` | ||||
| 	JsonRpc string          `json:"jsonrpc"` | ||||
| 	Error   *RpcErrorObject `json:"error"` | ||||
| } | ||||
|  | ||||
| type RpcErrorObject struct { | ||||
| 	Code    int    `json:"code"` | ||||
| 	Message string `json:"message"` | ||||
| 	// Data    interface{} `json:"data"` | ||||
| } | ||||
|  | ||||
| func NewErrorResponse(msg string) error { | ||||
| 	return errors.New(msg) | ||||
| } | ||||
|   | ||||
| @@ -22,35 +22,30 @@ import ( | ||||
| 	"net/http" | ||||
|  | ||||
| 	"code.google.com/p/go.net/websocket" | ||||
| 	"github.com/ethereum/go-ethereum/eth" | ||||
| 	"github.com/ethereum/go-ethereum/event/filter" | ||||
| 	"github.com/ethereum/go-ethereum/logger" | ||||
| 	"github.com/ethereum/go-ethereum/rpc" | ||||
| 	"github.com/ethereum/go-ethereum/xeth" | ||||
| ) | ||||
|  | ||||
| var wslogger = logger.NewLogger("RPC-WS") | ||||
| var JSON rpc.JsonWrapper | ||||
|  | ||||
| type WebSocketServer struct { | ||||
| 	eth           *eth.Ethereum | ||||
| 	filterManager *filter.FilterManager | ||||
| 	port          int | ||||
| 	doneCh        chan bool | ||||
| 	listener      net.Listener | ||||
| 	pipe     *xeth.XEth | ||||
| 	port     int | ||||
| 	doneCh   chan bool | ||||
| 	listener net.Listener | ||||
| } | ||||
|  | ||||
| func NewWebSocketServer(eth *eth.Ethereum, port int) (*WebSocketServer, error) { | ||||
| 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 | ||||
| 	} | ||||
|  | ||||
| 	filterManager := filter.NewFilterManager(eth.EventMux()) | ||||
| 	go filterManager.Start() | ||||
|  | ||||
| 	return &WebSocketServer{eth, | ||||
| 		filterManager, | ||||
| 	return &WebSocketServer{ | ||||
| 		pipe, | ||||
| 		port, | ||||
| 		make(chan bool), | ||||
| 		l, | ||||
| @@ -75,7 +70,7 @@ func (self *WebSocketServer) Start() { | ||||
| 	wslogger.Infof("Starting RPC-WS server on port %d", self.port) | ||||
| 	go self.handlerLoop() | ||||
|  | ||||
| 	api := rpc.NewEthereumApi(xeth.New(self.eth)) | ||||
| 	api := rpc.NewEthereumApi(self.pipe) | ||||
| 	h := self.apiHandler(api) | ||||
| 	http.Handle("/ws", h) | ||||
|  | ||||
| @@ -96,27 +91,29 @@ func (s *WebSocketServer) apiHandler(api *rpc.EthereumApi) http.Handler { | ||||
| } | ||||
|  | ||||
| func sockHandler(api *rpc.EthereumApi) websocket.Handler { | ||||
| 	var jsonrpcver string = "2.0" | ||||
| 	fn := func(conn *websocket.Conn) { | ||||
| 		for { | ||||
| 			wslogger.Debugln("Handling request") | ||||
| 			var reqParsed rpc.RpcRequest | ||||
|  | ||||
| 			if err := websocket.JSON.Receive(conn, &reqParsed); err != nil { | ||||
| 				wslogger.Debugln(rpc.ErrorParseRequest) | ||||
| 				websocket.JSON.Send(conn, rpc.RpcErrorResponse{JsonRpc: reqParsed.JsonRpc, ID: reqParsed.ID, Error: true, ErrorText: rpc.ErrorParseRequest}) | ||||
| 				jsonerr := &rpc.RpcErrorObject{-32700, rpc.ErrorParseRequest} | ||||
| 				JSON.Send(conn, &rpc.RpcErrorResponse{JsonRpc: jsonrpcver, ID: nil, Error: jsonerr}) | ||||
| 				continue | ||||
| 			} | ||||
|  | ||||
| 			var response interface{} | ||||
| 			reserr := api.GetRequestReply(&reqParsed, &response) | ||||
| 			if reserr != nil { | ||||
| 				wslogger.Errorln(reserr) | ||||
| 				websocket.JSON.Send(conn, rpc.RpcErrorResponse{JsonRpc: reqParsed.JsonRpc, ID: reqParsed.ID, Error: true, ErrorText: reserr.Error()}) | ||||
| 				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) | ||||
| 			websocket.JSON.Send(conn, rpc.RpcSuccessResponse{JsonRpc: reqParsed.JsonRpc, ID: reqParsed.ID, Error: false, Result: response}) | ||||
| 			JSON.Send(conn, &rpc.RpcSuccessResponse{JsonRpc: jsonrpcver, ID: reqParsed.ID, Result: response}) | ||||
| 		} | ||||
| 	} | ||||
| 	return websocket.Handler(fn) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user