Class: Net::HTTP

Inherits:
Object
  • Object
show all
Defined in:
lib/net/ntlm_http.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_http.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