httpi 2.4.0 → 2.4.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7fdb3bb23a9cba076a235fac76aa7aa0aa04a803
4
- data.tar.gz: 7740630503dc0ffedc3f909f1418d45f0a443156
3
+ metadata.gz: e6ca1f335780f0839e9e5316c9ecf1a6d3753bea
4
+ data.tar.gz: f5e52a1dde48d6c783c2bc66b691df4cb4e1f4cd
5
5
  SHA512:
6
- metadata.gz: 14a720954983eecb0fd4497f2c0e87269ceb5373c0856e19d4de9b7a102c7adba108e8fb44b020a80dc038b820355efffff9dfcdf0dad94f24668953c4d9b38d
7
- data.tar.gz: 5f8119a473f8daf6c7dfd597a172002ead1f5b1fceea7456c083e14a9daee93da63d23a7018030103389a3397ae9e6df986780e032a7612f5d39a482b3619f5c
6
+ metadata.gz: f7e7e5d0cf5c2a2f59ad4b8bf331c4917cfcef503c0e905b6613b08ad03a8a23e20727668b51a3e27762167905b5a3c1a526a9fb987cd1d528dd6429090ee98c
7
+ data.tar.gz: ffe4093b24fc493cda6c8b7e266a5abcdc97785759e59024a6f02ef984f15b9c6707e70dfbd76e7f29bd91ed5077af219bd5c593d99bc675f720024e467193c6
@@ -1,3 +1,9 @@
1
+ ### 2.4.1
2
+
3
+ * Fix: [#147](https://github.com/savonrb/httpi/pull/147) Fix call Curb client "SSL peer certificate or SSH remote key was not OK" bug
4
+ * Feature: [#145](https://github.com/savonrb/httpi/pull/145) Add support to http.rb adapter
5
+ * Feature: [#144](https://github.com/savonrb/httpi/pull/144) Add NTLM support for CURB
6
+
1
7
  ### 2.4.0
2
8
 
3
9
  * Formally drop support for ruby 1.8.7
data/Gemfile CHANGED
@@ -10,6 +10,7 @@ gem 'em-http-request', :require => false, :platforms => [:ruby,
10
10
  gem 'em-synchrony', :require => false, :platforms => [:ruby, :jruby]
11
11
  gem 'excon', '~> 0.21.0', :require => false, :platforms => [:ruby, :jruby]
12
12
  gem 'net-http-persistent', '~> 2.8', :require => false
13
+ gem 'http', :require => false
13
14
 
14
15
  # coverage
15
16
  gem 'simplecov', :require => false
@@ -11,6 +11,7 @@ require "httpi/adapter/net_http"
11
11
  require "httpi/adapter/net_http_persistent"
12
12
  require "httpi/adapter/em_http"
13
13
  require "httpi/adapter/rack"
14
+ require "httpi/adapter/http"
14
15
 
15
16
  # = HTTPI
16
17
  #
@@ -13,7 +13,7 @@ module HTTPI
13
13
  ADAPTERS = {}
14
14
  ADAPTER_CLASS_MAP = {}
15
15
 
16
- LOAD_ORDER = [:httpclient, :curb, :em_http, :excon, :net_http, :net_http_persistent]
16
+ LOAD_ORDER = [:httpclient, :curb, :em_http, :excon, :http, :net_http, :net_http_persistent]
17
17
 
18
18
  class << self
19
19
 
@@ -59,10 +59,11 @@ module HTTPI
59
59
  def setup_client
60
60
  basic_setup
61
61
 
62
- if @request.auth.ntlm?
63
- raise NotSupportedError, "curb does not support NTLM authentication"
62
+ if @request.auth.ntlm? && !Curl.ntlm?
63
+ raise NotSupportedError, "installed version of libcurl does not support NTLM authentication"
64
64
  end
65
65
 
66
+ setup_ntlm_auth if @request.auth.ntlm?
66
67
  setup_http_auth if @request.auth.http?
67
68
  setup_gssnegotiate_auth if @request.auth.gssnegotiate?
68
69
  setup_ssl_auth if @request.auth.ssl? || @request.ssl?
@@ -81,6 +82,11 @@ module HTTPI
81
82
  @client.set(:NOSIGNAL, true)
82
83
  end
83
84
 
85
+ def setup_ntlm_auth
86
+ @client.http_auth_types = @request.auth.type
87
+ @client.username, @client.password = *@request.auth.credentials
88
+ end
89
+
84
90
  def setup_http_auth
85
91
  @client.http_auth_types = @request.auth.type
86
92
  @client.username, @client.password = *@request.auth.credentials
@@ -98,7 +104,9 @@ module HTTPI
98
104
  ssl = @request.auth.ssl
99
105
 
100
106
  if @request.auth.ssl?
101
- unless ssl.verify_mode == :none
107
+ if ssl.verify_mode == :none
108
+ @client.ssl_verify_host = 0
109
+ else
102
110
  @client.cacert = ssl.ca_cert_file if ssl.ca_cert_file
103
111
  @client.certtype = ssl.cert_type.to_s.upcase
104
112
  end
@@ -0,0 +1,76 @@
1
+ require "httpi/adapter/base"
2
+ require "httpi/response"
3
+
4
+ module HTTPI
5
+ module Adapter
6
+
7
+ # = HTTPI::Adapter::HTTP
8
+ #
9
+ # Adapter for the http.rb client.
10
+ # https://github.com/httprb/http.rb
11
+ class HTTP < Base
12
+
13
+ register :http, :deps => %w(http)
14
+
15
+ def initialize(request)
16
+ if request.auth.digest?
17
+ raise NotSupportedError, "http.rb does not support HTTP digest authentication"
18
+ end
19
+ if request.auth.ntlm?
20
+ raise NotSupportedError, "http.rb does not support NTLM digest authentication"
21
+ end
22
+
23
+ @request = request
24
+ @client = create_client
25
+ end
26
+
27
+ attr_reader :client
28
+
29
+ # Executes arbitrary HTTP requests.
30
+ # @see HTTPI.request
31
+ def request(method)
32
+ unless ::HTTP::Request::METHODS.include? method
33
+ raise NotSupportedError, "http.rb does not support custom HTTP methods"
34
+ end
35
+ response = @client.send(method, @request.url, :body => @request.body)
36
+
37
+ Response.new(response.code, response.headers, response.body.to_s)
38
+ end
39
+
40
+ private
41
+
42
+ def create_client
43
+ if @request.ssl?
44
+ context = OpenSSL::SSL::SSLContext.new
45
+
46
+ context.options = OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:options]
47
+
48
+ if @request.auth.ssl.ca_cert_file != nil
49
+ context.ca_file = @request.auth.ssl.ca_cert_file
50
+ else
51
+ context.cert_store = OpenSSL::SSL::SSLContext::DEFAULT_CERT_STORE
52
+ end
53
+
54
+ context.cert = @request.auth.ssl.cert
55
+ context.key = @request.auth.ssl.cert_key
56
+ context.ssl_version = @request.auth.ssl.ssl_version if @request.auth.ssl.ssl_version != nil
57
+ context.verify_mode = @request.auth.ssl.openssl_verify_mode
58
+
59
+ client = ::HTTP::Client.new(:ssl_context => context)
60
+ else
61
+ client = ::HTTP
62
+ end
63
+
64
+ if @request.auth.basic?
65
+ client = client.basic_auth(:user => @request.auth.credentials[0], :pass => @request.auth.credentials[1])
66
+ end
67
+
68
+ if @request.proxy != nil
69
+ client = client.via(@request.proxy.host, @request.proxy.port, @request.proxy.user, @request.proxy.password)
70
+ end
71
+
72
+ client.headers(@request.headers)
73
+ end
74
+ end
75
+ end
76
+ end
@@ -1,3 +1,3 @@
1
1
  module HTTPI
2
- VERSION = '2.4.0'
2
+ VERSION = '2.4.1'
3
3
  end
@@ -2,10 +2,30 @@ require "spec_helper"
2
2
  require "httpi/adapter/curb"
3
3
  require "httpi/request"
4
4
 
5
+ require "integration/support/server"
6
+
5
7
  # curb does not run on jruby
6
8
  unless RUBY_PLATFORM =~ /java/
7
9
  HTTPI::Adapter.load_adapter(:curb)
8
10
 
11
+ describe "NTLM authentication" do
12
+ before :all do
13
+ @server = IntegrationServer.run
14
+ end
15
+
16
+ after :all do
17
+ @server.stop
18
+ end
19
+
20
+ it "supports ntlm authentication" do
21
+ request = HTTPI::Request.new(@server.url + "ntlm-auth")
22
+ adapter = HTTPI::Adapter::Curb.new(request)
23
+
24
+ request.auth.ntlm("tester", "vReqSoafRe5O")
25
+ expect(adapter.request(:get).body).to eq("ntlm-auth")
26
+ end
27
+ end
28
+
9
29
  describe HTTPI::Adapter::Curb do
10
30
 
11
31
  let(:adapter) { HTTPI::Adapter::Curb.new(request) }
@@ -168,15 +188,6 @@ unless RUBY_PLATFORM =~ /java/
168
188
  end
169
189
  end
170
190
 
171
- describe "NTLM authentication" do
172
- it "is not supported" do
173
- request.auth.ntlm("tester", "vReqSoafRe5O")
174
-
175
- expect { adapter.request(:get) }.
176
- to raise_error(HTTPI::NotSupportedError, /does not support NTLM authentication/)
177
- end
178
- end
179
-
180
191
  describe "http_auth_types" do
181
192
  it "is set to :basic for HTTP basic auth" do
182
193
  request.auth.basic "username", "password"
@@ -198,6 +209,13 @@ unless RUBY_PLATFORM =~ /java/
198
209
 
199
210
  adapter.request(:get)
200
211
  end
212
+
213
+ it "is set to :ntlm for HTTP NTLM auth" do
214
+ request.auth.ntlm("tester", "vReqSoafRe5O")
215
+ curb.expects(:http_auth_types=).with(:ntlm)
216
+
217
+ adapter.request(:get)
218
+ end
201
219
  end
202
220
 
203
221
  describe "username and password" do
@@ -266,6 +284,7 @@ unless RUBY_PLATFORM =~ /java/
266
284
 
267
285
  it "send certificate regardless of state of SSL verify mode" do
268
286
  request.auth.ssl.verify_mode = :none
287
+ curb.expects(:ssl_verify_host=).with(0) # avoid "SSL peer certificate" error
269
288
  curb.expects(:cert_key=).with(request.auth.ssl.cert_key_file)
270
289
  curb.expects(:cert=).with(request.auth.ssl.cert_file)
271
290
 
@@ -0,0 +1,101 @@
1
+ require "spec_helper"
2
+ require "integration/support/server"
3
+
4
+ describe HTTPI::Adapter::HTTP do
5
+
6
+ subject(:adapter) { :http }
7
+
8
+ context "http requests" do
9
+ before :all do
10
+ @server = IntegrationServer.run
11
+ end
12
+
13
+ after :all do
14
+ @server.stop
15
+ end
16
+
17
+ it "sends and receives HTTP headers" do
18
+ request = HTTPI::Request.new(@server.url + "x-header")
19
+ request.headers["X-Header"] = "HTTPI"
20
+
21
+ response = HTTPI.get(request, adapter)
22
+ expect(response.body).to include("HTTPI")
23
+ end
24
+
25
+ it "executes GET requests" do
26
+ response = HTTPI.get(@server.url, adapter)
27
+ expect(response.body).to eq("get")
28
+ expect(response.headers["Content-Type"]).to eq("text/plain")
29
+ end
30
+
31
+ it "executes POST requests" do
32
+ response = HTTPI.post(@server.url, "<some>xml</some>", adapter)
33
+ expect(response.body).to eq("post")
34
+ expect(response.headers["Content-Type"]).to eq("text/plain")
35
+ end
36
+
37
+ it "executes HEAD requests" do
38
+ response = HTTPI.head(@server.url, adapter)
39
+ expect(response.code).to eq(200)
40
+ expect(response.headers["Content-Type"]).to eq("text/plain")
41
+ end
42
+
43
+ it "executes PUT requests" do
44
+ response = HTTPI.put(@server.url, "<some>xml</some>", adapter)
45
+ expect(response.body).to eq("put")
46
+ expect(response.headers["Content-Type"]).to eq("text/plain")
47
+ end
48
+
49
+ it "executes DELETE requests" do
50
+ response = HTTPI.delete(@server.url, adapter)
51
+ expect(response.body).to eq("delete")
52
+ expect(response.headers["Content-Type"]).to eq("text/plain")
53
+ end
54
+
55
+ it "supports basic authentication" do
56
+ request = HTTPI::Request.new(@server.url + "basic-auth")
57
+ request.auth.basic("admin", "secret")
58
+
59
+ response = HTTPI.get(request, adapter)
60
+ expect(response.body).to eq("basic-auth")
61
+ end
62
+
63
+ it "does not support digest authentication" do
64
+ request = HTTPI::Request.new(@server.url + "digest-auth")
65
+ request.auth.digest("admin", "secret")
66
+
67
+ expect { HTTPI.get(request, adapter) }.
68
+ to raise_error(HTTPI::NotSupportedError, /does not support HTTP digest authentication/)
69
+ end
70
+
71
+ it "does not support ntlm authentication" do
72
+ request = HTTPI::Request.new(@server.url + "ntlm-auth")
73
+ request.auth.ntlm("tester", "vReqSoafRe5O")
74
+
75
+ expect { HTTPI.get(request, adapter) }.
76
+ to raise_error(HTTPI::NotSupportedError, /does not support NTLM digest authentication/)
77
+ end
78
+ end
79
+
80
+ if RUBY_PLATFORM =~ /java/
81
+ pending "Puma Server complains: SSL not supported on JRuby"
82
+ else
83
+ context "https requests" do
84
+ before :all do
85
+ @server = IntegrationServer.run(:ssl => true)
86
+ end
87
+ after :all do
88
+ @server.stop
89
+ end
90
+
91
+ it "works when set up properly" do
92
+ request = HTTPI::Request.new(@server.url)
93
+ request.auth.ssl.ca_cert_file = IntegrationServer.ssl_ca_file
94
+
95
+ response = HTTPI.get(request, adapter)
96
+ expect(response.body).to eq("get")
97
+ end
98
+ end
99
+ end
100
+
101
+ end
@@ -4,6 +4,7 @@ require "integration/support/server"
4
4
  # find out why httpi doesn't load these automatically. [dh, 2012-12-15]
5
5
  require "excon"
6
6
  require "net/http/persistent"
7
+ require "http"
7
8
 
8
9
  unless RUBY_VERSION < "1.9"
9
10
  require "em-synchrony"
@@ -287,7 +288,8 @@ describe HTTPI do
287
288
  :net_http_persistent => lambda { Net::HTTP::Persistent },
288
289
  :em_http => lambda { EventMachine::HttpConnection },
289
290
  :rack => lambda { Rack::MockRequest },
290
- :excon => lambda { Excon::Connection }
291
+ :excon => lambda { Excon::Connection },
292
+ :http => lambda { ::HTTP::Client }
291
293
  }
292
294
 
293
295
  context "using #{adapter}" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: httpi
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.0
4
+ version: 2.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Harrington
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-04-01 00:00:00.000000000 Z
12
+ date: 2015-06-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
@@ -116,6 +116,7 @@ files:
116
116
  - lib/httpi/adapter/curb.rb
117
117
  - lib/httpi/adapter/em_http.rb
118
118
  - lib/httpi/adapter/excon.rb
119
+ - lib/httpi/adapter/http.rb
119
120
  - lib/httpi/adapter/httpclient.rb
120
121
  - lib/httpi/adapter/net_http.rb
121
122
  - lib/httpi/adapter/net_http_persistent.rb
@@ -141,6 +142,7 @@ files:
141
142
  - spec/httpi/adapter/curb_spec.rb
142
143
  - spec/httpi/adapter/em_http_spec.rb
143
144
  - spec/httpi/adapter/excon_spec.rb
145
+ - spec/httpi/adapter/http_spec.rb
144
146
  - spec/httpi/adapter/httpclient_spec.rb
145
147
  - spec/httpi/adapter/net_http_persistent_spec.rb
146
148
  - spec/httpi/adapter/net_http_spec.rb
@@ -188,7 +190,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
188
190
  version: '0'
189
191
  requirements: []
190
192
  rubyforge_project: httpi
191
- rubygems_version: 2.2.2
193
+ rubygems_version: 2.4.8
192
194
  signing_key:
193
195
  specification_version: 4
194
196
  summary: Common interface for Ruby's HTTP libraries