httpi 0.7.9 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/httpi.gemspec +1 -0
- data/lib/httpi.rb +3 -3
- data/lib/httpi/adapter.rb +6 -6
- data/lib/httpi/adapter/curb.rb +8 -2
- data/lib/httpi/adapter/httpclient.rb +2 -2
- data/lib/httpi/adapter/net_http.rb +5 -1
- data/lib/httpi/auth/config.rb +14 -1
- data/lib/httpi/response.rb +2 -1
- data/lib/httpi/version.rb +1 -1
- data/spec/httpi/httpi_spec.rb +3 -2
- data/spec/httpi/response_spec.rb +6 -0
- metadata +33 -17
data/httpi.gemspec
CHANGED
data/lib/httpi.rb
CHANGED
@@ -73,7 +73,7 @@ module HTTPI
|
|
73
73
|
|
74
74
|
REQUEST_METHODS = [:get, :post, :head, :put, :delete]
|
75
75
|
|
76
|
-
DEFAULT_LOG_LEVEL = :
|
76
|
+
DEFAULT_LOG_LEVEL = :warn
|
77
77
|
|
78
78
|
class << self
|
79
79
|
|
@@ -154,7 +154,7 @@ module HTTPI
|
|
154
154
|
|
155
155
|
# Returns the log level. Defaults to :debug.
|
156
156
|
def log_level
|
157
|
-
@log_level ||=
|
157
|
+
@log_level ||= DEFAULT_LOG_LEVEL
|
158
158
|
end
|
159
159
|
|
160
160
|
# Logs given +messages+.
|
@@ -185,7 +185,7 @@ module HTTPI
|
|
185
185
|
adapter ||= Adapter.use
|
186
186
|
adapter, adapter_class = Adapter.find adapter
|
187
187
|
|
188
|
-
HTTPI.
|
188
|
+
HTTPI.logger.debug "HTTPI executes HTTP #{method.to_s.upcase} using the #{adapter} adapter"
|
189
189
|
yield adapter_class.new(request)
|
190
190
|
end
|
191
191
|
|
data/lib/httpi/adapter.rb
CHANGED
@@ -33,9 +33,9 @@ module HTTPI
|
|
33
33
|
# Returns a memoized +Hash+ of adapters.
|
34
34
|
def self.adapters
|
35
35
|
@adapters ||= {
|
36
|
-
:httpclient => { :class => HTTPClient, :require => "httpclient" },
|
37
|
-
:curb => { :class => Curb, :require => "curb" },
|
38
|
-
:net_http => { :class => NetHTTP, :require => "net/https" }
|
36
|
+
:httpclient => { :class => HTTPClient, :require => ["httpclient"] },
|
37
|
+
:curb => { :class => Curb, :require => ["curb"] },
|
38
|
+
:net_http => { :class => NetHTTP, :require => ["net/https", "net/ntlm_http"] }
|
39
39
|
}
|
40
40
|
end
|
41
41
|
|
@@ -54,12 +54,12 @@ module HTTPI
|
|
54
54
|
|
55
55
|
# Tries to load and return the given +adapter+ name and class and falls back to the +FALLBACK+ adapter.
|
56
56
|
def self.load_adapter(adapter)
|
57
|
-
|
57
|
+
adapters[adapter][:require].each { |dependency| require dependency }
|
58
58
|
[adapter, adapters[adapter][:class]]
|
59
59
|
rescue LoadError
|
60
|
-
HTTPI.
|
60
|
+
HTTPI.logger.warn "HTTPI tried to use the #{adapter} adapter, but was unable to find the library in the LOAD_PATH.",
|
61
61
|
"Falling back to using the #{FALLBACK} adapter now."
|
62
|
-
|
62
|
+
|
63
63
|
require adapters[FALLBACK][:require]
|
64
64
|
[FALLBACK, adapters[FALLBACK][:class]]
|
65
65
|
end
|
data/lib/httpi/adapter/curb.rb
CHANGED
@@ -59,6 +59,7 @@ module HTTPI
|
|
59
59
|
basic_setup request
|
60
60
|
setup_http_auth request if request.auth.http?
|
61
61
|
setup_ssl_auth request.auth.ssl if request.auth.ssl?
|
62
|
+
setup_ntlm_auth request if request.auth.ntlm?
|
62
63
|
end
|
63
64
|
|
64
65
|
def basic_setup(request)
|
@@ -83,6 +84,11 @@ module HTTPI
|
|
83
84
|
client.ssl_verify_peer = ssl.verify_mode == :peer
|
84
85
|
end
|
85
86
|
|
87
|
+
def setup_ntlm_auth(request)
|
88
|
+
client.username, client.password = *request.auth.credentials
|
89
|
+
client.http_auth_types = request.auth.type
|
90
|
+
end
|
91
|
+
|
86
92
|
def respond_with(client)
|
87
93
|
status, headers = parse_header_string(client.header_str)
|
88
94
|
Response.new client.response_code, headers, client.body_str
|
@@ -93,7 +99,7 @@ module HTTPI
|
|
93
99
|
def parse_header_string(header_string)
|
94
100
|
status, headers = nil, {}
|
95
101
|
return [status, headers] unless header_string
|
96
|
-
|
102
|
+
|
97
103
|
header_string.split(/\r\n/).each do |header|
|
98
104
|
if header =~ %r|^HTTP/1.[01] \d\d\d (.*)|
|
99
105
|
status = $1
|
@@ -110,7 +116,7 @@ module HTTPI
|
|
110
116
|
end
|
111
117
|
end
|
112
118
|
end
|
113
|
-
|
119
|
+
|
114
120
|
[status, headers]
|
115
121
|
end
|
116
122
|
|
@@ -66,7 +66,7 @@ module HTTPI
|
|
66
66
|
|
67
67
|
def setup_client(request)
|
68
68
|
basic_setup request
|
69
|
-
|
69
|
+
setup_auth request if request.auth.http? || request.auth.ntlm?
|
70
70
|
setup_ssl_auth request.auth.ssl if request.auth.ssl?
|
71
71
|
end
|
72
72
|
|
@@ -76,7 +76,7 @@ module HTTPI
|
|
76
76
|
client.receive_timeout = request.read_timeout if request.read_timeout
|
77
77
|
end
|
78
78
|
|
79
|
-
def
|
79
|
+
def setup_auth(request)
|
80
80
|
client.set_auth request.url, *request.auth.credentials
|
81
81
|
end
|
82
82
|
|
@@ -9,7 +9,7 @@ module HTTPI
|
|
9
9
|
# Adapter for the Net::HTTP client.
|
10
10
|
# http://ruby-doc.org/stdlib/libdoc/net/http/rdoc/
|
11
11
|
class NetHTTP
|
12
|
-
|
12
|
+
|
13
13
|
def initialize(request)
|
14
14
|
self.client = new_client request
|
15
15
|
end
|
@@ -88,6 +88,7 @@ module HTTPI
|
|
88
88
|
client.ca_file = ssl.ca_cert_file if ssl.ca_cert_file
|
89
89
|
client.verify_mode = ssl.openssl_verify_mode
|
90
90
|
end
|
91
|
+
|
91
92
|
|
92
93
|
def request_client(type, request)
|
93
94
|
request_class = case type
|
@@ -99,7 +100,10 @@ module HTTPI
|
|
99
100
|
end
|
100
101
|
|
101
102
|
request_client = request_class.new request.url.request_uri, request.headers
|
103
|
+
|
102
104
|
request_client.basic_auth *request.auth.credentials if request.auth.basic?
|
105
|
+
request_client.ntlm_auth *request.auth.credentials if request.auth.ntlm?
|
106
|
+
|
103
107
|
request_client
|
104
108
|
end
|
105
109
|
|
data/lib/httpi/auth/config.rb
CHANGED
@@ -10,7 +10,7 @@ module HTTPI
|
|
10
10
|
class Config
|
11
11
|
|
12
12
|
# Supported authentication types.
|
13
|
-
TYPES = [:basic, :digest, :ssl]
|
13
|
+
TYPES = [:basic, :digest, :ssl, :ntlm]
|
14
14
|
|
15
15
|
# Accessor for the HTTP basic auth credentials.
|
16
16
|
def basic(*args)
|
@@ -43,6 +43,19 @@ module HTTPI
|
|
43
43
|
type == :basic || type == :digest
|
44
44
|
end
|
45
45
|
|
46
|
+
# Accessor for the NTLM auth credentials.
|
47
|
+
def ntlm(*args)
|
48
|
+
return @ntlm if args.empty?
|
49
|
+
|
50
|
+
self.type = :ntlm
|
51
|
+
@ntlm = args.flatten.compact
|
52
|
+
end
|
53
|
+
|
54
|
+
# Returns whether to use NTLM auth.
|
55
|
+
def ntlm?
|
56
|
+
type == :ntlm
|
57
|
+
end
|
58
|
+
|
46
59
|
# Returns the <tt>HTTPI::Auth::SSL</tt> object.
|
47
60
|
def ssl
|
48
61
|
@ssl ||= SSL.new
|
data/lib/httpi/response.rb
CHANGED
@@ -68,9 +68,10 @@ module HTTPI
|
|
68
68
|
# Returns the gzip decoded response body.
|
69
69
|
def decoded_gzip_body
|
70
70
|
gzip = Zlib::GzipReader.new StringIO.new(raw_body)
|
71
|
+
raise ArgumentError.new "couldn't create gzip reader" unless gzip
|
71
72
|
gzip.read
|
72
73
|
ensure
|
73
|
-
gzip.close
|
74
|
+
gzip.close if gzip
|
74
75
|
end
|
75
76
|
|
76
77
|
# Returns the DIME decoded response body.
|
data/lib/httpi/version.rb
CHANGED
data/spec/httpi/httpi_spec.rb
CHANGED
@@ -291,8 +291,8 @@ describe HTTPI do
|
|
291
291
|
end
|
292
292
|
|
293
293
|
describe ".log_level" do
|
294
|
-
it "should default to :
|
295
|
-
HTTPI.log_level.should == :
|
294
|
+
it "should default to :warn" do
|
295
|
+
HTTPI.log_level.should == :warn
|
296
296
|
end
|
297
297
|
|
298
298
|
it "should set the log level to use" do
|
@@ -303,6 +303,7 @@ describe HTTPI do
|
|
303
303
|
|
304
304
|
describe ".log" do
|
305
305
|
it "should log given messages" do
|
306
|
+
HTTPI.log_level = :debug
|
306
307
|
HTTPI.logger.expects(:debug).with("Log this")
|
307
308
|
HTTPI.log "Log", "this"
|
308
309
|
end
|
data/spec/httpi/response_spec.rb
CHANGED
@@ -79,6 +79,12 @@ describe HTTPI::Response do
|
|
79
79
|
it "should return the (gzip decoded) HTTP response body" do
|
80
80
|
response.body.should == Fixture.xml
|
81
81
|
end
|
82
|
+
|
83
|
+
it "should bubble Zlib errors" do
|
84
|
+
arbitrary_error = Class.new(ArgumentError)
|
85
|
+
Zlib::GzipReader.expects(:new).raises(arbitrary_error)
|
86
|
+
lambda { response.body }.should raise_error(arbitrary_error)
|
87
|
+
end
|
82
88
|
end
|
83
89
|
|
84
90
|
describe "#raw_body" do
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: httpi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 63
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 8
|
9
|
+
- 0
|
10
|
+
version: 0.8.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Daniel Harrington
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2011-
|
19
|
+
date: 2011-03-07 00:00:00 +01:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -34,9 +34,25 @@ dependencies:
|
|
34
34
|
type: :runtime
|
35
35
|
version_requirements: *id001
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
|
-
name:
|
37
|
+
name: ntlm-http
|
38
38
|
prerelease: false
|
39
39
|
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
hash: 25
|
45
|
+
segments:
|
46
|
+
- 0
|
47
|
+
- 1
|
48
|
+
- 1
|
49
|
+
version: 0.1.1
|
50
|
+
type: :runtime
|
51
|
+
version_requirements: *id002
|
52
|
+
- !ruby/object:Gem::Dependency
|
53
|
+
name: httpclient
|
54
|
+
prerelease: false
|
55
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
40
56
|
none: false
|
41
57
|
requirements:
|
42
58
|
- - ~>
|
@@ -48,11 +64,11 @@ dependencies:
|
|
48
64
|
- 5
|
49
65
|
version: 2.1.5
|
50
66
|
type: :development
|
51
|
-
version_requirements: *
|
67
|
+
version_requirements: *id003
|
52
68
|
- !ruby/object:Gem::Dependency
|
53
69
|
name: curb
|
54
70
|
prerelease: false
|
55
|
-
requirement: &
|
71
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
56
72
|
none: false
|
57
73
|
requirements:
|
58
74
|
- - ~>
|
@@ -64,11 +80,11 @@ dependencies:
|
|
64
80
|
- 8
|
65
81
|
version: 0.7.8
|
66
82
|
type: :development
|
67
|
-
version_requirements: *
|
83
|
+
version_requirements: *id004
|
68
84
|
- !ruby/object:Gem::Dependency
|
69
85
|
name: rspec
|
70
86
|
prerelease: false
|
71
|
-
requirement: &
|
87
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
72
88
|
none: false
|
73
89
|
requirements:
|
74
90
|
- - ~>
|
@@ -79,11 +95,11 @@ dependencies:
|
|
79
95
|
- 2
|
80
96
|
version: "2.2"
|
81
97
|
type: :development
|
82
|
-
version_requirements: *
|
98
|
+
version_requirements: *id005
|
83
99
|
- !ruby/object:Gem::Dependency
|
84
100
|
name: autotest
|
85
101
|
prerelease: false
|
86
|
-
requirement: &
|
102
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
87
103
|
none: false
|
88
104
|
requirements:
|
89
105
|
- - ">="
|
@@ -93,11 +109,11 @@ dependencies:
|
|
93
109
|
- 0
|
94
110
|
version: "0"
|
95
111
|
type: :development
|
96
|
-
version_requirements: *
|
112
|
+
version_requirements: *id006
|
97
113
|
- !ruby/object:Gem::Dependency
|
98
114
|
name: mocha
|
99
115
|
prerelease: false
|
100
|
-
requirement: &
|
116
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
101
117
|
none: false
|
102
118
|
requirements:
|
103
119
|
- - ~>
|
@@ -109,11 +125,11 @@ dependencies:
|
|
109
125
|
- 9
|
110
126
|
version: 0.9.9
|
111
127
|
type: :development
|
112
|
-
version_requirements: *
|
128
|
+
version_requirements: *id007
|
113
129
|
- !ruby/object:Gem::Dependency
|
114
130
|
name: webmock
|
115
131
|
prerelease: false
|
116
|
-
requirement: &
|
132
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
117
133
|
none: false
|
118
134
|
requirements:
|
119
135
|
- - ~>
|
@@ -125,7 +141,7 @@ dependencies:
|
|
125
141
|
- 0
|
126
142
|
version: 1.4.0
|
127
143
|
type: :development
|
128
|
-
version_requirements: *
|
144
|
+
version_requirements: *id008
|
129
145
|
description: HTTPI provides a common interface for Ruby HTTP libraries.
|
130
146
|
email: me@rubiii.com
|
131
147
|
executables: []
|