def response_authenticate(response, page, uri, request, headers, params,
referer)
raise Mechanize::UnauthorizedError, page unless @user || @password
www_authenticate = response['www-authenticate']
raise Mechanize::UnauthorizedError, page unless www_authenticate
challenges = @authenticate_parser.parse www_authenticate
if challenge = challenges.find { |c| c.scheme =~ /^Digest$/i } then
realm = challenge.realm uri
auth_scheme = if response['server'] =~ /Microsoft-IIS/ then
:iis_digest
else
:digest
end
existing_realms = @authenticate_methods[realm.uri][auth_scheme]
raise Mechanize::UnauthorizedError, page if
existing_realms.include? realm
existing_realms << realm
@digest_challenges[realm] = challenge
elsif challenge = challenges.find { |c| c.scheme == 'NTLM' } then
existing_realms = @authenticate_methods[uri + '/'][:ntlm]
raise Mechanize::UnauthorizedError, page if
existing_realms.include?(realm) and not challenge.params
existing_realms << realm
if challenge.params then
type_2 = Net::NTLM::Message.decode64 challenge.params
type_3 = type_2.response({ :user => @user, :password => @password, :domain => @domain },
{ :ntlmv2 => true }).encode64
headers['Authorization'] = "NTLM #{type_3}"
else
type_1 = Net::NTLM::Message::Type1.new.encode64
headers['Authorization'] = "NTLM #{type_1}"
end
elsif challenge = challenges.find { |c| c.scheme == 'Basic' } then
realm = challenge.realm uri
existing_realms = @authenticate_methods[realm.uri][:basic]
raise Mechanize::UnauthorizedError, page if
existing_realms.include? realm
existing_realms << realm
else
raise Mechanize::UnauthorizedError, page
end
fetch uri, request.method.downcase.to_sym, headers, params, referer
end