class Net::Twitter::Api::Request
Public Class Methods
new(attrs = {})
click to toggle source
# File lib/net/twitter/api/request.rb, line 9 def initialize(attrs = {}) @host = 'api.twitter.com' @path = attrs.fetch :path, "/1.1/#{attrs[:endpoint]}.json" @query = attrs[:params].to_param if attrs[:params] @block = attrs.fetch :block, -> (request) {add_access_token! request} @method = attrs.fetch :method, :get end
Public Instance Methods
run()
click to toggle source
# File lib/net/twitter/api/request.rb, line 17 def run #print "#{as_curl}\n" case response = run_http_request when Net::HTTPOK JSON response.body when Net::HTTPTooManyRequests store_rate_limit_reset response.header["x-rate-limit-reset"].to_i run else raise Errors::ResponseError, response end end
Private Instance Methods
access_token()
click to toggle source
# File lib/net/twitter/api/request.rb, line 54 def access_token @@access_token ||= fetch_access_token end
add_access_token!(request)
click to toggle source
# File lib/net/twitter/api/request.rb, line 50 def add_access_token!(request) request.add_field 'Authorization', "Bearer #{access_token}" end
add_client_credentials!(request)
click to toggle source
# File lib/net/twitter/api/request.rb, line 68 def add_client_credentials!(request) request.initialize_http_header client_credentials_headers request.add_field 'Authorization', "Basic #{credentials}" request.set_form_data grant_type: 'client_credentials' end
apps()
click to toggle source
# File lib/net/twitter/api/request.rb, line 102 def apps @@apps ||= Net::Twitter.configuration.apps.map do |app| app.tap{app[:limit_reset] = nil} end end
as_curl()
click to toggle source
# File lib/net/twitter/api/request.rb, line 108 def as_curl 'curl'.tap do |curl| curl << " -X #{http_request.method}" http_request.each_header do |name, value| curl << %Q{ -H "#{name}: #{value}"} end curl << %Q{ -d '#{http_request.body}'} if http_request.body curl << %Q{ "#{@uri.to_s}"} end end
client_credentials_headers()
click to toggle source
# File lib/net/twitter/api/request.rb, line 74 def client_credentials_headers content_type = 'application/x-www-form-urlencoded;charset=UTF-8' {}.tap{|headers| headers['Content-Type'] = content_type} end
credentials()
click to toggle source
# File lib/net/twitter/api/request.rb, line 79 def credentials @@app = apps.find(next_available_app) do |app| app[:limit_reset].to_i < Time.now.to_i end Base64.strict_encode64 "#{@@app[:key]}:#{@@app[:secret]}" end
fetch_access_token()
click to toggle source
# File lib/net/twitter/api/request.rb, line 58 def fetch_access_token path = '/oauth2/token' block = -> (request) {add_client_credentials! request} request = Request.new path: path, method: :post, block: block authentication_data = request.run authentication_data['access_token'] # rescue Errors::Suspended # require 'pry'; binding.pry; true; end
http_request()
click to toggle source
# File lib/net/twitter/api/request.rb, line 39 def http_request http_class = "Net::HTTP::#{@method.capitalize}".constantize @http_request ||= http_class.new(uri.request_uri).tap do |request| @block.call request end end
next_available_app()
click to toggle source
# File lib/net/twitter/api/request.rb, line 86 def next_available_app Proc.new do next_limit_reset = @@apps.map{|app| app[:limit_reset]}.min sleep_time = next_limit_reset - Time.now.to_i puts "Sleeping for #{sleep_time}s\n" sleep sleep_time puts "Waking up\n" @@apps.find{|app| app[:limit_reset] == next_limit_reset} end end
run_http_request()
click to toggle source
# File lib/net/twitter/api/request.rb, line 33 def run_http_request Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http| http.request http_request end end
store_rate_limit_reset(limit_reset)
click to toggle source
# File lib/net/twitter/api/request.rb, line 97 def store_rate_limit_reset(limit_reset) @@app[:limit_reset] = limit_reset @@access_token, @@app, @http_request = nil, nil, nil end
uri()
click to toggle source
# File lib/net/twitter/api/request.rb, line 46 def uri @uri ||= URI::HTTPS.build host: @host, path: @path, query: @query end