diff --git a/lib/steem/api.rb b/lib/steem/api.rb index 513b3901e46fcd5562e3189a0863c935d9cf6e75..2a72a31e9901a386b28ee628f4df91a119edd3b3 100644 --- a/lib/steem/api.rb +++ b/lib/steem/api.rb @@ -149,19 +149,6 @@ module Steem @@signatures[url][rpc_method_name] ||= Api::jsonrpc(url).get_signature(method: rpc_method_name).result end - # @private - def raise_error_response(rpc_method_name, rpc_args, response) - raise UnknownError, "#{rpc_method_name}: #{response}" if response.error.nil? - - error = response.error - - if error.message == 'Invalid Request' - raise Steem::ArgumentError, "Unexpected arguments: #{rpc_args.inspect}. Expected: #{rpc_method_name} (#{args_keys_to_s(rpc_method_name)})" - end - - BaseError.build_error(error, rpc_method_name) - end - # @private def respond_to_missing?(m, include_private = false) methods.nil? ? false : methods.include?(m.to_sym) @@ -203,14 +190,6 @@ module Steem response = rpc_client.rpc_execute(@api_name, m, rpc_args) - if defined?(response.error) && !!response.error - if !!response.error.message - raise_error_response rpc_method_name, rpc_args, response - else - raise Steem::ArgumentError, response.error.inspect - end - end - if !!block case response when Hashie::Mash then yield response.result, response.error, response.id diff --git a/lib/steem/rpc/base_client.rb b/lib/steem/rpc/base_client.rb index 8d7387e7a5dcb9f75d8f8c169046e78550b92b6c..d5ae9fd2afd7932b2e44186a0cd3ed47d740b75d 100644 --- a/lib/steem/rpc/base_client.rb +++ b/lib/steem/rpc/base_client.rb @@ -161,6 +161,19 @@ module Steem sleep @backoff end + + # @private + def raise_error_response(rpc_method_name, rpc_args, response) + raise UnknownError, "#{rpc_method_name}: #{response}" if response.error.nil? + + error = response.error + + if error.message == 'Invalid Request' + raise Steem::ArgumentError, "Unexpected arguments: #{rpc_args.inspect}. Expected: #{rpc_method_name} (#{args_keys_to_s(rpc_method_name)})" + end + + BaseError.build_error(error, rpc_method_name) + end end end end diff --git a/lib/steem/rpc/http_client.rb b/lib/steem/rpc/http_client.rb index 0517fa0d460a85a538a3fa70474a69ad5c3d867d..1d153b5d41d1de5c40a3271f8ec528ddc7b35d69 100644 --- a/lib/steem/rpc/http_client.rb +++ b/lib/steem/rpc/http_client.rb @@ -17,7 +17,7 @@ module Steem # # @private TIMEOUT_ERRORS = [Net::OpenTimeout, JSON::ParserError, Net::ReadTimeout, - Errno::EBADF, IOError, Errno::ENETDOWN] + Errno::EBADF, IOError, Errno::ENETDOWN, Steem::RemoteDatabaseLockError] # @private POST_HEADERS = { @@ -108,6 +108,22 @@ module Steem else; response end + [response].flatten.each_with_index do |r, i| + if defined?(r.error) && !!r.error + if !!r.error.message + begin + rpc_method_name = "#{api_name}.#{api_method}" + rpc_args = [request_object].flatten[i] + raise_error_response rpc_method_name, rpc_args, r + rescue *TIMEOUT_ERRORS => e + throw retry_timeout(:tota_cera_pila, e) + end + else + raise Steem::ArgumentError, r.error.inspect + end + end + end + yield_response response, &block when '504' # Gateway Timeout throw retry_timeout(:tota_cera_pila, response.body)