#if !DOTNET35 using System; using System.Threading.Tasks; using Nethereum.JsonRpc.Client.RpcMessages; namespace Nethereum.JsonRpc.Client { public abstract class ClientBase : IClient { public static TimeSpan ConnectionTimeout { get; set; } = TimeSpan.FromSeconds(20.0); public RequestInterceptor OverridingRequestInterceptor { get; set; } public async Task SendRequestAsync(RpcRequest request, string route = null) { if (OverridingRequestInterceptor != null) return (T) await OverridingRequestInterceptor.InterceptSendRequestAsync(SendInnerRequestAsync, request, route) .ConfigureAwait(false); return await SendInnerRequestAsync(request, route).ConfigureAwait(false); } public async Task SendRequestAsync(string method, string route = null, params object[] paramList) { if (OverridingRequestInterceptor != null) return (T) await OverridingRequestInterceptor.InterceptSendRequestAsync(SendInnerRequestAsync, method, route, paramList).ConfigureAwait(false); return await SendInnerRequestAsync(method, route, paramList).ConfigureAwait(false); } protected void HandleRpcError(RpcResponseMessage response, string reqMsg) { if (response.HasError) throw new RpcResponseException(new RpcError(response.Error.Code, response.Error.Message + ": " + reqMsg, response.Error.Data)); } private async Task SendInnerRequestAsync(RpcRequestMessage reqMsg, string route = null) { var response = await SendAsync(reqMsg, route).ConfigureAwait(false); HandleRpcError(response, reqMsg.Method); try { return response.GetResult(); } catch (FormatException formatException) { throw new RpcResponseFormatException("Invalid format found in RPC response", formatException); } } protected virtual Task SendInnerRequestAsync(RpcRequest request, string route = null) { var reqMsg = new RpcRequestMessage(request.Id, request.Method, request.RawParameters); return SendInnerRequestAsync(reqMsg, route); } protected virtual Task SendInnerRequestAsync(string method, string route = null, params object[] paramList) { var request = new RpcRequestMessage(Guid.NewGuid().ToString(), method, paramList); return SendInnerRequestAsync(request, route); } public virtual async Task SendRequestAsync(RpcRequest request, string route = null) { var response = await SendAsync( new RpcRequestMessage(request.Id, request.Method, request.RawParameters), route) .ConfigureAwait(false); HandleRpcError(response, request.Method); } protected abstract Task SendAsync(RpcRequestMessage rpcRequestMessage, string route = null); public virtual async Task SendRequestAsync(string method, string route = null, params object[] paramList) { var request = new RpcRequestMessage(Guid.NewGuid().ToString(), method, paramList); var response = await SendAsync(request, route).ConfigureAwait(false); HandleRpcError(response, method); } } } #endif