| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // Copyright 2015 The go-ethereum Authors | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // This file is part of the go-ethereum library. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-23 18:35:11 +02:00
										 |  |  | // The go-ethereum library is free software: you can redistribute it and/or modify | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // it under the terms of the GNU Lesser General Public License as published by | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | // (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // The go-ethereum library is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // GNU Lesser General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU Lesser General Public License | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-08 10:23:54 +02:00
										 |  |  | package shared | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-08 10:41:04 +02:00
										 |  |  | import ( | 
					
						
							|  |  |  | 	"encoding/json" | 
					
						
							| 
									
										
										
										
											2015-06-09 09:48:18 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-08 10:41:04 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/logger" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/logger/glog" | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2015-06-08 10:23:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-22 12:47:32 +02:00
										 |  |  | // Ethereum RPC API interface | 
					
						
							|  |  |  | type EthereumApi interface { | 
					
						
							|  |  |  | 	// API identifier | 
					
						
							|  |  |  | 	Name() string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// API version | 
					
						
							|  |  |  | 	ApiVersion() string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Execute the given request and returns the response or an error | 
					
						
							|  |  |  | 	Execute(*Request) (interface{}, error) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// List of supported RCP methods this API provides | 
					
						
							|  |  |  | 	Methods() []string | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-08 10:23:54 +02:00
										 |  |  | // RPC request | 
					
						
							|  |  |  | type Request struct { | 
					
						
							|  |  |  | 	Id      interface{}     `json:"id"` | 
					
						
							|  |  |  | 	Jsonrpc string          `json:"jsonrpc"` | 
					
						
							|  |  |  | 	Method  string          `json:"method"` | 
					
						
							|  |  |  | 	Params  json.RawMessage `json:"params"` | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // RPC response | 
					
						
							|  |  |  | type Response struct { | 
					
						
							|  |  |  | 	Id      interface{} `json:"id"` | 
					
						
							|  |  |  | 	Jsonrpc string      `json:"jsonrpc"` | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // RPC success response | 
					
						
							|  |  |  | type SuccessResponse struct { | 
					
						
							|  |  |  | 	Id      interface{} `json:"id"` | 
					
						
							|  |  |  | 	Jsonrpc string      `json:"jsonrpc"` | 
					
						
							|  |  |  | 	Result  interface{} `json:"result"` | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // RPC error response | 
					
						
							|  |  |  | type ErrorResponse struct { | 
					
						
							|  |  |  | 	Id      interface{}  `json:"id"` | 
					
						
							|  |  |  | 	Jsonrpc string       `json:"jsonrpc"` | 
					
						
							|  |  |  | 	Error   *ErrorObject `json:"error"` | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // RPC error response details | 
					
						
							|  |  |  | type ErrorObject struct { | 
					
						
							|  |  |  | 	Code    int    `json:"code"` | 
					
						
							|  |  |  | 	Message string `json:"message"` | 
					
						
							|  |  |  | 	// Data    interface{} `json:"data"` | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-06-08 10:41:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-16 13:07:13 +02:00
										 |  |  | // Create RPC error response, this allows for custom error codes | 
					
						
							|  |  |  | func NewRpcErrorResponse(id interface{}, jsonrpcver string, errCode int, err error) *interface{} { | 
					
						
							|  |  |  | 	var response interface{} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	jsonerr := &ErrorObject{errCode, err.Error()} | 
					
						
							|  |  |  | 	response = ErrorResponse{Jsonrpc: jsonrpcver, Id: id, Error: jsonerr} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	glog.V(logger.Detail).Infof("Generated error response: %s", response) | 
					
						
							|  |  |  | 	return &response | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Create RPC response | 
					
						
							| 
									
										
										
										
											2015-06-08 10:41:04 +02:00
										 |  |  | func NewRpcResponse(id interface{}, jsonrpcver string, reply interface{}, err error) *interface{} { | 
					
						
							|  |  |  | 	var response interface{} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	switch err.(type) { | 
					
						
							| 
									
										
										
										
											2015-06-09 09:48:18 +02:00
										 |  |  | 	case nil: | 
					
						
							| 
									
										
										
										
											2015-06-08 10:41:04 +02:00
										 |  |  | 		response = &SuccessResponse{Jsonrpc: jsonrpcver, Id: id, Result: reply} | 
					
						
							| 
									
										
										
										
											2015-06-09 09:48:18 +02:00
										 |  |  | 	case *NotImplementedError: | 
					
						
							| 
									
										
										
										
											2015-06-08 10:41:04 +02:00
										 |  |  | 		jsonerr := &ErrorObject{-32601, err.Error()} | 
					
						
							|  |  |  | 		response = &ErrorResponse{Jsonrpc: jsonrpcver, Id: id, Error: jsonerr} | 
					
						
							| 
									
										
										
										
											2015-06-09 09:48:18 +02:00
										 |  |  | 	case *DecodeParamError, *InsufficientParamsError, *ValidationError, *InvalidTypeError: | 
					
						
							| 
									
										
										
										
											2015-06-08 10:41:04 +02:00
										 |  |  | 		jsonerr := &ErrorObject{-32602, err.Error()} | 
					
						
							|  |  |  | 		response = &ErrorResponse{Jsonrpc: jsonrpcver, Id: id, Error: jsonerr} | 
					
						
							| 
									
										
										
										
											2015-06-09 09:48:18 +02:00
										 |  |  | 	default: | 
					
						
							| 
									
										
										
										
											2015-06-08 10:41:04 +02:00
										 |  |  | 		jsonerr := &ErrorObject{-32603, err.Error()} | 
					
						
							|  |  |  | 		response = &ErrorResponse{Jsonrpc: jsonrpcver, Id: id, Error: jsonerr} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	glog.V(logger.Detail).Infof("Generated response: %T %s", response, response) | 
					
						
							|  |  |  | 	return &response | 
					
						
							|  |  |  | } |