httpi 0.7.9 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []