package com.netflix.client.http; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.AbstractMap.SimpleEntry; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; public class CaseInsensitiveMultiMap implements HttpHeaders { Multimap<String, Entry<String, String>> map = ArrayListMultimap.create(); @Override public String getFirstValue(String headerName) { Collection<Entry<String, String>> entries = map.get(headerName.toLowerCase()); if (entries == null || entries.isEmpty()) { return null; } return entries.iterator().next().getValue(); } @Override public List<String> getAllValues(String headerName) { Collection<Entry<String, String>> entries = map.get(headerName.toLowerCase()); List<String> values = Lists.newArrayList(); if (entries != null) { for (Entry<String, String> entry: entries) { values.add(entry.getValue()); } } return values; } @Override public List<Entry<String, String>> getAllHeaders() { Collection<Entry<String, String>> all = map.values(); return new ArrayList<Entry<String, String>>(all); } @Override public boolean containsHeader(String name) { return map.containsKey(name.toLowerCase()); } public void addHeader(String name, String value) { if (getAllValues(name).contains(value)) { return; } SimpleEntry<String, String> entry = new SimpleEntry<String, String>(name, value); map.put(name.toLowerCase(), entry); } Map<String, Collection<String>> asMap() { Multimap<String, String> result = ArrayListMultimap.create(); Collection<Entry<String, String>> all = map.values(); for (Entry<String, String> entry: all) { result.put(entry.getKey(), entry.getValue()); } return result.asMap(); } }