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.hc.core5.http.message;
29
30 import java.io.Serializable;
31
32 import org.apache.hc.core5.http.Chars;
33 import org.apache.hc.core5.http.FormattedHeader;
34 import org.apache.hc.core5.http.ParseException;
35 import org.apache.hc.core5.util.Args;
36 import org.apache.hc.core5.util.CharArrayBuffer;
37 import org.apache.hc.core5.util.Tokenizer;
38
39
40
41
42
43
44
45 public class BufferedHeader implements FormattedHeader, Serializable {
46
47 private static final long serialVersionUID = -2768352615787625448L;
48
49
50
51
52 private final String name;
53
54
55
56
57 private final CharArrayBuffer buffer;
58
59
60
61
62 private final int valuePos;
63
64 private String value;
65
66
67
68
69 public static BufferedHeader create(final CharArrayBuffer buffer) {
70 try {
71 return new BufferedHeader(buffer);
72 } catch (final ParseException ex) {
73 throw new IllegalArgumentException(ex.getMessage());
74 }
75 }
76
77
78
79
80
81
82
83
84
85
86 public BufferedHeader(final CharArrayBuffer buffer) throws ParseException {
87 this(buffer, true);
88 }
89
90 BufferedHeader(final CharArrayBuffer buffer, final boolean strict) throws ParseException {
91 super();
92 Args.notNull(buffer, "Char array buffer");
93 final int colon = buffer.indexOf(':');
94 if (colon <= 0) {
95 throw new ParseException("Invalid header", buffer, 0, buffer.length());
96 }
97 if (strict && Tokenizer.isWhitespace(buffer.charAt(colon - 1))) {
98 throw new ParseException("Invalid header", buffer, 0, buffer.length(), colon - 1);
99 }
100 final String s = buffer.substringTrimmed(0, colon);
101 if (s.isEmpty()) {
102 throw new ParseException("Invalid header", buffer, 0, buffer.length(), colon);
103 }
104 this.buffer = buffer;
105 this.name = s;
106 this.valuePos = colon + 1;
107 }
108
109 @Override
110 public String getName() {
111 return this.name;
112 }
113
114 @Override
115 public String getValue() {
116 if (value == null) {
117 int beginIdx = valuePos;
118 int endIdx = buffer.length();
119 while (beginIdx < buffer.length() && Tokenizer.isWhitespace(buffer.charAt(beginIdx))) {
120 beginIdx++;
121 }
122 while (endIdx > beginIdx && Tokenizer.isWhitespace(buffer.charAt(endIdx - 1))) {
123 endIdx--;
124 }
125 final StringBuilder buf = new StringBuilder(endIdx - beginIdx);
126 for (int i = beginIdx; i < endIdx; i++) {
127 final char ch = buffer.charAt(i);
128 if (ch == Chars.CR || ch == Chars.LF || ch == Chars.NULL) {
129 buf.append((char) Chars.SP);
130 } else {
131 buf.append(ch);
132 }
133 }
134 value = buf.toString();
135 }
136 return value;
137 }
138
139 @Override
140 public boolean isSensitive() {
141 return false;
142 }
143
144 @Override
145 public int getValuePos() {
146 return this.valuePos;
147 }
148
149 @Override
150 public CharArrayBuffer getBuffer() {
151 return this.buffer;
152 }
153
154 @Override
155 public String toString() {
156 return this.buffer.toString();
157 }
158
159 }