Support of list of json rpc requests

pull/644/head
kompotkot 2022-08-01 11:25:11 +00:00
rodzic bb86bdc230
commit 1339b913cc
2 zmienionych plików z 45 dodań i 10 usunięć

Wyświetl plik

@ -167,6 +167,31 @@ func panicMiddleware(next http.Handler) http.Handler {
})
}
// Split JSON RPC request to object and slice and return slice of requests
func jsonrpcRequestParser(body []byte) ([]JSONRPCRequest, error) {
var jsonrpcRequest []JSONRPCRequest
firstByte := bytes.TrimLeft(body, " \t\r\n")
switch {
case len(firstByte) > 0 && firstByte[0] == '[':
err := json.Unmarshal(body, &jsonrpcRequest)
if err != nil {
return nil, fmt.Errorf("Unable to parse body, err: %v", err)
}
case len(firstByte) > 0 && firstByte[0] == '{':
var singleJsonrpcRequest JSONRPCRequest
err := json.Unmarshal(body, &singleJsonrpcRequest)
if err != nil {
return nil, fmt.Errorf("Unable to parse body, err: %v", err)
}
jsonrpcRequest = []JSONRPCRequest{singleJsonrpcRequest}
default:
return nil, fmt.Errorf("Incorrect first byte in JSON RPC request")
}
return jsonrpcRequest, nil
}
// Log access requests in proper format
func logMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
@ -198,12 +223,20 @@ func logMiddleware(next http.Handler) http.Handler {
// Parse body and log method if jsonrpc path
pathSlice := strings.Split(r.URL.Path, "/")
if r.Method == "POST" && pathSlice[len(pathSlice)-1] == "jsonrpc" {
var jsonrpcRequest JSONRPCRequest
err = json.Unmarshal(body, &jsonrpcRequest)
jsonrpcRequests, err := jsonrpcRequestParser(body)
if err != nil {
log.Printf("Unable to parse body at logging middleware, err: %v", err)
log.Println(err)
}
for i, jsonrpcRequest := range jsonrpcRequests {
if i == 0 {
logStr += fmt.Sprintf(" [%s", jsonrpcRequest.Method)
} else {
logStr += fmt.Sprintf(" %s", jsonrpcRequest.Method)
}
if i == len(jsonrpcRequests)-1 {
logStr += fmt.Sprint("]")
}
}
logStr += fmt.Sprintf(" %s", jsonrpcRequest.Method)
}
if stateCLI.enableDebugFlag {

Wyświetl plik

@ -97,9 +97,9 @@ func lbJSONRPCHandler(w http.ResponseWriter, r *http.Request, blockchain string,
}
r.Body = ioutil.NopCloser(bytes.NewBuffer(body))
var jsonrpcRequest JSONRPCRequest
err = json.Unmarshal(body, &jsonrpcRequest)
jsonrpcRequests, err := jsonrpcRequestParser(body)
if err != nil {
log.Println(err)
http.Error(w, "Unable to parse JSON RPC request", http.StatusBadRequest)
return
}
@ -111,10 +111,12 @@ func lbJSONRPCHandler(w http.ResponseWriter, r *http.Request, blockchain string,
return
}
if currentClientAccess.ExtendedMethods == false {
_, exists := ALLOWED_METHODS[jsonrpcRequest.Method]
if !exists {
http.Error(w, "Method for provided access id not allowed", http.StatusForbidden)
return
for _, jsonrpcRequest := range jsonrpcRequests {
_, exists := ALLOWED_METHODS[jsonrpcRequest.Method]
if !exists {
http.Error(w, "Method for provided access id not allowed", http.StatusForbidden)
return
}
}
}