Skip to content

Commit

Permalink
Merge pull request #181 from Bonias/fix-http-and-excon-adapter
Browse files Browse the repository at this point in the history
Fix excon and http adapters
  • Loading branch information
rogerleite committed Jan 12, 2017
2 parents 4aed534 + fab302a commit e671b7a
Show file tree
Hide file tree
Showing 4 changed files with 228 additions and 3 deletions.
6 changes: 5 additions & 1 deletion lib/httpi/adapter/excon.rb
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,11 @@ def client_opts
end

def respond_with(response)
Response.new response.status, response.headers, response.body
headers = response.headers.dup
if (cookies = response.data[:cookies]) && !cookies.empty?
headers["Set-Cookie"] = cookies
end
Response.new response.status, headers, response.body
end

end
Expand Down
8 changes: 6 additions & 2 deletions lib/httpi/adapter/http.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,13 @@ def request(method)
unless ::HTTP::Request::METHODS.include? method
raise NotSupportedError, "http.rb does not support custom HTTP methods"
end
response = @client.send(method, @request.url, :body => @request.body)
response = begin
@client.send(method, @request.url, :body => @request.body)
rescue OpenSSL::SSL::SSLError
raise SSLError
end

Response.new(response.code, response.headers, response.body.to_s)
Response.new(response.code, response.headers.to_h, response.body.to_s)
end

private
Expand Down
108 changes: 108 additions & 0 deletions spec/integration/excon_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
require "spec_helper"
require "integration/support/server"

describe HTTPI::Adapter::HTTPClient do

subject(:adapter) { :excon }

context "http requests" do
before :all do
@server = IntegrationServer.run
end

after :all do
@server.stop
end

it "sends and receives HTTP headers" do
request = HTTPI::Request.new(@server.url + "x-header")
request.headers["X-Header"] = "HTTPI"

response = HTTPI.get(request, adapter)
expect(response.body).to include("HTTPI")
end

it "it supports headers with multiple values" do
request = HTTPI::Request.new(@server.url + "cookies")

response = HTTPI.get(request, adapter)
cookies = ["cookie1=chip1; path=/", "cookie2=chip2; path=/"]
expect(response.headers["Set-Cookie"]).to eq(cookies)
end

it "executes GET requests" do
response = HTTPI.get(@server.url, adapter)
expect(response.body).to eq("get")
expect(response.headers["Content-Type"]).to eq("text/plain")
end

it "executes POST requests" do
response = HTTPI.post(@server.url, "<some>xml</some>", adapter)
expect(response.body).to eq("post")
expect(response.headers["Content-Type"]).to eq("text/plain")
end

it "executes HEAD requests" do
response = HTTPI.head(@server.url, adapter)
expect(response.code).to eq(200)
expect(response.headers["Content-Type"]).to eq("text/plain")
end

it "executes PUT requests" do
response = HTTPI.put(@server.url, "<some>xml</some>", adapter)
expect(response.body).to eq("put")
expect(response.headers["Content-Type"]).to eq("text/plain")
end

it "executes DELETE requests" do
response = HTTPI.delete(@server.url, adapter)
expect(response.body).to eq("delete")
expect(response.headers["Content-Type"]).to eq("text/plain")
end

it "supports basic authentication" do
request = HTTPI::Request.new(@server.url + "basic-auth")
request.auth.basic("admin", "secret")

response = HTTPI.get(request, adapter)
expect(response.body).to eq("basic-auth")
end

it "supports chunked response" do
request = HTTPI::Request.new(@server.url)
res = ""
request.on_body do |body|
res += body
end
response = HTTPI.post(request, adapter)
expect(res).to eq("post")
expect(response.body).to eq("")
end
end

if RUBY_PLATFORM =~ /java/
pending "Puma Server complains: SSL not supported on JRuby"
else
context "https requests" do
before :all do
@server = IntegrationServer.run(:ssl => true)
end
after :all do
@server.stop
end

it "raises when no certificate was set up" do
expect { HTTPI.post(@server.url, "", adapter) }.to raise_error(HTTPI::SSLError)
end

it "works when set up properly" do
request = HTTPI::Request.new(@server.url)
request.auth.ssl.ca_cert_file = IntegrationServer.ssl_ca_file

response = HTTPI.get(request, adapter)
expect(response.body).to eq("get")
end
end
end

end
109 changes: 109 additions & 0 deletions spec/integration/http_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
require "spec_helper"
require "integration/support/server"

describe HTTPI::Adapter::HTTP do

subject(:adapter) { :http }

context "http requests" do
before :all do
@server = IntegrationServer.run
end

after :all do
@server.stop
end

it "sends and receives HTTP headers" do
request = HTTPI::Request.new(@server.url + "x-header")
request.headers["X-Header"] = "HTTPI"

response = HTTPI.get(request, adapter)
expect(response.body).to include("HTTPI")
end

it "it supports headers with multiple values" do
request = HTTPI::Request.new(@server.url + "cookies")

response = HTTPI.get(request, adapter)
cookies = ["cookie1=chip1; path=/", "cookie2=chip2; path=/"]
expect(response.headers["Set-Cookie"]).to eq(cookies)
end

it "executes GET requests" do
response = HTTPI.get(@server.url, adapter)
expect(response.body).to eq("get")
expect(response.headers["Content-Type"]).to eq("text/plain")
end

it "executes POST requests" do
response = HTTPI.post(@server.url, "<some>xml</some>", adapter)
expect(response.body).to eq("post")
expect(response.headers["Content-Type"]).to eq("text/plain")
end

it "executes HEAD requests" do
response = HTTPI.head(@server.url, adapter)
expect(response.code).to eq(200)
expect(response.headers["Content-Type"]).to eq("text/plain")
end

it "executes PUT requests" do
response = HTTPI.put(@server.url, "<some>xml</some>", adapter)
expect(response.body).to eq("put")
expect(response.headers["Content-Type"]).to eq("text/plain")
end

it "executes DELETE requests" do
response = HTTPI.delete(@server.url, adapter)
expect(response.body).to eq("delete")
expect(response.headers["Content-Type"]).to eq("text/plain")
end

it "supports basic authentication" do
request = HTTPI::Request.new(@server.url + "basic-auth")
request.auth.basic("admin", "secret")

response = HTTPI.get(request, adapter)
expect(response.body).to eq("basic-auth")
end

it "supports chunked response" do
skip("Needs investigation")
request = HTTPI::Request.new(@server.url)
res = ""
request.on_body do |body|
res += body
end
response = HTTPI.post(request, adapter)
expect(res).to eq("post")
expect(response.body).to eq("")
end
end

if RUBY_PLATFORM =~ /java/
pending "Puma Server complains: SSL not supported on JRuby"
else
context "https requests" do
before :all do
@server = IntegrationServer.run(:ssl => true)
end
after :all do
@server.stop
end

it "raises when no certificate was set up" do
expect { HTTPI.post(@server.url, "", adapter) }.to raise_error(HTTPI::SSLError)
end

it "works when set up properly" do
request = HTTPI::Request.new(@server.url)
request.auth.ssl.ca_cert_file = IntegrationServer.ssl_ca_file

response = HTTPI.get(request, adapter)
expect(response.body).to eq("get")
end
end
end

end

0 comments on commit e671b7a

Please sign in to comment.