aboutsummaryrefslogtreecommitdiffstats
path: root/AndroidAsync/src/com/koushikdutta/async/http/Headers.java
blob: b289a4b31ec4b5c7492df19630f689f5766bdf23 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
package com.koushikdutta.async.http;


import android.text.TextUtils;

import com.koushikdutta.async.http.server.AsyncHttpServer;
import com.koushikdutta.async.util.TaggedList;

import org.apache.http.Header;
import org.apache.http.message.BasicHeader;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
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());
    }

    public String get(String header) {
        return map.getString(header.toLowerCase());
    }

    public Headers set(String header, String value) {
        if (value.contains("\n") || value.contains("\r"))
            throw new IllegalArgumentException("value must not contain a new line or line feed");
        String lc = header.toLowerCase();
        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();
        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());
    }

    public String remove(String header) {
        List<String> r = removeAll(header.toLowerCase());
        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 Header[] toHeaderArray() {
        ArrayList<Header> ret = new ArrayList<Header>();
        for (String key: map.keySet()) {
            TaggedList<String> list = (TaggedList<String>)map.get(key);
            for (String v: map.get(key)) {
                ret.add(new BasicHeader((String)list.tag(), v));
            }
        }
        return ret.toArray(new Header[ret.size()]);
    }

    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;
    }
}