|
|
@@ -17,13 +17,39 @@
|
|
|
package rpc
|
|
|
|
|
|
import (
|
|
|
+ "fmt"
|
|
|
"net"
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/log"
|
|
|
)
|
|
|
|
|
|
-// StartHTTPEndpoint starts the HTTP RPC endpoint, configured with cors/vhosts/modules
|
|
|
+// checkModuleAvailability check that all names given in modules are actually
|
|
|
+// available API services.
|
|
|
+func checkModuleAvailability(modules []string, apis []API) error {
|
|
|
+ available := make(map[string]struct{})
|
|
|
+ var availableNames string
|
|
|
+ for i, api := range apis {
|
|
|
+ if _, ok := available[api.Namespace]; !ok {
|
|
|
+ available[api.Namespace] = struct{}{}
|
|
|
+ if i > 0 {
|
|
|
+ availableNames += ", "
|
|
|
+ }
|
|
|
+ availableNames += api.Namespace
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for _, name := range modules {
|
|
|
+ if _, ok := available[name]; !ok {
|
|
|
+ return fmt.Errorf("invalid API %q in whitelist (available: %s)", name, availableNames)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+// StartHTTPEndpoint starts the HTTP RPC endpoint, configured with cors/vhosts/modules.
|
|
|
func StartHTTPEndpoint(endpoint string, apis []API, modules []string, cors []string, vhosts []string, timeouts HTTPTimeouts) (net.Listener, *Server, error) {
|
|
|
+ if err := checkModuleAvailability(modules, apis); err != nil {
|
|
|
+ return nil, nil, err
|
|
|
+ }
|
|
|
// Generate the whitelist based on the allowed modules
|
|
|
whitelist := make(map[string]bool)
|
|
|
for _, module := range modules {
|
|
|
@@ -51,9 +77,11 @@ func StartHTTPEndpoint(endpoint string, apis []API, modules []string, cors []str
|
|
|
return listener, handler, err
|
|
|
}
|
|
|
|
|
|
-// StartWSEndpoint starts a websocket endpoint
|
|
|
+// StartWSEndpoint starts a websocket endpoint.
|
|
|
func StartWSEndpoint(endpoint string, apis []API, modules []string, wsOrigins []string, exposeAll bool) (net.Listener, *Server, error) {
|
|
|
-
|
|
|
+ if err := checkModuleAvailability(modules, apis); err != nil {
|
|
|
+ return nil, nil, err
|
|
|
+ }
|
|
|
// Generate the whitelist based on the allowed modules
|
|
|
whitelist := make(map[string]bool)
|
|
|
for _, module := range modules {
|