httpi 0.7.9 → 0.8.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.
@@ -15,6 +15,7 @@ Gem::Specification.new do |s|
15
15
  s.rubyforge_project = s.name
16
16
 
17
17
  s.add_dependency "rack"
18
+ s.add_dependency "ntlm-http", ">= 0.1.1"
18
19
 
19
20
  s.add_development_dependency "httpclient", "~> 2.1.5"
20
21
  s.add_development_dependency "curb", "~> 0.7.8"
@@ -73,7 +73,7 @@ module HTTPI
73
73
 
74
74
  REQUEST_METHODS = [:get, :post, :head, :put, :delete]
75
75
 
76
- DEFAULT_LOG_LEVEL = :debug
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 ||= :debug
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.log "HTTPI executes HTTP #{method.to_s.upcase} using the #{adapter} adapter"
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
 
@@ -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
- require adapters[adapter][:require]
57
+ adapters[adapter][:require].each { |dependency| require dependency }
58
58
  [adapter, adapters[adapter][:class]]
59
59
  rescue LoadError
60
- HTTPI.log "HTTPI tried to use the #{adapter} adapter, but was unable to find the library in the LOAD_PATH.",
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
@@ -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
- setup_http_auth request if request.auth.http?
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 setup_http_auth(request)
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
 
@@ -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
@@ -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.
@@ -1,5 +1,5 @@
1
1
  module HTTPI
2
2
 
3
- VERSION = "0.7.9"
3
+ VERSION = "0.8.0"
4
4
 
5
5
  end
@@ -291,8 +291,8 @@ describe HTTPI do
291
291
  end
292
292
 
293
293
  describe ".log_level" do
294
- it "should default to :debug" do
295
- HTTPI.log_level.should == :debug
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
@@ -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: 17
4
+ hash: 63
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 7
9
- - 9
10
- version: 0.7.9
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-01-26 00:00:00 +01:00
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: httpclient
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: *id002
67
+ version_requirements: *id003
52
68
  - !ruby/object:Gem::Dependency
53
69
  name: curb
54
70
  prerelease: false
55
- requirement: &id003 !ruby/object:Gem::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: *id003
83
+ version_requirements: *id004
68
84
  - !ruby/object:Gem::Dependency
69
85
  name: rspec
70
86
  prerelease: false
71
- requirement: &id004 !ruby/object:Gem::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: *id004
98
+ version_requirements: *id005
83
99
  - !ruby/object:Gem::Dependency
84
100
  name: autotest
85
101
  prerelease: false
86
- requirement: &id005 !ruby/object:Gem::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: *id005
112
+ version_requirements: *id006
97
113
  - !ruby/object:Gem::Dependency
98
114
  name: mocha
99
115
  prerelease: false
100
- requirement: &id006 !ruby/object:Gem::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: *id006
128
+ version_requirements: *id007
113
129
  - !ruby/object:Gem::Dependency
114
130
  name: webmock
115
131
  prerelease: false
116
- requirement: &id007 !ruby/object:Gem::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: *id007
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: []