Class: Net::HTTP

Inherits:
Object
  • Object
show all
Defined in:
lib/net/ntlm.rb

Instance Method Summary collapse

Instance Method Details

#request(req, body = nil, &block) ⇒ Object



819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
# File 'lib/net/ntlm.rb', line 819

def request req, body=nil, &block
  resp = data = auth_data = nil
  old_request req, body do |resp|
    unless Net::HTTPUnauthorized === resp and auth_data = req.auth_data and
      auth_data[0] == :ntlm and resp['www-authenticate'] == 'NTLM' ||
      data = resp['www-authenticate'][/^NTLM (.*)/, 1]
      data = false
      yield resp if block_given?
    end
  end
  return resp if data == false
  # not really sure if i'm supposed to just rewrite the request like this?

  # and the body? what about redirects? the resp.content is just the text error message

  # what about post data?

  req.reuse
  unless data
    # first stage handshake. respond to challenge

#       puts "* authenticating (0) ..."

    # this time wait is true.

    req.ntlm_auth(*auth_data[1..2])
    request req, body, &block
  else
#       puts "* authenticating (1) ..."

    challenge = Net::NTLM::Message.decode64 data
    # challenge.target_name could be provided back as a prompt.

    # maybe if password is unspecified, a callback can be used to provide

    # a user prompt.

    resp = challenge.response({:user => auth_data[1], :password => auth_data[2]}, {:ntlmv2 => true})
    req['Authorization'] = 'NTLM ' + resp.encode64
    old_request(req, body) { |resp| yield resp if block_given? }
    resp
  end
end