package com.koushikdutta.async.http; import android.net.Uri; import com.koushikdutta.async.http.libcore.RawHeaders; import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; import java.util.ArrayList; import java.util.Hashtable; import java.util.Iterator; import java.util.List; /** * Created by koush on 5/27/13. */ public class Multimap extends Hashtable<String, List<String>> implements Iterable<NameValuePair> { public Multimap() { } public String getString(String name) { List<String> ret = get(name); if (ret == null || ret.size() == 0) return null; return ret.get(0); } public void add(String name, String value) { List<String> ret = get(name); if (ret == null) { ret = new ArrayList<String>(); put(name, ret); } ret.add(value); } public void put(String name, String value) { ArrayList<String> ret = new ArrayList<String>(); ret.add(value); put(name, ret); } public Multimap(RawHeaders headers) { headers.toMultimap().putAll(this); } public Multimap(List<NameValuePair> pairs) { for (NameValuePair pair: pairs) add(pair.getName(), pair.getValue()); } public static Multimap parseHeader(String header) { Multimap map = new Multimap(); String[] parts = header.split(";"); for (String part: parts) { String[] pair = part.split("=", 2); String key = pair[0].trim(); String v = null; if (pair.length > 1) v = pair[1]; if (v != null && v.endsWith("\"") && v.startsWith("\"")) v = v.substring(1, v.length() - 1); map.add(key, v); } return map; } public static Multimap parseHeader(RawHeaders headers, String header) { return parseHeader(headers.get(header)); } public static Multimap parseQuery(String query) { Multimap map = new Multimap(); String[] pairs = query.split("&"); for (String p : pairs) { String[] pair = p.split("=", 2); if (pair.length == 0) continue; String name = Uri.decode(pair[0]); String value = null; if (pair.length == 2) value = Uri.decode(pair[1]); map.add(name, value); } return map; } @Override public Iterator<NameValuePair> iterator() { ArrayList<NameValuePair> ret = new ArrayList<NameValuePair>(); for (String name: keySet()) { List<String> values = get(name); for (String value: values) { ret.add(new BasicNameValuePair(name, value)); } } return ret.iterator(); } }