Konrads
Konrads

Reputation: 2274

Ruby http client with "native" ntlm proxy support

I am looking for a ruby HTTP client gem that supports NTLM proxy authentication "natively" - not through cntlm or similar local proxies.

Any hints appreciated.

Upvotes: 3

Views: 1222

Answers (3)

i0rek
i0rek

Reputation: 354

You can do ntlm with Typhoeus and Ethon - depending how many features you need. Typhoeus has more than Ethon, but Ethon is more powerful as it is more low level.

require 'ethon'
easy = Ethon::Easy.new(
  url: "http://www.google.com/", 
  proxy: "1.2.3.4:80", 
  proxyuserpwd: "user:password", 
  proxyauth: "ntlm"
)
easy.perform

Typhoeus accepts the same options:

require 'typhoeus'
request = Typhoeus::Request.new(
  "http://www.google.com/", 
  proxy: "1.2.3.4:80", 
  proxyuserpwd: "user:password", 
  proxyauth: "ntlm"
)
request.run

I wrote both code examples without testing them b/c I lack a proxy and with the latest Typhoeus/Ethon versions (which you don't have already according to your example).

Upvotes: 2

Andy Triggs
Andy Triggs

Reputation: 1305

Typhoeus seems to have been repurposed. The libcurl wrapper is now Ethon (https://github.com/typhoeus/ethon).

I've successfully authenticated with an NTLM proxy using Curb (https://github.com/taf2/curb), another libcurl wrapper:

require 'spec_helper'
require 'curl'

describe Curl do
  it 'should connect via an ISA proxy' do
    c = Curl::Easy.new('http://example.com/') do |curl|  
      curl.proxy_url = 'http://username:password@localhost:8080'
      curl.proxy_auth_types = Curl::CURLAUTH_NTLM
    end

    c.perform

    headers = c.header_str.split("\r\n")
    #puts headers.inspect

    headers.should include 'X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.19'
  end

end

Change your settings and assertion as required.

Upvotes: 2

Konrads
Konrads

Reputation: 2274

A little digging unearthed Typhoeus:

require 'typhoeus'
e=Typhoeus::Easy.new
e.url="http://www.google.com/"
e.proxy = {:server => "1.2.3.4:80"}
e.proxy_auth={:username => "user", :password => 'password'}
e.perform

Upvotes: 2

Related Questions