require "spec_helper"
require "integration/support/server"
describe HTTPI::Adapter::NetHTTP do
subject(:adapter) { :net_http }
context "http requests" do
before :all do
@server = IntegrationServer.run
end
after :all do
@server.stop
end
context 'when socks is specified' do
let(:socks_client) { mock('socks_client') }
let(:request){HTTPI::Request.new(@server.url)}
it 'uses Net::HTTP.SOCKSProxy as client' do
socks_client.expects(:new).with(URI(@server.url).host, URI(@server.url).port).returns(:socks_client_instance)
Net::HTTP.expects(:SOCKSProxy).with('localhost', 8080).returns socks_client
request.proxy = 'socks://localhost:8080'
adapter = HTTPI::Adapter::NetHTTP.new(request)
expect(adapter.client).to eq(:socks_client_instance)
end
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, "xml", 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, "xml", 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
context "supports custom methods supported by Net::HTTP" do
let(:request) do
HTTPI::Request.new(@server.url).tap do|r|
r.body = request_body if request_body
end
end
let(:request_body) { nil }
let(:response) { HTTPI.request(http_method, request, adapter) }
shared_examples_for 'any supported custom method' do
specify { response.body.should eq http_method.to_s }
specify { response.headers["Content-Type"].should eq('text/plain') }
end
context 'PATCH' do
let(:http_method) { :patch }
let(:request_body) { "xml" }
it_behaves_like 'any supported custom method'
end
context 'UNSUPPORTED method' do
let(:http_method) { :unsupported }
specify { expect { response }.to raise_error HTTPI::NotSupportedError }
end
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 "supports ntlm authentication" do
request = HTTPI::Request.new(@server.url + "ntlm-auth")
request.auth.ntlm("tester", "vReqSoafRe5O")
response = HTTPI.get(request, adapter)
expect(response.body).to eq("ntlm-auth")
end
it 'does not support ntlm authentication when Net::NTLM is not available' do
Net.expects(:const_defined?).with(:NTLM).returns false
request = HTTPI::Request.new(@server.url + 'ntlm-auth')
request.auth.ntlm("testing", "failures")
expect { HTTPI.get(request, adapter) }.
to raise_error(HTTPI::NotSupportedError, /Net::NTLM is not available/)
end
it 'does not require ntlm when ntlm authenication is not requested' do
HTTPI::Adapter::NetHTTP.any_instance.stubs(:check_net_ntlm_version!).raises(RuntimeError)
request = HTTPI::Request.new(@server.url)
expect(request.auth.ntlm?).to be false
# make sure a request doesn't call ntlm check if we don't ask for it.
expect { HTTPI.get(request, adapter) }.not_to raise_error
HTTPI::Adapter::NetHTTP.any_instance.unstub(:check_net_ntlm_version!)
end
it 'does check ntlm when ntlm authentication is requested' do
request = HTTPI::Request.new(@server.url + "ntlm-auth")
request.auth.ntlm("tester", "vReqSoafRe5O")
expect { HTTPI.get(request, adapter) }.not_to raise_error
# the check should also verify that the version of ntlm is supported and still fail if it isn't
HTTPI::Adapter::NetHTTP.any_instance.stubs(:ntlm_version).returns("0.1.1")
request = HTTPI::Request.new(@server.url + "ntlm-auth")
request.auth.ntlm("tester", "vReqSoafRe5O")
expect { HTTPI.get(request, adapter) }.to raise_error(ArgumentError, /Invalid version/)
HTTPI::Adapter::NetHTTP.any_instance.unstub(:ntlm_version)
end
it "does not crash when authenticate header is missing (on second request)" do
request = HTTPI::Request.new(@server.url + 'ntlm-auth')
request.auth.ntlm("tester", "vReqSoafRe5O")
expect { HTTPI.get(request, adapter) }.
to_not raise_error
expect { HTTPI.get(request, adapter) }.
to_not raise_error
end
end
# it does not support digest auth
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 does not raise when no certificate was set up
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