Extensions for em-http so that we can use consumer.sign! with an EventMachine::HttpClient instance. This is purely syntactic sugar.
This code was lifted from the em-http-request because it was removed from the gem June 19, 2010 see: github.com/igrigorik/em-http-request/commit/d536fc17d56dbe55c487eab01e2ff9382a62598b
# File lib/oauth/client/em_http.rb, line 67 def normalize_uri @normalized_uri ||= begin uri = @uri.dup encoded_query = encode_query(@uri, @options[:query]) path, query = encoded_query.split("?", 2) uri.query = query unless encoded_query.empty? uri.path = path uri end end
Add the OAuth information to an HTTP request.
Depending on the options[:scheme]
setting this may add a
header, additional query string parameters, or additional POST body
parameters. The default scheme is header
, in which the OAuth parameters as put into the
Authorization
header.
http - Configured Net::HTTP instance, ignored in this scenario except for getting host.
consumer - OAuth::Consumer instance
token - OAuth::Token instance
options - Request-specific options (e.g. request_uri
,
consumer
, token
, scheme
,
signature_method
, nonce
, timestamp
)
This method also modifies the User-Agent
header to add the OAuth gem version.
See Also: OAuth core spec version 1.0, section 5.4.1
# File lib/oauth/client/em_http.rb, line 26 def oauth!(http, consumer = nil, token = nil, options = {}) options = { :request_uri => normalized_oauth_uri(http), :consumer => consumer, :token => token, :scheme => 'header', :signature_method => nil, :nonce => nil, :timestamp => nil }.merge(options) @oauth_helper = OAuth::Client::Helper.new(self, options) self.__send__(:"set_oauth_#{options[:scheme]}") end
Create a string suitable for signing for an HTTP request. This process
involves parameter normalization as specified in the OAuth specification. The exact normalization also
depends on the options[:scheme]
being used so this must match
what will be used for the request itself. The default scheme is
header
, in which the OAuth
parameters as put into the Authorization
header.
http - Configured Net::HTTP instance
consumer - OAuth::Consumer instance
token - OAuth::Token instance
options - Request-specific options (e.g. request_uri
,
consumer
, token
, scheme
,
signature_method
, nonce
, timestamp
)
See Also: OAuth core spec version 1.0, section 9.1.1
# File lib/oauth/client/em_http.rb, line 52 def signature_base_string(http, consumer = nil, token = nil, options = {}) options = { :request_uri => normalized_oauth_uri(http), :consumer => consumer, :token => token, :scheme => 'header', :signature_method => nil, :nonce => nil, :timestamp => nil }.merge(options) OAuth::Client::Helper.new(self, options).signature_base_string end
# File lib/oauth/client/em_http.rb, line 80 def combine_query(path, query, uri_query) combined_query = if query.kind_of?(Hash) query.map { |k, v| encode_param(k, v) }.join('&') else query.to_s end if !uri_query.to_s.empty? combined_query = [combined_query, uri_query].reject {|part| part.empty?}.join("&") end combined_query.to_s.empty? ? path : "#{path}?#{combined_query}" end
Since we expect to get the host etc details from the http instance (...), we create a fake url here. Surely this is a horrible, horrible idea?
# File lib/oauth/client/em_http.rb, line 94 def normalized_oauth_uri(http) uri = URI.parse(normalize_uri.path) uri.host = http.address uri.port = http.port if http.respond_to?(:use_ssl?) && http.use_ssl? uri.scheme = "https" else uri.scheme = "http" end uri.to_s end
# File lib/oauth/client/em_http.rb, line 112 def set_oauth_body raise NotImplementedError, 'please use the set_oauth_header method instead' end
# File lib/oauth/client/em_http.rb, line 107 def set_oauth_header headers = (self.options[:head] ||= {}) headers['Authorization'] = @oauth_helper.header end
# File lib/oauth/client/em_http.rb, line 116 def set_oauth_query_string raise NotImplementedError, 'please use the set_oauth_header method instead' end