def decode_directives(directives, variant)
raise HTTPAuth::UnwellformedHeader.new("Can't decode directives which are nil") if directives.nil?
decode = {:domain => :space_quoted_string_to_list, :algorithm => false, :stale => :str_to_bool, :nc => :hex_to_int}
if [:credentials, :auth].include? variant
decode.merge! :qop => false
elsif variant == :challenge
decode.merge! :qop => :comma_quoted_string_to_list
else
raise ArgumentError.new("#{variant} is not a valid value for `variant' use :auth, :credentials or :challenge")
end
start = 0
unless variant == :auth
start = 6
scheme = directives[0..6].strip
raise HTTPAuth::UnwellformedHeader.new("Scheme should be Digest, server responded with `#{directives}'") unless scheme == 'Digest'
end
directives[start..-1].split(',').inject({}) do |h,part|
parts = part.split('=')
name = parts[0].strip.intern
value = parts[1..-1].join('=').strip
if variant != :challenge and [:qop, :algorithm].include?(name) and value =~ /^\"[^\"]+\"$/
value = Conversions.unquote_string(value)
end
if decode[name]
h[name] = Conversions.send decode[name], value
elsif decode[name].nil?
h[name] = Conversions.unquote_string value
else
h[name] = value
end
h
end
end