Module: Signet
- Defined in:
- lib/signet.rb,
lib/signet/errors.rb,
lib/signet/oauth_1.rb,
lib/signet/oauth_2.rb,
lib/signet/version.rb,
lib/signet/oauth_1/client.rb,
lib/signet/oauth_1/server.rb,
lib/signet/oauth_2/client.rb,
lib/signet/oauth_1/credential.rb,
lib/signet/oauth_1/signature_methods/rsa_sha1.rb,
lib/signet/oauth_1/signature_methods/hmac_sha1.rb,
lib/signet/oauth_1/signature_methods/plaintext.rb more...
Overview
:nodoc:
Defined Under Namespace
Modules: OAuth1, OAuth2 Classes: AuthorizationError, MalformedAuthorizationError, ParseError, RemoteServerError, UnexpectedStatusError, UnsafeOperationError
Constant Summary collapse
- VERSION =
"0.19.0".freeze
Class Method Summary collapse
Class Method Details
.parse_auth_param_list(auth_param_string) โ Object
[View source]
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/signet.rb', line 18 def self.parse_auth_param_list auth_param_string # Production rules from: # http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-12 token = /[-!#{$OUTPUT_RECORD_SEPARATOR}%&'*+.^_`|~0-9a-zA-Z]+/ d_qdtext = /[\s\x21\x23-\x5B\x5D-\x7E\x80-\xFF]/n d_quoted_pair = /\\[\s\x21-\x7E\x80-\xFF]/n d_qs = /"(?:#{d_qdtext}|#{d_quoted_pair})*"/ # Production rules that allow for more liberal parsing, i.e. single quotes s_qdtext = /[\s\x21-\x26\x28-\x5B\x5D-\x7E\x80-\xFF]/n s_quoted_pair = /\\[\s\x21-\x7E\x80-\xFF]/n s_qs = /'(?:#{s_qdtext}|#{s_quoted_pair})*'/ # Combine the above production rules to find valid auth-param pairs. auth_param = /((?:#{token})\s*=\s*(?:#{d_qs}|#{s_qs}|#{token}))/ auth_param_pairs = [] last_match = nil remainder = auth_param_string # Iterate over the string, consuming pair matches as we go. Verify that # pre-matches and post-matches contain only allowable characters. # # This would be way easier in Ruby 1.9, but we want backwards # compatibility. while (match = remainder.match auth_param) if match.pre_match && match.pre_match !~ /^[\s,]*$/ raise ParseError, "Unexpected auth param format: '#{auth_param_string}'." end auth_param_pairs << match.captures[0] # Appending pair remainder = match.post_match last_match = match end if last_match.post_match && last_match.post_match !~ /^[\s,]*$/ raise ParseError, "Unexpected auth param format: '#{auth_param_string}'." end # Now parse the auth-param pair strings & turn them into key-value pairs. (auth_param_pairs.each_with_object [] do |pair, accu| name, value = pair.split "=", 2 case value when /^".*"$/ value = value.gsub(/^"(.*)"$/, '\1').gsub(/\\(.)/, '\1') when /^'.*'$/ value = value.gsub(/^'(.*)'$/, '\1').gsub(/\\(.)/, '\1') when %r{[()<>@,;:\\"/\[\]?={}]} # Certain special characters are not allowed raise ParseError, "Unexpected characters in auth param " \ "list: '#{auth_param_string}'." end accu << [name, value] end) end |