def build_auth_digest(method, uri, params = nil)
params = @opts.merge(@digest_params) if !params
nonce_count = next_nonce
user = unescape params[:username]
password = unescape params[:password]
splitted_algorithm = params[:algorithm].split('-')
sess = "-sess" if splitted_algorithm[1]
raw_algorithm = splitted_algorithm[0]
if %w(MD5 SHA1 SHA2 SHA256 SHA384 SHA512 RMD160).include? raw_algorithm
algorithm = eval("Digest::#{raw_algorithm}")
else
raise "Unknown algorithm: #{raw_algorithm}"
end
qop = params[:qop]
cnonce = make_cnonce if qop or sess
a1 = if sess
[
algorithm.hexdigest("#{params[:username]}:#{params[:realm]}:#{params[:password]}"),
params[:nonce],
cnonce,
].join ':'
else
"#{params[:username]}:#{params[:realm]}:#{params[:password]}"
end
ha1 = algorithm.hexdigest a1
ha2 = algorithm.hexdigest "#{method}:#{uri}"
request_digest = [ha1, params[:nonce]]
request_digest.push(('%08x' % @nonce_count), cnonce, qop) if qop
request_digest << ha2
request_digest = request_digest.join ':'
header = [
"Digest username=\"#{params[:username]}\"",
"realm=\"#{params[:realm]}\"",
"algorithm=#{raw_algorithm}#{sess}",
"uri=\"#{uri}\"",
"nonce=\"#{params[:nonce]}\"",
"response=\"#{algorithm.hexdigest(request_digest)[0, 32]}\"",
]
if params[:qop]
header << "qop=#{qop}"
header << "nc=#{'%08x' % @nonce_count}"
header << "cnonce=\"#{cnonce}\""
end
header << "opaque=\"#{params[:opaque]}\"" if params.key? :opaque
header.join(', ')
end