class SocialNet::Twitter::Api::Request

Public Class Methods

new(attrs = {}) click to toggle source
# File lib/social_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/social_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/social_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/social_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/social_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/social_net/twitter/api/request.rb, line 102
def apps
  @@apps ||= SocialNet::Twitter.configuration.apps.map do |app|
    app.tap{app[:limit_reset] = nil}
  end
end
as_curl() click to toggle source
# File lib/social_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/social_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/social_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/social_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/social_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/social_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/social_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/social_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/social_net/twitter/api/request.rb, line 46
def uri
  @uri ||= URI::HTTPS.build host: @host, path: @path, query: @query
end