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.List;
32
33 import org.apache.http.HeaderElement;
34 import org.apache.http.NameValuePair;
35 import org.apache.http.ParseException;
36 import org.apache.http.annotation.Immutable;
37 import org.apache.http.message.BasicHeaderElement;
38 import org.apache.http.message.BasicNameValuePair;
39 import org.apache.http.message.ParserCursor;
40 import org.apache.http.protocol.HTTP;
41 import org.apache.http.util.Args;
42 import org.apache.http.util.CharArrayBuffer;
43
44
45
46
47
48 @Immutable
49 public class NetscapeDraftHeaderParser {
50
51 public final static NetscapeDraftHeaderParser DEFAULT = new NetscapeDraftHeaderParser();
52
53 public NetscapeDraftHeaderParser() {
54 super();
55 }
56
57 public HeaderElement parseHeader(
58 final CharArrayBuffer buffer,
59 final ParserCursor cursor) throws ParseException {
60 Args.notNull(buffer, "Char array buffer");
61 Args.notNull(cursor, "Parser cursor");
62 final NameValuePair nvp = parseNameValuePair(buffer, cursor);
63 final List<NameValuePair> params = new ArrayList<NameValuePair>();
64 while (!cursor.atEnd()) {
65 final NameValuePair param = parseNameValuePair(buffer, cursor);
66 params.add(param);
67 }
68 return new BasicHeaderElement(
69 nvp.getName(),
70 nvp.getValue(), params.toArray(new NameValuePair[params.size()]));
71 }
72
73 private NameValuePair parseNameValuePair(
74 final CharArrayBuffer buffer, final ParserCursor cursor) {
75 boolean terminated = false;
76
77 int pos = cursor.getPos();
78 final int indexFrom = cursor.getPos();
79 final int indexTo = cursor.getUpperBound();
80
81
82 String name = null;
83 while (pos < indexTo) {
84 final char ch = buffer.charAt(pos);
85 if (ch == '=') {
86 break;
87 }
88 if (ch == ';') {
89 terminated = true;
90 break;
91 }
92 pos++;
93 }
94
95 if (pos == indexTo) {
96 terminated = true;
97 name = buffer.substringTrimmed(indexFrom, indexTo);
98 } else {
99 name = buffer.substringTrimmed(indexFrom, pos);
100 pos++;
101 }
102
103 if (terminated) {
104 cursor.updatePos(pos);
105 return new BasicNameValuePair(name, null);
106 }
107
108
109 String value = null;
110 int i1 = pos;
111
112 while (pos < indexTo) {
113 final char ch = buffer.charAt(pos);
114 if (ch == ';') {
115 terminated = true;
116 break;
117 }
118 pos++;
119 }
120
121 int i2 = pos;
122
123 while (i1 < i2 && (HTTP.isWhitespace(buffer.charAt(i1)))) {
124 i1++;
125 }
126
127 while ((i2 > i1) && (HTTP.isWhitespace(buffer.charAt(i2 - 1)))) {
128 i2--;
129 }
130 value = buffer.substring(i1, i2);
131 if (terminated) {
132 pos++;
133 }
134 cursor.updatePos(pos);
135 return new BasicNameValuePair(name, value);
136 }
137
138 }