authorization_header_parser 1.0.0 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
[![Build Status](https://travis-ci.org/WeTransfer/authorization_header_parser.svg?branch=master)](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
|