Advertisement
Guest User

Untitled

a guest
Jul 21st, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rails 2.69 KB | None | 0 0
  1. require 'net/http'
  2. require 'json'
  3. require 'digest/md5'
  4.  
  5. class RestApi
  6.   include MproConfig
  7.   include MproLogger
  8.  
  9.   def initialize(user)
  10.     @user = user
  11.     @args = []
  12.   end
  13.  
  14.   def method_missing(method, *args)
  15.     begin
  16.       initialise_params
  17.       convert_args_to_params(args.first)
  18.       @params[:method] = method.to_s.gsub("_", ".")
  19.       @params[:sig] = generate_sig
  20.       escape_args
  21.       response = send_request
  22.       return response if response
  23.     rescue Exception => exc
  24.       MproLogger.mlog("#{@service_name} method call error: #{exc.message}")
  25.       super
  26.     end
  27.   end
  28.  
  29.   private
  30.  
  31.     def initialise_params
  32.       #should be overloaded
  33.     end
  34.  
  35.     def convert_args_to_params(args)
  36.       return unless args
  37.       @args = []
  38.       args.each do |k,v|
  39.         @params[k] = case v
  40.           when Array then v.join(',')
  41.           else v.to_s
  42.         end
  43.         @args << k
  44.       end
  45.     end
  46.  
  47.     def escape_args
  48.       @args.each do |k|
  49.         @params[k] = CGI.escape(@params[k])
  50.       end
  51.     end
  52.  
  53.     def generate_sig
  54.       @data = @params.
  55.                 sort{|a,b| a[0].to_s <=> b[0].to_s}.
  56.                 map{|arg| "#{arg[0]}=#{arg[1]}"}.
  57.                 join
  58.       Digest::MD5.hexdigest(@sig.call)
  59.     end
  60.  
  61.     def symbolize_keys(data)
  62.       data = [data] if Hash === data
  63.       return data unless Array === data
  64.       response = []
  65.       data.each do |item|
  66.         response << case item
  67.           when Array then
  68.             symbolize_keys item
  69.           when Hash then
  70.             hash = {}
  71.             item.each do |k,v|
  72.               hash[k.to_sym] = Array === v ? symbolize_keys(v) : v
  73.             end
  74.             hash
  75.           else item
  76.         end
  77.       end
  78.       response.size == 1 ? response.first : response
  79.     end
  80.  
  81.     def send_request
  82.       query_string = @params.
  83.                         map{|arg| "#{arg[0]}=#{arg[1]}"}.
  84.                         join('&')
  85.       http = Net::HTTP.new(@service_address, 80)
  86.       path = "#{@service_path}?#{query_string}"
  87.       resp, data = http.get(path)
  88.       unless resp.code_type == Net::HTTPOK
  89.         MproLogger.mlog("Bad response from #{@service_address}: #{resp.code}")
  90.         return
  91.       end
  92.  
  93.       attributes = JSON.parse(data)
  94.  
  95.       if Hash === attributes && attributes.has_key?("error")
  96.         MproLogger.mlog("#{@service_name} request error: #{attributes['error'].inspect}")
  97.         return
  98.       end
  99.       #puts attributes.inspect
  100.  
  101.       case attributes
  102.         when Array then
  103.           return symbolize_keys attributes
  104.         when Hash then
  105.           if attributes.has_key?("response")
  106.             return symbolize_keys attributes["response"]
  107.           else
  108.             return symbolize_keys attributes
  109.           end
  110.         else return attributes
  111.       end
  112.     end
  113. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement