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.impl.cookie;
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.Contract;
38 import org.apache.http.annotation.ThreadingBehavior;
39 import org.apache.http.message.BasicHeaderElement;
40 import org.apache.http.message.BasicNameValuePair;
41 import org.apache.http.message.ParserCursor;
42 import org.apache.http.message.TokenParser;
43 import org.apache.http.util.Args;
44 import org.apache.http.util.CharArrayBuffer;
45
46
47
48
49
50 @Contract(threading = ThreadingBehavior.IMMUTABLE)
51 public class NetscapeDraftHeaderParser {
52
53 public final static NetscapeDraftHeaderParsererParser.html#NetscapeDraftHeaderParser">NetscapeDraftHeaderParser DEFAULT = new NetscapeDraftHeaderParser();
54
55 private final static char PARAM_DELIMITER = ';';
56
57
58
59 private static final BitSet TOKEN_DELIMS = TokenParser.INIT_BITSET('=', PARAM_DELIMITER);
60 private static final BitSet VALUE_DELIMS = TokenParser.INIT_BITSET(PARAM_DELIMITER);
61
62 private final TokenParser tokenParser;
63
64 public NetscapeDraftHeaderParser() {
65 super();
66 this.tokenParser = TokenParser.INSTANCE;
67 }
68
69 public HeaderElement parseHeader(
70 final CharArrayBuffer buffer,
71 final ParserCursor cursor) throws ParseException {
72 Args.notNull(buffer, "Char array buffer");
73 Args.notNull(cursor, "Parser cursor");
74 final NameValuePair nvp = parseNameValuePair(buffer, cursor);
75 final List<NameValuePair> params = new ArrayList<NameValuePair>();
76 while (!cursor.atEnd()) {
77 final NameValuePair param = parseNameValuePair(buffer, cursor);
78 params.add(param);
79 }
80 return new BasicHeaderElement(
81 nvp.getName(),
82 nvp.getValue(), params.toArray(new NameValuePair[params.size()]));
83 }
84
85 private NameValuePair parseNameValuePair(
86 final CharArrayBuffer buffer, final ParserCursor cursor) {
87 final String name = tokenParser.parseToken(buffer, cursor, TOKEN_DELIMS);
88 if (cursor.atEnd()) {
89 return new BasicNameValuePair(name, null);
90 }
91 final int delim = buffer.charAt(cursor.getPos());
92 cursor.updatePos(cursor.getPos() + 1);
93 if (delim != '=') {
94 return new BasicNameValuePair(name, null);
95 }
96 final String value = tokenParser.parseToken(buffer, cursor, VALUE_DELIMS);
97 if (!cursor.atEnd()) {
98 cursor.updatePos(cursor.getPos() + 1);
99 }
100 return new BasicNameValuePair(name, value);
101 }
102
103 }