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 package org.apache.http.message;
29
30 import java.util.ArrayList;
31 import java.util.BitSet;
32 import java.util.List;
33
34 import org.apache.http.HeaderElement;
35 import org.apache.http.NameValuePair;
36 import org.apache.http.ParseException;
37 import org.apache.http.annotation.ThreadingBehavior;
38 import org.apache.http.annotation.Contract;
39 import org.apache.http.util.Args;
40 import org.apache.http.util.CharArrayBuffer;
41
42
43
44
45
46
47
48
49 @Contract(threading = ThreadingBehavior.IMMUTABLE)
50 public class BasicHeaderValueParser implements HeaderValueParser {
51
52
53
54
55
56
57
58
59
60 @Deprecated
61 public final static BasicHeaderValueParserr.html#BasicHeaderValueParser">BasicHeaderValueParser DEFAULT = new BasicHeaderValueParser();
62
63 public final static BasicHeaderValueParser.html#BasicHeaderValueParser">BasicHeaderValueParser INSTANCE = new BasicHeaderValueParser();
64
65 private final static char PARAM_DELIMITER = ';';
66 private final static char ELEM_DELIMITER = ',';
67
68
69
70 private static final BitSet TOKEN_DELIMS = TokenParser.INIT_BITSET('=', PARAM_DELIMITER, ELEM_DELIMITER);
71 private static final BitSet VALUE_DELIMS = TokenParser.INIT_BITSET(PARAM_DELIMITER, ELEM_DELIMITER);
72
73 private final TokenParser tokenParser;
74
75 public BasicHeaderValueParser() {
76 this.tokenParser = TokenParser.INSTANCE;
77 }
78
79
80
81
82
83
84
85
86
87
88 public static
89 HeaderElement[] parseElements(final String value,
90 final HeaderValueParser parser) throws ParseException {
91 Args.notNull(value, "Value");
92
93 final CharArrayBufferhtml#CharArrayBuffer">CharArrayBuffer buffer = new CharArrayBuffer(value.length());
94 buffer.append(value);
95 final ParserCursoror.html#ParserCursor">ParserCursor cursor = new ParserCursor(0, value.length());
96 return (parser != null ? parser : BasicHeaderValueParser.INSTANCE)
97 .parseElements(buffer, cursor);
98 }
99
100
101
102 @Override
103 public HeaderElement[] parseElements(final CharArrayBuffer buffer,
104 final ParserCursor cursor) {
105 Args.notNull(buffer, "Char array buffer");
106 Args.notNull(cursor, "Parser cursor");
107 final List<HeaderElement> elements = new ArrayList<HeaderElement>();
108 while (!cursor.atEnd()) {
109 final HeaderElement element = parseHeaderElement(buffer, cursor);
110 if (!(element.getName().isEmpty() && element.getValue() == null)) {
111 elements.add(element);
112 }
113 }
114 return elements.toArray(new HeaderElement[elements.size()]);
115 }
116
117
118
119
120
121
122
123
124
125
126 public static
127 HeaderElement parseHeaderElement(final String value,
128 final HeaderValueParser parser) throws ParseException {
129 Args.notNull(value, "Value");
130
131 final CharArrayBufferhtml#CharArrayBuffer">CharArrayBuffer buffer = new CharArrayBuffer(value.length());
132 buffer.append(value);
133 final ParserCursoror.html#ParserCursor">ParserCursor cursor = new ParserCursor(0, value.length());
134 return (parser != null ? parser : BasicHeaderValueParser.INSTANCE)
135 .parseHeaderElement(buffer, cursor);
136 }
137
138
139
140 @Override
141 public HeaderElement parseHeaderElement(final CharArrayBuffer buffer,
142 final ParserCursor cursor) {
143 Args.notNull(buffer, "Char array buffer");
144 Args.notNull(cursor, "Parser cursor");
145 final NameValuePair nvp = parseNameValuePair(buffer, cursor);
146 NameValuePair[] params = null;
147 if (!cursor.atEnd()) {
148 final char ch = buffer.charAt(cursor.getPos() - 1);
149 if (ch != ELEM_DELIMITER) {
150 params = parseParameters(buffer, cursor);
151 }
152 }
153 return createHeaderElement(nvp.getName(), nvp.getValue(), params);
154 }
155
156
157
158
159
160
161
162
163 protected HeaderElement createHeaderElement(
164 final String name,
165 final String value,
166 final NameValuePair[] params) {
167 return new BasicHeaderElement(name, value, params);
168 }
169
170
171
172
173
174
175
176
177
178
179 public static
180 NameValuePair[] parseParameters(final String value,
181 final HeaderValueParser parser) throws ParseException {
182 Args.notNull(value, "Value");
183
184 final CharArrayBufferhtml#CharArrayBuffer">CharArrayBuffer buffer = new CharArrayBuffer(value.length());
185 buffer.append(value);
186 final ParserCursoror.html#ParserCursor">ParserCursor cursor = new ParserCursor(0, value.length());
187 return (parser != null ? parser : BasicHeaderValueParser.INSTANCE)
188 .parseParameters(buffer, cursor);
189 }
190
191
192
193
194 @Override
195 public NameValuePair[] parseParameters(final CharArrayBuffer buffer,
196 final ParserCursor cursor) {
197 Args.notNull(buffer, "Char array buffer");
198 Args.notNull(cursor, "Parser cursor");
199 tokenParser.skipWhiteSpace(buffer, cursor);
200 final List<NameValuePair> params = new ArrayList<NameValuePair>();
201 while (!cursor.atEnd()) {
202 final NameValuePair param = parseNameValuePair(buffer, cursor);
203 params.add(param);
204 final char ch = buffer.charAt(cursor.getPos() - 1);
205 if (ch == ELEM_DELIMITER) {
206 break;
207 }
208 }
209 return params.toArray(new NameValuePair[params.size()]);
210 }
211
212
213
214
215
216
217
218
219
220 public static
221 NameValuePair parseNameValuePair(final String value,
222 final HeaderValueParser parser) throws ParseException {
223 Args.notNull(value, "Value");
224
225 final CharArrayBufferhtml#CharArrayBuffer">CharArrayBuffer buffer = new CharArrayBuffer(value.length());
226 buffer.append(value);
227 final ParserCursoror.html#ParserCursor">ParserCursor cursor = new ParserCursor(0, value.length());
228 return (parser != null ? parser : BasicHeaderValueParser.INSTANCE)
229 .parseNameValuePair(buffer, cursor);
230 }
231
232
233
234 @Override
235 public NameValuePair parseNameValuePair(final CharArrayBuffer buffer,
236 final ParserCursor cursor) {
237 Args.notNull(buffer, "Char array buffer");
238 Args.notNull(cursor, "Parser cursor");
239
240 final String name = tokenParser.parseToken(buffer, cursor, TOKEN_DELIMS);
241 if (cursor.atEnd()) {
242 return new BasicNameValuePair(name, null);
243 }
244 final int delim = buffer.charAt(cursor.getPos());
245 cursor.updatePos(cursor.getPos() + 1);
246 if (delim != '=') {
247 return createNameValuePair(name, null);
248 }
249 final String value = tokenParser.parseValue(buffer, cursor, VALUE_DELIMS);
250 if (!cursor.atEnd()) {
251 cursor.updatePos(cursor.getPos() + 1);
252 }
253 return createNameValuePair(name, value);
254 }
255
256
257
258
259 @Deprecated
260 public NameValuePair parseNameValuePair(final CharArrayBuffer buffer,
261 final ParserCursor cursor,
262 final char[] delimiters) {
263 Args.notNull(buffer, "Char array buffer");
264 Args.notNull(cursor, "Parser cursor");
265
266 final BitSet delimSet = new BitSet();
267 if (delimiters != null) {
268 for (final char delimiter: delimiters) {
269 delimSet.set(delimiter);
270 }
271 }
272 delimSet.set('=');
273 final String name = tokenParser.parseToken(buffer, cursor, delimSet);
274 if (cursor.atEnd()) {
275 return new BasicNameValuePair(name, null);
276 }
277 final int delim = buffer.charAt(cursor.getPos());
278 cursor.updatePos(cursor.getPos() + 1);
279 if (delim != '=') {
280 return createNameValuePair(name, null);
281 }
282 delimSet.clear('=');
283 final String value = tokenParser.parseValue(buffer, cursor, delimSet);
284 if (!cursor.atEnd()) {
285 cursor.updatePos(cursor.getPos() + 1);
286 }
287 return createNameValuePair(name, value);
288 }
289
290
291
292
293
294
295
296
297
298
299 protected NameValuePair createNameValuePair(final String name, final String value) {
300 return new BasicNameValuePair(name, value);
301 }
302
303 }
304