httpi 2.4.0 → 2.4.1

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