Skip to content

Commit

Permalink
Merge pull request #145 from Connorhd/add-http-rb-support
Browse files Browse the repository at this point in the history
Add http.rb support.
  • Loading branch information
tjarratt committed Apr 30, 2015
2 parents bf28a13 + ad173e2 commit 3f0197f
Show file tree
Hide file tree
Showing 6 changed files with 178 additions and 2 deletions.
1 change: 1 addition & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ gem 'em-http-request', :require => false, :platforms => [:ruby,
gem 'em-synchrony', :require => false, :platforms => [:ruby, :jruby]
gem 'excon', '~> 0.21.0', :require => false, :platforms => [:ruby, :jruby]
gem 'net-http-persistent', '~> 2.8', :require => false
gem 'http', :require => false

# coverage
gem 'simplecov', :require => false
Expand Down
1 change: 1 addition & 0 deletions lib/httpi.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
require "httpi/adapter/net_http_persistent"
require "httpi/adapter/em_http"
require "httpi/adapter/rack"
require "httpi/adapter/http"

# = HTTPI
#
Expand Down
2 changes: 1 addition & 1 deletion lib/httpi/adapter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ module Adapter
ADAPTERS = {}
ADAPTER_CLASS_MAP = {}

LOAD_ORDER = [:httpclient, :curb, :em_http, :excon, :net_http, :net_http_persistent]
LOAD_ORDER = [:httpclient, :curb, :em_http, :excon, :http, :net_http, :net_http_persistent]

class << self

Expand Down
71 changes: 71 additions & 0 deletions lib/httpi/adapter/http.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
require "httpi/adapter/base"
require "httpi/response"

module HTTPI
module Adapter

# = HTTPI::Adapter::HTTP
#
# Adapter for the http.rb client.
# https://github.com/httprb/http.rb
class HTTP < Base

register :http, :deps => %w(http)

def initialize(request)
if request.auth.digest?
raise NotSupportedError, "http.rb does not support HTTP digest authentication"
end
if request.auth.ntlm?
raise NotSupportedError, "http.rb does not support NTLM digest authentication"
end

@request = request
@client = create_client
end

attr_reader :client

# Executes arbitrary HTTP requests.
# @see HTTPI.request
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.new(response.code, response.headers, response.body.to_s)
end

private

def create_client
if @request.ssl?
context = OpenSSL::SSL::SSLContext.new

context.ca_file = @request.auth.ssl.ca_cert_file
context.cert = @request.auth.ssl.cert
context.key = @request.auth.ssl.cert_key
context.ssl_version = @request.auth.ssl.ssl_version if @request.auth.ssl.ssl_version != nil
context.verify_mode = @request.auth.ssl.openssl_verify_mode

context

client = ::HTTP::Client.new(:ssl_context => context)
else
client = ::HTTP
end

if @request.auth.basic?
client = client.basic_auth(:user => @request.auth.credentials[0], :pass => @request.auth.credentials[1])
end

if @request.proxy != nil
client = client.via(@request.proxy.host, @request.proxy.port, @request.proxy.user, @request.proxy.password)
end

client.headers(@request.headers)
end
end
end
end
101 changes: 101 additions & 0 deletions spec/httpi/adapter/http_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
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 "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 "does not support digest authentication" do
request = HTTPI::Request.new(@server.url + "digest-auth")
request.auth.digest("admin", "secret")

expect { HTTPI.get(request, adapter) }.
to raise_error(HTTPI::NotSupportedError, /does not support HTTP digest authentication/)
end

it "does not support ntlm authentication" do
request = HTTPI::Request.new(@server.url + "ntlm-auth")
request.auth.ntlm("tester", "vReqSoafRe5O")

expect { HTTPI.get(request, adapter) }.
to raise_error(HTTPI::NotSupportedError, /does not support NTLM digest authentication/)
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 "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
4 changes: 3 additions & 1 deletion spec/httpi/httpi_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
# find out why httpi doesn't load these automatically. [dh, 2012-12-15]
require "excon"
require "net/http/persistent"
require "http"

unless RUBY_VERSION < "1.9"
require "em-synchrony"
Expand Down Expand Up @@ -287,7 +288,8 @@
:net_http_persistent => lambda { Net::HTTP::Persistent },
:em_http => lambda { EventMachine::HttpConnection },
:rack => lambda { Rack::MockRequest },
:excon => lambda { Excon::Connection }
:excon => lambda { Excon::Connection },
:http => lambda { ::HTTP::Client }
}

context "using #{adapter}" do
Expand Down

0 comments on commit 3f0197f

Please sign in to comment.