From fc8f7cc217203d9faa348e4554450662ea7a4c55 Mon Sep 17 00:00:00 2001
From: Anthony Martin <github@martin-studio.com>
Date: Tue, 23 Oct 2018 19:56:48 -0700
Subject: [PATCH] move raise_error_response into base_client, call from
 http_client so it's closer to the error origin #6

---
 lib/steem/api.rb             | 21 ---------------------
 lib/steem/rpc/base_client.rb | 13 +++++++++++++
 lib/steem/rpc/http_client.rb | 18 +++++++++++++++++-
 3 files changed, 30 insertions(+), 22 deletions(-)

diff --git a/lib/steem/api.rb b/lib/steem/api.rb
index 513b390..2a72a31 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 8d7387e..d5ae9fd 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 0517fa0..1d153b5 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)
-- 
GitLab