Guest User

Untitled

a guest
Feb 21st, 2018
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.60 KB | None | 0 0
  1. %w[net/http net/https uri ostruct rubygems json].each { |gem| require gem }
  2.  
  3. module HTTP
  4. class UnSupportedFormat < StandardError; end
  5. class UnAuthenticated < StandardError; end
  6. MimeTypes = { :xml => "text/xml", :json => "application/json" }
  7.  
  8. def self.included(klass)
  9. klass.extend ClassMethods
  10. end
  11.  
  12. # Class Methods
  13. module ClassMethods
  14. %w[get post put delete].each do |verb|
  15. meths = %{
  16. def #{verb}(url, &block)
  17. request = new(url)
  18. request.instance_eval(&block)
  19. request.send_request("#{verb}")
  20. request
  21. end
  22. }
  23. self.class_eval meths
  24. end
  25. end
  26.  
  27. attr_reader :response, :results
  28.  
  29. # Instance Methods
  30. def initialize(url)
  31. @uri = URI.parse(normalize(url))
  32. @url, @port = @uri.host, @uri.port
  33. end
  34.  
  35. def proxy(address=nil, port=nil)
  36. @proxy_address = address
  37. @proxy_port = port
  38. end
  39.  
  40. def basic_auth(user, pass)
  41. @basic_auth = { :user => user, :password => pass }
  42. end
  43.  
  44. def query(hash={}, q=[])
  45. return nil if hash.empty?
  46. hash.each { |key, *values| q << "#{key}=#{values.join(',')}" }
  47. @uri.query = q.join("&")
  48. end
  49.  
  50. def header(head={})
  51. head
  52. end
  53.  
  54. def mime_type(type)
  55. MimeTypes.each { |key,value| @mime_type = key if type.include?(value) }
  56. end
  57.  
  58. def send_request(resource)
  59. klass = Net::HTTP.const_get resource.to_s.downcase.capitalize
  60. request = klass.new(@uri.request_uri)
  61. request.body = @uri.query
  62.  
  63. request.initialize_http_header(header)
  64. request.basic_auth(@basic_auth[:user], @basic_auth[:password]) if has_auth?
  65.  
  66. @response = http.request(request)
  67. mime_type(@response['content-type'])
  68.  
  69. @results = parse(@response.body)
  70. end
  71.  
  72. def use_ssl?
  73. @uri.port == 443
  74. end
  75.  
  76. def has_query?
  77. !!@uri.query
  78. end
  79.  
  80. def has_auth?
  81. !!@basic_auth
  82. end
  83.  
  84. def has_proxy?
  85. !!@proxy_address && !!@proxy_port
  86. end
  87.  
  88.  
  89. private
  90.  
  91. def parse(body)
  92. results = case @mime_type
  93. when :xml
  94. Hash.from_xml(body)
  95. when :json
  96. JSON.parse(body)
  97. else
  98. body
  99. end
  100. results
  101. end
  102.  
  103. def http
  104. net = has_proxy? ? Net::HTTP.new(@uri.host, @uri.port, @proxy_address, @proxy_port) : Net::HTTP.new(@uri.host, @uri.port)
  105. net.use_ssl = use_ssl?
  106. net.verify_mode = OpenSSL::SSL::VERIFY_NONE
  107. net
  108. end
  109.  
  110. def normalize(url)
  111. url =~ /^https?:\/\// ? url : "http#{'s' if url.include?(':443')}://#{url}"
  112. end
  113. end
Add Comment
Please, Sign In to add comment