package com.koushikdutta.async.http;
import android.text.TextUtils;
import com.koushikdutta.async.util.TaggedList;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.Map;
/**
* Created by koush on 7/21/14.
*/
public class Headers {
public Headers() {
}
public Headers(Map<String, List<String>> mm) {
map.putAll(mm);
}
final Multimap map = new Multimap() {
@Override
protected List<String> newList() {
return new TaggedList<String>();
}
};
public Multimap getMultiMap() {
return map;
}
public List<String> getAll(String header) {
return map.get(header.toLowerCase(Locale.US));
}
public String get(String header) {
return map.getString(header.toLowerCase(Locale.US));
}
public Headers set(String header, String value) {
if (value != null && (value.contains("\n") || value.contains("\r")))
throw new IllegalArgumentException("value must not contain a new line or line feed");
String lc = header.toLowerCase(Locale.US);
map.put(lc, value);
TaggedList<String> list = (TaggedList<String>)map.get(lc);
list.tagNull(header);
return this;
}
public Headers add(String header, String value) {
String lc = header.toLowerCase(Locale.US);
map.add(lc, value);
TaggedList<String> list = (TaggedList<String>)map.get(lc);
list.tagNull(header);
return this;
}
public Headers addLine(String line) {
if (line != null) {
line = line.trim();
String[] parts = line.split(":", 2);
if (parts.length == 2)
add(parts[0].trim(), parts[1].trim());
else
add(parts[0].trim(), "");
}
return this;
}
public Headers addAll(String header, List<String> values) {
for (String v: values) {
add(header, v);
}
return this;
}
public Headers addAll(Map<String, List<String>> m) {
for (String key: m.keySet()) {
for (String value: m.get(key)) {
add(key, value);
}
}
return this;
}
public Headers addAll(Headers headers) {
// safe to addall since this is another Headers object
map.putAll(headers.map);
return this;
}
public List<String> removeAll(String header) {
return map.remove(header.toLowerCase(Locale.US));
}
public String remove(String header) {
List<String> r = removeAll(header.toLowerCase(Locale.US));
if (r == null || r.size() == 0)
return null;
return r.get(0);
}
public Headers removeAll(Collection<String> headers) {
for (String header: headers) {
remove(header);
}
return this;
}
public StringBuilder toStringBuilder() {
StringBuilder result = new StringBuilder(256);
for (String key: map.keySet()) {
TaggedList<String> list = (TaggedList<String>)map.get(key);
for (String v: list) {
result.append((String)list.tag())
.append(": ")
.append(v)
.append("\r\n");
}
}
result.append("\r\n");
return result;
}
@Override
public String toString() {
return toStringBuilder().toString();
}
public String toPrefixString(String prefix) {
return
toStringBuilder()
.insert(0, prefix + "\r\n")
.toString();
}
public static Headers parse(String payload) {
String[] lines = payload.split("\n");
Headers headers = new Headers();
for (String line: lines) {
line = line.trim();
if (TextUtils.isEmpty(line))
continue;
headers.addLine(line);
}
return headers;
}
}