authorization_header_parser 1.0.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.gitignore +50 -0
- data/.rubocop.yml +4 -0
- data/.travis.yml +5 -0
- data/Gemfile +1 -6
- data/README.md +4 -2
- data/Rakefile +5 -50
- data/authorization_header_parser.gemspec +28 -0
- data/lib/authorization_header_parser.rb +38 -25
- data/spec/authorization_header_parser_spec.rb +61 -50
- metadata +25 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 250103e9c99ee4a6be24cd0f88c6c12232fd351b2f0025954c5ab1092cd9d853
|
4
|
+
data.tar.gz: 75ffead6c93f30c5a6c264edc3f40e17d519fd540a356a0896b58327036f7ae0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 357ae1add710a6b2c32d86baf0e308c417d4a78ea1b3793ae18bb1ffe6e72906e6cfa9002655b0054d020fc5e6e544f78a61bb35b47b07a32f9ec3d31d6151db
|
7
|
+
data.tar.gz: 273c99a97f5c3630c2106d53c52262078fd3d749d23edd88513a47ba3435b3ed27f6cdc215f853c5d420c50f52ce8ae86d705ea32089a61b776bab8a306c9386
|
data/.gitignore
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# rcov generated
|
2
|
+
coverage
|
3
|
+
coverage.data
|
4
|
+
|
5
|
+
# rdoc generated
|
6
|
+
rdoc
|
7
|
+
|
8
|
+
# yard generated
|
9
|
+
doc
|
10
|
+
.yardoc
|
11
|
+
|
12
|
+
# bundler
|
13
|
+
.bundle
|
14
|
+
Gemfile.lock
|
15
|
+
|
16
|
+
# jeweler generated
|
17
|
+
pkg
|
18
|
+
|
19
|
+
# Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
|
20
|
+
#
|
21
|
+
# * Create a file at ~/.gitignore
|
22
|
+
# * Include files you want ignored
|
23
|
+
# * Run: git config --global core.excludesfile ~/.gitignore
|
24
|
+
#
|
25
|
+
# After doing this, these files will be ignored in all your git projects,
|
26
|
+
# saving you from having to 'pollute' every project you touch with them
|
27
|
+
#
|
28
|
+
# Not sure what to needs to be ignored for particular editors/OSes? Here's some ideas to get you started. (Remember, remove the leading # of the line)
|
29
|
+
#
|
30
|
+
# For MacOS:
|
31
|
+
#
|
32
|
+
#.DS_Store
|
33
|
+
|
34
|
+
# For TextMate
|
35
|
+
#*.tmproj
|
36
|
+
#tmtags
|
37
|
+
|
38
|
+
# For emacs:
|
39
|
+
#*~
|
40
|
+
#\#*
|
41
|
+
#.\#*
|
42
|
+
|
43
|
+
# For vim:
|
44
|
+
#*.swp
|
45
|
+
|
46
|
+
# For redcar:
|
47
|
+
#.redcar
|
48
|
+
|
49
|
+
# For rubinius:
|
50
|
+
#*.rbc
|
data/.rubocop.yml
ADDED
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# authorization_header_parser
|
2
2
|
|
3
|
+
[](https://travis-ci.org/WeTransfer/authorization_header_parser)
|
4
|
+
|
3
5
|
Parse custom authorization parameters from `Authorization:` HTTP headers into a neat
|
4
6
|
Ruby Hash. Works best in combination with `Rack::Auth::AbstractRequest`
|
5
7
|
|
@@ -16,7 +18,7 @@ or for both scheme and params:
|
|
16
18
|
Works well for token, Digest, OAuth and other schemes using custom authorization parameters.
|
17
19
|
|
18
20
|
## Contributing to authorization_header_parser
|
19
|
-
|
21
|
+
|
20
22
|
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
|
21
23
|
* Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
|
22
24
|
* Fork the project.
|
@@ -27,6 +29,6 @@ Works well for token, Digest, OAuth and other schemes using custom authorization
|
|
27
29
|
|
28
30
|
## Copyright
|
29
31
|
|
30
|
-
Copyright (c)
|
32
|
+
Copyright (c) 2019 WeTransfer. See LICENSE.txt for
|
31
33
|
further details.
|
32
34
|
|
data/Rakefile
CHANGED
@@ -1,52 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
require 'bundler'
|
5
|
-
begin
|
6
|
-
Bundler.setup(:default, :development)
|
7
|
-
rescue Bundler::BundlerError => e
|
8
|
-
$stderr.puts e.message
|
9
|
-
$stderr.puts "Run `bundle install` to install missing gems"
|
10
|
-
exit e.status_code
|
11
|
-
end
|
12
|
-
require 'rake'
|
13
|
-
|
14
|
-
require_relative 'lib/authorization_header_parser'
|
15
|
-
|
16
|
-
require 'jeweler'
|
17
|
-
Jeweler::Tasks.new do |gem|
|
18
|
-
gem.version = AuthorizationHeaderParser::VERSION
|
19
|
-
gem.name = "authorization_header_parser"
|
20
|
-
gem.homepage = "http://github.com/julik/authorization_header_parser"
|
21
|
-
gem.license = "MIT"
|
22
|
-
gem.description = %Q{Parses parametrized HTTP Authorization headers}
|
23
|
-
gem.summary = %Q{such as OAuth and Digest}
|
24
|
-
gem.email = "me@julik.nl"
|
25
|
-
gem.authors = ["Julik Tarkhanov"]
|
26
|
-
# dependencies defined in Gemfile
|
27
|
-
end
|
28
|
-
Jeweler::RubygemsDotOrgTasks.new
|
29
|
-
|
30
|
-
require 'rspec/core'
|
1
|
+
require 'bundler/gem_tasks'
|
31
2
|
require 'rspec/core/rake_task'
|
32
|
-
|
33
|
-
spec.pattern = FileList['spec/**/*_spec.rb']
|
34
|
-
end
|
35
|
-
|
36
|
-
desc "Code coverage detail"
|
37
|
-
task :simplecov do
|
38
|
-
ENV['COVERAGE'] = "true"
|
39
|
-
Rake::Task['spec'].execute
|
40
|
-
end
|
41
|
-
|
42
|
-
task :default => :spec
|
43
|
-
|
44
|
-
require 'rdoc/task'
|
45
|
-
Rake::RDocTask.new do |rdoc|
|
46
|
-
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
3
|
+
require 'rubocop/rake_task'
|
47
4
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
52
|
-
end
|
5
|
+
RSpec::Core::RakeTask.new(:spec)
|
6
|
+
RuboCop::RakeTask.new(:rubocop)
|
7
|
+
task default: [:spec, :rubocop]
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require File.join(File.expand_path('../lib', __FILE__), 'authorization_header_parser')
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = "authorization_header_parser"
|
5
|
+
s.version = AuthorizationHeaderParser::VERSION
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.require_paths = ["lib"]
|
9
|
+
s.authors = ["WeTransfer"]
|
10
|
+
s.date = "2015-06-29"
|
11
|
+
s.description = "Parses parametrized HTTP Authorization headers"
|
12
|
+
s.email = "info@wetransfer.com"
|
13
|
+
s.extra_rdoc_files = [
|
14
|
+
"LICENSE.txt",
|
15
|
+
"README.md"
|
16
|
+
]
|
17
|
+
s.files = `git ls-files -z`.split("\x0")
|
18
|
+
s.homepage = "http://github.com/wetransfer/authorization_header_parser"
|
19
|
+
s.licenses = ["MIT"]
|
20
|
+
s.rubygems_version = "2.2.2"
|
21
|
+
s.summary = "such as OAuth and Digest"
|
22
|
+
|
23
|
+
s.specification_version = 4
|
24
|
+
s.add_development_dependency 'bundler'
|
25
|
+
s.add_development_dependency 'rspec', '~> 3'
|
26
|
+
s.add_development_dependency 'rake', '~> 10'
|
27
|
+
s.add_development_dependency 'wetransfer_style', '0.6.0'
|
28
|
+
end
|
@@ -1,22 +1,33 @@
|
|
1
1
|
require 'strscan'
|
2
2
|
|
3
|
-
|
4
3
|
module AuthorizationHeaderParser
|
5
|
-
VERSION = '1.
|
6
|
-
|
7
|
-
|
4
|
+
VERSION = '1.1.1'
|
5
|
+
|
6
|
+
class InvalidHeader < StandardError
|
7
|
+
end
|
8
|
+
|
9
|
+
class ParseError < InvalidHeader
|
10
|
+
def initialize(message, scanner)
|
11
|
+
str = scanner.string
|
12
|
+
from = [(scanner.pos - 5), 0].sort.pop
|
13
|
+
upto = [(scanner.pos + 5), str.length].sort.shift
|
14
|
+
piece = str[from..upto]
|
15
|
+
super "#{message} - at #{scanner.pos} (around #{piece.inspect})"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
8
19
|
# Parse a custom scheme + params Authorization header.
|
9
20
|
#
|
10
|
-
# parse('absurd-auth token="12345"') #=> ['absurd-auth', {'token' => '12345}]
|
21
|
+
# parse('absurd-auth token="12345"') #=> ['absurd-auth', {'token' => '12345'}]
|
11
22
|
def parse(value)
|
12
23
|
scanner = StringScanner.new(value)
|
13
24
|
scheme = scanner.scan(NON_WHITESPACE)
|
14
|
-
raise InvalidHeader
|
25
|
+
raise InvalidHeader, "Scheme not provided" unless scheme
|
15
26
|
scanner.skip(WHITESPACE)
|
16
|
-
|
27
|
+
|
17
28
|
[scheme.strip, extract_params_from_scanner(scanner)]
|
18
29
|
end
|
19
|
-
|
30
|
+
|
20
31
|
# Parse Authorization params. Most useful in combination with Rack::Auth::AbstractRequest
|
21
32
|
#
|
22
33
|
# For instance, with 'Authorization: absurd-auth token="12345"':
|
@@ -26,33 +37,37 @@ module AuthorizationHeaderParser
|
|
26
37
|
def parse_params(string)
|
27
38
|
extract_params_from_scanner(StringScanner.new(string))
|
28
39
|
end
|
29
|
-
|
40
|
+
|
30
41
|
extend self
|
31
|
-
|
42
|
+
|
32
43
|
private
|
33
|
-
|
44
|
+
|
34
45
|
ANYTHING_BUT_EQ = /[^\s\=]+/
|
35
46
|
EQ = /=/
|
36
|
-
|
47
|
+
UNTIL_BACKSLASH_OR_QUOTE = /[^\\"]+/
|
37
48
|
ESCAPED_QUOTE = /\\"/
|
38
49
|
QUOTE = /"/
|
39
50
|
WHITESPACE = /\s+/
|
40
51
|
COMMA = /,/
|
41
52
|
NON_WHITESPACE = /[^\s]+/
|
42
|
-
|
53
|
+
|
43
54
|
# http://codereview.stackexchange.com/questions/41270
|
44
55
|
# http://stackoverflow.com/questions/134936
|
45
56
|
def extract_params_from_scanner(scanner)
|
46
57
|
params = {}
|
47
|
-
until scanner.eos?
|
58
|
+
until scanner.eos?
|
48
59
|
key = scanner.scan(ANYTHING_BUT_EQ)
|
49
|
-
raise
|
50
|
-
|
51
|
-
|
52
|
-
|
60
|
+
raise ParseError.new("Expected =, but found none", scanner) unless scanner.skip(EQ)
|
61
|
+
|
62
|
+
if scanner.eos? # Last parameter was empty, return
|
63
|
+
params[key] = ''
|
64
|
+
return params
|
65
|
+
end
|
66
|
+
|
67
|
+
if scanner.skip(QUOTE) # Quoted value
|
53
68
|
buf = ''
|
54
69
|
until scanner.eos?
|
55
|
-
if scanner.scan(
|
70
|
+
if scanner.scan(UNTIL_BACKSLASH_OR_QUOTE)
|
56
71
|
buf << scanner.matched
|
57
72
|
elsif scanner.scan(ESCAPED_QUOTE)
|
58
73
|
buf << '"'
|
@@ -61,16 +76,14 @@ module AuthorizationHeaderParser
|
|
61
76
|
break
|
62
77
|
end
|
63
78
|
end
|
64
|
-
|
65
|
-
scanner.unscan # Bare parameter, backtrack 1 byte
|
66
|
-
unless bare_value = scanner.scan(/[^,"]+/)
|
67
|
-
raise InvalidHeader, "Expected a bare parameter value at #{scanner.pos}"
|
68
|
-
end
|
79
|
+
elsif bare_value = scanner.scan(/[^,"]+/) # Bare parameter
|
69
80
|
params[key] = bare_value
|
81
|
+
else # Empty parameter
|
82
|
+
params[key] = ''
|
70
83
|
end
|
71
84
|
scanner.skip(WHITESPACE)
|
72
85
|
if !scanner.eos? && !scanner.skip(COMMA)
|
73
|
-
raise
|
86
|
+
raise ParseError.new("Expected end of header or a comma", scanner)
|
74
87
|
end
|
75
88
|
scanner.skip(WHITESPACE)
|
76
89
|
end
|
@@ -4,68 +4,84 @@ describe "AuthorizationHeaderParser" do
|
|
4
4
|
context '.parse_params' do
|
5
5
|
it 'parses only the parameter string' do
|
6
6
|
params = AuthorizationHeaderParser.parse_params('foo=bar, baz=bad')
|
7
|
-
expect(params).to eq(
|
7
|
+
expect(params).to eq("foo" => "bar", "baz" => "bad")
|
8
8
|
end
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
context '.parse' do
|
12
|
+
it 'parses a simple Token header with empty parameters' do
|
13
|
+
header = 'Token foo=, baz='
|
14
|
+
parsed = AuthorizationHeaderParser.parse(header)
|
15
|
+
scheme, params = parsed
|
16
|
+
expect(scheme).to eq('Token')
|
17
|
+
expect(params).to eq("foo" => "", "baz" => "")
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'parses a simple Token header with some parameters being empty' do
|
21
|
+
header = 'Token foo=, bar="Value", baz='
|
22
|
+
parsed = AuthorizationHeaderParser.parse(header)
|
23
|
+
scheme, params = parsed
|
24
|
+
expect(scheme).to eq('Token')
|
25
|
+
expect(params).to eq("foo" => "", "bar" => "Value", "baz" => "")
|
26
|
+
end
|
27
|
+
|
12
28
|
it 'parses a simple Token header' do
|
13
29
|
header = 'Token foo=bar, baz=bad'
|
14
30
|
parsed = AuthorizationHeaderParser.parse(header)
|
15
31
|
scheme, params = parsed
|
16
32
|
expect(scheme).to eq('Token')
|
17
|
-
expect(params).to eq(
|
33
|
+
expect(params).to eq("foo" => "bar", "baz" => "bad")
|
18
34
|
end
|
19
|
-
|
35
|
+
|
20
36
|
it 'parses a header with an escaped quote' do
|
21
|
-
digest_header = 'Custom param="value\"such and such\""'
|
37
|
+
digest_header = 'Custom param="value\"such and such\""'
|
22
38
|
parsed = AuthorizationHeaderParser.parse(digest_header)
|
23
39
|
scheme, params = parsed
|
24
40
|
expect(scheme).to eq('Custom')
|
25
|
-
expect(params).to eq(
|
41
|
+
expect(params).to eq("param" => 'value"such and such"')
|
26
42
|
end
|
27
|
-
|
43
|
+
|
28
44
|
it "parses a Digest header" do
|
29
45
|
digest_header = 'Digest qop="chap",
|
30
46
|
realm="testrealm@host.com",
|
31
47
|
username="Foobear",
|
32
48
|
response="6629fae49393a05397450978507c4ef1",
|
33
49
|
cnonce="5ccc069c403ebaf9f0171e9517f40e41"'
|
34
|
-
|
50
|
+
|
35
51
|
parsed = AuthorizationHeaderParser.parse(digest_header)
|
36
52
|
scheme, params = parsed
|
37
53
|
expect(scheme).to eq('Digest')
|
38
|
-
expect(params).to eq(
|
39
|
-
"qop"=>"chap",
|
40
|
-
"realm"=>"testrealm@host.com",
|
41
|
-
"username"=>"Foobear",
|
42
|
-
"response"=>"6629fae49393a05397450978507c4ef1",
|
43
|
-
"cnonce"=>"5ccc069c403ebaf9f0171e9517f40e41"
|
44
|
-
|
54
|
+
expect(params).to eq(
|
55
|
+
"qop" => "chap",
|
56
|
+
"realm" => "testrealm@host.com",
|
57
|
+
"username" => "Foobear",
|
58
|
+
"response" => "6629fae49393a05397450978507c4ef1",
|
59
|
+
"cnonce" => "5ccc069c403ebaf9f0171e9517f40e41"
|
60
|
+
)
|
45
61
|
end
|
46
|
-
|
62
|
+
|
47
63
|
it 'parses an OAuth header from Twitter documentation' do
|
48
|
-
twitter_header = 'OAuth oauth_consumer_key="xvz1evFS4wEEPTGEFPHBog",
|
49
|
-
oauth_nonce="kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg",
|
50
|
-
oauth_signature="tnnArxj06cWHq44gCs1OSKk%2FjLY%3D",
|
51
|
-
oauth_signature_method="HMAC-SHA1",
|
52
|
-
oauth_timestamp="1318622958",
|
53
|
-
oauth_token="370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb",
|
64
|
+
twitter_header = 'OAuth oauth_consumer_key="xvz1evFS4wEEPTGEFPHBog",
|
65
|
+
oauth_nonce="kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg",
|
66
|
+
oauth_signature="tnnArxj06cWHq44gCs1OSKk%2FjLY%3D",
|
67
|
+
oauth_signature_method="HMAC-SHA1",
|
68
|
+
oauth_timestamp="1318622958",
|
69
|
+
oauth_token="370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb",
|
54
70
|
oauth_version="1.0"'
|
55
71
|
parsed = AuthorizationHeaderParser.parse(twitter_header)
|
56
72
|
scheme, params = parsed
|
57
73
|
expect(scheme).to eq("OAuth")
|
58
|
-
expect(params).to eq(
|
59
|
-
"oauth_consumer_key"=>"xvz1evFS4wEEPTGEFPHBog",
|
60
|
-
"oauth_nonce"=>"kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg",
|
61
|
-
"oauth_signature"=>"tnnArxj06cWHq44gCs1OSKk%2FjLY%3D",
|
62
|
-
"oauth_signature_method"=>"HMAC-SHA1",
|
63
|
-
"oauth_timestamp"=>"1318622958",
|
64
|
-
"oauth_token"=>"370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb",
|
65
|
-
"oauth_version"=>"1.0"
|
66
|
-
|
74
|
+
expect(params).to eq(
|
75
|
+
"oauth_consumer_key" => "xvz1evFS4wEEPTGEFPHBog",
|
76
|
+
"oauth_nonce" => "kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg",
|
77
|
+
"oauth_signature" => "tnnArxj06cWHq44gCs1OSKk%2FjLY%3D",
|
78
|
+
"oauth_signature_method" => "HMAC-SHA1",
|
79
|
+
"oauth_timestamp" => "1318622958",
|
80
|
+
"oauth_token" => "370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb",
|
81
|
+
"oauth_version" => "1.0"
|
82
|
+
)
|
67
83
|
end
|
68
|
-
|
84
|
+
|
69
85
|
it 'parses another OAuth params example' do
|
70
86
|
oauth_header = 'OAuth realm="",
|
71
87
|
oauth_nonce="72250409",
|
@@ -74,40 +90,35 @@ describe "AuthorizationHeaderParser" do
|
|
74
90
|
oauth_signature_method="HMAC-SHA1",
|
75
91
|
oauth_version="1.0",
|
76
92
|
oauth_signature="IBlWhOm3PuDwaSdxE/Qu4RKPtVE="'
|
77
|
-
|
93
|
+
|
78
94
|
parsed = AuthorizationHeaderParser.parse(oauth_header)
|
79
95
|
scheme, params = parsed
|
80
96
|
expect(scheme).to eq("OAuth")
|
81
|
-
expect(params).to eq(
|
82
|
-
"realm"=>"",
|
83
|
-
"oauth_nonce" => "72250409",
|
84
|
-
"oauth_timestamp"=>"1294966759",
|
85
|
-
"oauth_consumer_key"=>"Dummy",
|
86
|
-
"oauth_signature_method"=>"HMAC-SHA1",
|
87
|
-
"oauth_version"=>"1.0",
|
88
|
-
"oauth_signature"=>"IBlWhOm3PuDwaSdxE/Qu4RKPtVE="
|
89
|
-
|
97
|
+
expect(params).to eq(
|
98
|
+
"realm" => "",
|
99
|
+
"oauth_nonce" => "72250409",
|
100
|
+
"oauth_timestamp" => "1294966759",
|
101
|
+
"oauth_consumer_key" => "Dummy",
|
102
|
+
"oauth_signature_method" => "HMAC-SHA1",
|
103
|
+
"oauth_version" => "1.0",
|
104
|
+
"oauth_signature" => "IBlWhOm3PuDwaSdxE/Qu4RKPtVE="
|
105
|
+
)
|
90
106
|
end
|
91
107
|
end
|
92
|
-
|
108
|
+
|
93
109
|
context 'with invalid headers' do
|
94
110
|
it 'raises InvalidHeader' do
|
95
|
-
expect {
|
96
|
-
AuthorizationHeaderParser.parse_params('foo=')
|
97
|
-
}.to raise_error(AuthorizationHeaderParser::InvalidHeader, /Expected opening of a parameter/)
|
98
|
-
|
99
111
|
expect {
|
100
112
|
AuthorizationHeaderParser.parse_params('foo=bar"')
|
101
113
|
}.to raise_error(AuthorizationHeaderParser::InvalidHeader, /Expected end of header or a comma/)
|
102
|
-
|
114
|
+
|
103
115
|
expect {
|
104
116
|
AuthorizationHeaderParser.parse_params('FONDBSJDJAHJDHAHUYHJHJBDA')
|
105
117
|
}.to raise_error(AuthorizationHeaderParser::InvalidHeader, /Expected =, but found none/)
|
106
|
-
|
118
|
+
|
107
119
|
expect {
|
108
120
|
AuthorizationHeaderParser.parse_params('foo="bar"baz"bad" another=123')
|
109
121
|
}.to raise_error(AuthorizationHeaderParser::InvalidHeader, /Expected end of header or a comma/)
|
110
122
|
end
|
111
123
|
end
|
112
|
-
|
113
124
|
end
|
metadata
CHANGED
@@ -1,73 +1,73 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: authorization_header_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- WeTransfer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
date: 2015-06-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: rspec
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '3
|
33
|
+
version: '3'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '3
|
40
|
+
version: '3'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '10'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '10'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: wetransfer_style
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - '='
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 0.6.0
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - '='
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 0.6.0
|
69
69
|
description: Parses parametrized HTTP Authorization headers
|
70
|
-
email:
|
70
|
+
email: info@wetransfer.com
|
71
71
|
executables: []
|
72
72
|
extensions: []
|
73
73
|
extra_rdoc_files:
|
@@ -75,15 +75,19 @@ extra_rdoc_files:
|
|
75
75
|
- README.md
|
76
76
|
files:
|
77
77
|
- ".document"
|
78
|
+
- ".gitignore"
|
78
79
|
- ".rspec"
|
80
|
+
- ".rubocop.yml"
|
81
|
+
- ".travis.yml"
|
79
82
|
- Gemfile
|
80
83
|
- LICENSE.txt
|
81
84
|
- README.md
|
82
85
|
- Rakefile
|
86
|
+
- authorization_header_parser.gemspec
|
83
87
|
- lib/authorization_header_parser.rb
|
84
88
|
- spec/authorization_header_parser_spec.rb
|
85
89
|
- spec/spec_helper.rb
|
86
|
-
homepage: http://github.com/
|
90
|
+
homepage: http://github.com/wetransfer/authorization_header_parser
|
87
91
|
licenses:
|
88
92
|
- MIT
|
89
93
|
metadata: {}
|
@@ -102,8 +106,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
102
106
|
- !ruby/object:Gem::Version
|
103
107
|
version: '0'
|
104
108
|
requirements: []
|
105
|
-
|
106
|
-
rubygems_version: 2.2.2
|
109
|
+
rubygems_version: 3.0.6
|
107
110
|
signing_key:
|
108
111
|
specification_version: 4
|
109
112
|
summary: such as OAuth and Digest
|