httpi 0.9.7 → 1.0.0
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.
- data/CHANGELOG.md +8 -0
- data/README.md +4 -1
- data/lib/httpi.rb +4 -5
- data/lib/httpi/adapter/curb.rb +9 -0
- data/lib/httpi/auth/config.rb +13 -3
- data/lib/httpi/version.rb +1 -1
- data/spec/httpi/adapter/curb_spec.rb +7 -0
- data/spec/httpi/auth/config_spec.rb +18 -0
- data/spec/httpi/httpi_spec.rb +4 -4
- metadata +114 -100
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
## 1.0.0 (2012-06-07)
|
2
|
+
|
3
|
+
* Feature: [#48](https://github.com/rubiii/httpi/pull/48) @jheiss added support
|
4
|
+
for HTTP Negotiate/SPNEGO authentication (curb-specific).
|
5
|
+
|
6
|
+
* Fix: [#53](https://github.com/rubiii/httpi/issues/53) fixed an issue where
|
7
|
+
`HTTPI.log_level` did not do anything at all.
|
8
|
+
|
1
9
|
## 0.9.7 (2012-04-26)
|
2
10
|
|
3
11
|
* Fix: Merged [pull request 49](https://github.com/rubiii/httpi/pull/49) so that cert
|
data/README.md
CHANGED
@@ -167,13 +167,16 @@ request.read_timeout = 30 # sec
|
|
167
167
|
HTTPI::Auth
|
168
168
|
-----------
|
169
169
|
|
170
|
-
`HTTPI::Auth` supports HTTP basic and
|
170
|
+
`HTTPI::Auth` supports HTTP basic, digest and Negotiate/SPNEGO authentication.
|
171
171
|
|
172
172
|
``` ruby
|
173
173
|
request.auth.basic("username", "password") # HTTP basic auth credentials
|
174
174
|
request.auth.digest("username", "password") # HTTP digest auth credentials
|
175
|
+
request.auth.gssnegotiate # HTTP Negotiate/SPNEGO (aka Kerberos)
|
175
176
|
```
|
176
177
|
|
178
|
+
HTTP Negotiate only works when using Curb.
|
179
|
+
|
177
180
|
For experimental NTLM authentication, please use the [httpi-ntlm](rubygems.org/gems/httpi-ntml)
|
178
181
|
gem and provide feedback.
|
179
182
|
|
data/lib/httpi.rb
CHANGED
@@ -162,10 +162,9 @@ module HTTPI
|
|
162
162
|
@log_level ||= DEFAULT_LOG_LEVEL
|
163
163
|
end
|
164
164
|
|
165
|
-
# Logs given +
|
166
|
-
def log(
|
167
|
-
|
168
|
-
logger.send level, messages.join(" ") if log?
|
165
|
+
# Logs a given +message+.
|
166
|
+
def log(message)
|
167
|
+
logger.send(log_level, message) if log?
|
169
168
|
end
|
170
169
|
|
171
170
|
# Reset the default config.
|
@@ -190,7 +189,7 @@ module HTTPI
|
|
190
189
|
def with_adapter(method, request, adapter)
|
191
190
|
adapter, adapter_class = Adapter.load adapter
|
192
191
|
|
193
|
-
log
|
192
|
+
log "HTTPI executes HTTP #{method.to_s.upcase} using the #{adapter} adapter"
|
194
193
|
yield adapter_class.new(request)
|
195
194
|
end
|
196
195
|
|
data/lib/httpi/adapter/curb.rb
CHANGED
@@ -58,6 +58,7 @@ module HTTPI
|
|
58
58
|
def setup_client(request)
|
59
59
|
basic_setup request
|
60
60
|
setup_http_auth request if request.auth.http?
|
61
|
+
setup_gssnegotiate_auth request if request.auth.gssnegotiate?
|
61
62
|
setup_ssl_auth request.auth.ssl if request.auth.ssl?
|
62
63
|
end
|
63
64
|
|
@@ -75,6 +76,14 @@ module HTTPI
|
|
75
76
|
client.username, client.password = *request.auth.credentials
|
76
77
|
end
|
77
78
|
|
79
|
+
def setup_gssnegotiate_auth(request)
|
80
|
+
client.http_auth_types = request.auth.type
|
81
|
+
# The curl man page (http://curl.haxx.se/docs/manpage.html) says that
|
82
|
+
# you have to specify a fake username when using Negotiate auth, and
|
83
|
+
# they use ':' in their example.
|
84
|
+
client.username = ':'
|
85
|
+
end
|
86
|
+
|
78
87
|
def setup_ssl_auth(ssl)
|
79
88
|
client.cert_key = ssl.cert_key_file
|
80
89
|
client.cert = ssl.cert_file
|
data/lib/httpi/auth/config.rb
CHANGED
@@ -5,12 +5,12 @@ module HTTPI
|
|
5
5
|
|
6
6
|
# = HTTPI::Auth::Config
|
7
7
|
#
|
8
|
-
# Manages HTTP and SSL auth configuration. Currently supports HTTP basic/digest
|
9
|
-
# and SSL client authentication.
|
8
|
+
# Manages HTTP and SSL auth configuration. Currently supports HTTP basic/digest,
|
9
|
+
# Negotiate/SPNEGO, and SSL client authentication.
|
10
10
|
class Config
|
11
11
|
|
12
12
|
# Supported authentication types.
|
13
|
-
TYPES = [:basic, :digest, :ssl]
|
13
|
+
TYPES = [:basic, :digest, :gssnegotiate, :ssl]
|
14
14
|
|
15
15
|
# Accessor for the HTTP basic auth credentials.
|
16
16
|
def basic(*args)
|
@@ -38,6 +38,16 @@ module HTTPI
|
|
38
38
|
type == :digest
|
39
39
|
end
|
40
40
|
|
41
|
+
# Enable HTTP Negotiate/SPNEGO authentication.
|
42
|
+
def gssnegotiate
|
43
|
+
self.type = :gssnegotiate
|
44
|
+
end
|
45
|
+
|
46
|
+
# Returns whether to use HTTP Negotiate/SPNEGO auth.
|
47
|
+
def gssnegotiate?
|
48
|
+
type == :gssnegotiate
|
49
|
+
end
|
50
|
+
|
41
51
|
# Returns whether to use HTTP basic or dihest auth.
|
42
52
|
def http?
|
43
53
|
type == :basic || type == :digest
|
data/lib/httpi/version.rb
CHANGED
@@ -169,6 +169,13 @@ unless RUBY_PLATFORM =~ /java/
|
|
169
169
|
curb.expects(:http_auth_types=).with(:digest)
|
170
170
|
adapter.get(request)
|
171
171
|
end
|
172
|
+
|
173
|
+
it "is set to :gssnegotiate for HTTP Negotiate auth" do
|
174
|
+
request = basic_request { |request| request.auth.gssnegotiate }
|
175
|
+
|
176
|
+
curb.expects(:http_auth_types=).with(:gssnegotiate)
|
177
|
+
adapter.get(request)
|
178
|
+
end
|
172
179
|
end
|
173
180
|
|
174
181
|
describe "username and password" do
|
@@ -60,6 +60,24 @@ describe HTTPI::Auth::Config do
|
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
|
+
describe "#gssnegotiate" do
|
64
|
+
it "sets the authentication type to :gssnegotiate" do
|
65
|
+
auth.gssnegotiate
|
66
|
+
auth.type.should == :gssnegotiate
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe "#gssnegotiate?" do
|
71
|
+
it "defaults to return false" do
|
72
|
+
auth.should_not be_gssnegotiate
|
73
|
+
end
|
74
|
+
|
75
|
+
it "returns true for HTTP Negotiate auth" do
|
76
|
+
auth.gssnegotiate
|
77
|
+
auth.should be_gssnegotiate
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
63
81
|
describe "#http?" do
|
64
82
|
it "defaults to return false" do
|
65
83
|
auth.should_not be_http
|
data/spec/httpi/httpi_spec.rb
CHANGED
@@ -233,7 +233,7 @@ describe HTTPI do
|
|
233
233
|
before { opts[:class].any_instance.expects(method) }
|
234
234
|
|
235
235
|
it "logs that we're executing a request" do
|
236
|
-
HTTPI.expects(:log).with(
|
236
|
+
HTTPI.expects(:log).with("HTTPI executes HTTP #{method.to_s.upcase} using the #{adapter} adapter")
|
237
237
|
client.request method, request, adapter
|
238
238
|
end
|
239
239
|
|
@@ -274,9 +274,9 @@ describe HTTPI do
|
|
274
274
|
|
275
275
|
describe ".log" do
|
276
276
|
it "logs the given messages" do
|
277
|
-
HTTPI.log_level = :
|
278
|
-
HTTPI.logger.expects(:
|
279
|
-
HTTPI.log "Log
|
277
|
+
HTTPI.log_level = :info
|
278
|
+
HTTPI.logger.expects(:info).with("Log this")
|
279
|
+
HTTPI.log "Log this"
|
280
280
|
end
|
281
281
|
end
|
282
282
|
end
|
metadata
CHANGED
@@ -1,135 +1,139 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: httpi
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
version: 1.0.0
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
12
|
+
authors:
|
8
13
|
- Daniel Harrington
|
9
14
|
- Martin Tepper
|
10
15
|
autorequire:
|
11
16
|
bindir: bin
|
12
17
|
cert_chain: []
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
+
|
19
|
+
date: 2012-06-07 00:00:00 Z
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
18
23
|
none: false
|
19
|
-
requirements:
|
20
|
-
- -
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
hash: 3
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
version: "0"
|
31
|
+
name: rack
|
23
32
|
type: :runtime
|
24
33
|
prerelease: false
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
- - ! '>='
|
29
|
-
- !ruby/object:Gem::Version
|
30
|
-
version: '0'
|
31
|
-
- !ruby/object:Gem::Dependency
|
32
|
-
name: rake
|
33
|
-
requirement: !ruby/object:Gem::Requirement
|
34
|
+
requirement: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
34
37
|
none: false
|
35
|
-
requirements:
|
38
|
+
requirements:
|
36
39
|
- - ~>
|
37
|
-
- !ruby/object:Gem::Version
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
hash: 49
|
42
|
+
segments:
|
43
|
+
- 0
|
44
|
+
- 8
|
45
|
+
- 7
|
38
46
|
version: 0.8.7
|
47
|
+
name: rake
|
39
48
|
type: :development
|
40
49
|
prerelease: false
|
41
|
-
|
50
|
+
requirement: *id002
|
51
|
+
- !ruby/object:Gem::Dependency
|
52
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
42
53
|
none: false
|
43
|
-
requirements:
|
54
|
+
requirements:
|
44
55
|
- - ~>
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
|
47
|
-
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
hash: 13
|
58
|
+
segments:
|
59
|
+
- 2
|
60
|
+
- 7
|
61
|
+
version: "2.7"
|
48
62
|
name: rspec
|
49
|
-
requirement: !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
|
-
requirements:
|
52
|
-
- - ~>
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '2.7'
|
55
63
|
type: :development
|
56
64
|
prerelease: false
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
- - ~>
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
version: '2.7'
|
63
|
-
- !ruby/object:Gem::Dependency
|
64
|
-
name: mocha
|
65
|
-
requirement: !ruby/object:Gem::Requirement
|
65
|
+
requirement: *id003
|
66
|
+
- !ruby/object:Gem::Dependency
|
67
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
66
68
|
none: false
|
67
|
-
requirements:
|
69
|
+
requirements:
|
68
70
|
- - ~>
|
69
|
-
- !ruby/object:Gem::Version
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
hash: 41
|
73
|
+
segments:
|
74
|
+
- 0
|
75
|
+
- 9
|
76
|
+
- 9
|
70
77
|
version: 0.9.9
|
78
|
+
name: mocha
|
71
79
|
type: :development
|
72
80
|
prerelease: false
|
73
|
-
|
81
|
+
requirement: *id004
|
82
|
+
- !ruby/object:Gem::Dependency
|
83
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
74
84
|
none: false
|
75
|
-
requirements:
|
85
|
+
requirements:
|
76
86
|
- - ~>
|
77
|
-
- !ruby/object:Gem::Version
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
requirements:
|
84
|
-
- - ~>
|
85
|
-
- !ruby/object:Gem::Version
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
hash: 7
|
89
|
+
segments:
|
90
|
+
- 1
|
91
|
+
- 4
|
92
|
+
- 0
|
86
93
|
version: 1.4.0
|
94
|
+
name: webmock
|
87
95
|
type: :development
|
88
96
|
prerelease: false
|
89
|
-
|
97
|
+
requirement: *id005
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
version_requirements: &id006 !ruby/object:Gem::Requirement
|
90
100
|
none: false
|
91
|
-
requirements:
|
92
|
-
- -
|
93
|
-
- !ruby/object:Gem::Version
|
94
|
-
|
95
|
-
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
hash: 3
|
105
|
+
segments:
|
106
|
+
- 0
|
107
|
+
version: "0"
|
96
108
|
name: autotest
|
97
|
-
requirement: !ruby/object:Gem::Requirement
|
98
|
-
none: false
|
99
|
-
requirements:
|
100
|
-
- - ! '>='
|
101
|
-
- !ruby/object:Gem::Version
|
102
|
-
version: '0'
|
103
109
|
type: :development
|
104
110
|
prerelease: false
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
- - ! '>='
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: ZenTest
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
111
|
+
requirement: *id006
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
version_requirements: &id007 !ruby/object:Gem::Requirement
|
114
114
|
none: false
|
115
|
-
requirements:
|
116
|
-
- -
|
117
|
-
- !ruby/object:Gem::Version
|
115
|
+
requirements:
|
116
|
+
- - "="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
hash: 43
|
119
|
+
segments:
|
120
|
+
- 4
|
121
|
+
- 5
|
122
|
+
- 0
|
118
123
|
version: 4.5.0
|
124
|
+
name: ZenTest
|
119
125
|
type: :development
|
120
126
|
prerelease: false
|
121
|
-
|
122
|
-
none: false
|
123
|
-
requirements:
|
124
|
-
- - '='
|
125
|
-
- !ruby/object:Gem::Version
|
126
|
-
version: 4.5.0
|
127
|
+
requirement: *id007
|
127
128
|
description: HTTPI provides a common interface for Ruby HTTP libraries.
|
128
129
|
email: me@rubiii.com
|
129
130
|
executables: []
|
131
|
+
|
130
132
|
extensions: []
|
133
|
+
|
131
134
|
extra_rdoc_files: []
|
132
|
-
|
135
|
+
|
136
|
+
files:
|
133
137
|
- .gitignore
|
134
138
|
- .rspec
|
135
139
|
- .travis.yml
|
@@ -173,26 +177,36 @@ files:
|
|
173
177
|
- spec/support/matchers.rb
|
174
178
|
homepage: http://github.com/rubiii/httpi
|
175
179
|
licenses: []
|
180
|
+
|
176
181
|
post_install_message:
|
177
182
|
rdoc_options: []
|
178
|
-
|
183
|
+
|
184
|
+
require_paths:
|
179
185
|
- lib
|
180
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
186
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
181
187
|
none: false
|
182
|
-
requirements:
|
183
|
-
- -
|
184
|
-
- !ruby/object:Gem::Version
|
185
|
-
|
186
|
-
|
188
|
+
requirements:
|
189
|
+
- - ">="
|
190
|
+
- !ruby/object:Gem::Version
|
191
|
+
hash: 3
|
192
|
+
segments:
|
193
|
+
- 0
|
194
|
+
version: "0"
|
195
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
187
196
|
none: false
|
188
|
-
requirements:
|
189
|
-
- -
|
190
|
-
- !ruby/object:Gem::Version
|
191
|
-
|
197
|
+
requirements:
|
198
|
+
- - ">="
|
199
|
+
- !ruby/object:Gem::Version
|
200
|
+
hash: 3
|
201
|
+
segments:
|
202
|
+
- 0
|
203
|
+
version: "0"
|
192
204
|
requirements: []
|
205
|
+
|
193
206
|
rubyforge_project: httpi
|
194
|
-
rubygems_version: 1.8.
|
207
|
+
rubygems_version: 1.8.21
|
195
208
|
signing_key:
|
196
209
|
specification_version: 3
|
197
210
|
summary: Interface for Ruby HTTP libraries
|
198
211
|
test_files: []
|
212
|
+
|