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 org.apache.http.FormattedHeader;
31 import org.apache.http.Header;
32 import org.apache.http.ProtocolVersion;
33 import org.apache.http.RequestLine;
34 import org.apache.http.StatusLine;
35 import org.apache.http.annotation.Contract;
36 import org.apache.http.annotation.ThreadingBehavior;
37 import org.apache.http.util.Args;
38 import org.apache.http.util.CharArrayBuffer;
39
40
41
42
43
44
45
46
47
48
49
50
51
52 @Contract(threading = ThreadingBehavior.IMMUTABLE)
53 public class BasicLineFormatter implements LineFormatter {
54
55
56
57
58
59
60
61
62
63 @Deprecated
64 public final static BasicLineFormatterr.html#BasicLineFormatter">BasicLineFormatter DEFAULT = new BasicLineFormatter();
65
66 public final static BasicLineFormatter.html#BasicLineFormatter">BasicLineFormatter INSTANCE = new BasicLineFormatter();
67
68 public BasicLineFormatter() {
69 super();
70 }
71
72
73
74
75
76
77
78
79
80 protected CharArrayBuffer#CharArrayBuffer">CharArrayBuffer initBuffer(final CharArrayBuffer charBuffer) {
81 CharArrayBuffer buffer = charBuffer;
82 if (buffer != null) {
83 buffer.clear();
84 } else {
85 buffer = new CharArrayBuffer(64);
86 }
87 return buffer;
88 }
89
90
91
92
93
94
95
96
97
98
99
100
101 public static
102 String formatProtocolVersion(final ProtocolVersion version,
103 final LineFormatter formatter) {
104 return (formatter != null ? formatter : BasicLineFormatter.INSTANCE)
105 .appendProtocolVersion(null, version).toString();
106 }
107
108
109
110 @Override
111 public CharArrayBufferuffer">CharArrayBuffer appendProtocolVersion(final CharArrayBuffer buffer,
112 final ProtocolVersion version) {
113 Args.notNull(version, "Protocol version");
114
115 CharArrayBuffer result = buffer;
116 final int len = estimateProtocolVersionLen(version);
117 if (result == null) {
118 result = new CharArrayBuffer(len);
119 } else {
120 result.ensureCapacity(len);
121 }
122
123 result.append(version.getProtocol());
124 result.append('/');
125 result.append(Integer.toString(version.getMajor()));
126 result.append('.');
127 result.append(Integer.toString(version.getMinor()));
128
129 return result;
130 }
131
132
133
134
135
136
137
138
139
140
141
142 protected int estimateProtocolVersionLen(final ProtocolVersion version) {
143 return version.getProtocol().length() + 4;
144 }
145
146
147
148
149
150
151
152
153
154
155
156
157 public static String formatRequestLine(final RequestLine reqline,
158 final LineFormatter formatter) {
159 return (formatter != null ? formatter : BasicLineFormatter.INSTANCE)
160 .formatRequestLine(null, reqline).toString();
161 }
162
163
164
165 @Override
166 public CharArrayBufferrayBuffer">CharArrayBuffer formatRequestLine(final CharArrayBuffer buffer,
167 final RequestLine reqline) {
168 Args.notNull(reqline, "Request line");
169 final CharArrayBuffer result = initBuffer(buffer);
170 doFormatRequestLine(result, reqline);
171
172 return result;
173 }
174
175
176
177
178
179
180
181
182
183
184 protected void doFormatRequestLine(final CharArrayBuffer buffer,
185 final RequestLine reqline) {
186 final String method = reqline.getMethod();
187 final String uri = reqline.getUri();
188
189
190 final int len = method.length() + 1 + uri.length() + 1 +
191 estimateProtocolVersionLen(reqline.getProtocolVersion());
192 buffer.ensureCapacity(len);
193
194 buffer.append(method);
195 buffer.append(' ');
196 buffer.append(uri);
197 buffer.append(' ');
198 appendProtocolVersion(buffer, reqline.getProtocolVersion());
199 }
200
201
202
203
204
205
206
207
208
209
210
211
212
213 public static String formatStatusLine(final StatusLine statline,
214 final LineFormatter formatter) {
215 return (formatter != null ? formatter : BasicLineFormatter.INSTANCE)
216 .formatStatusLine(null, statline).toString();
217 }
218
219
220
221 @Override
222 public CharArrayBufferrrayBuffer">CharArrayBuffer formatStatusLine(final CharArrayBuffer buffer,
223 final StatusLine statline) {
224 Args.notNull(statline, "Status line");
225 final CharArrayBuffer result = initBuffer(buffer);
226 doFormatStatusLine(result, statline);
227
228 return result;
229 }
230
231
232
233
234
235
236
237
238
239
240 protected void doFormatStatusLine(final CharArrayBuffer buffer,
241 final StatusLine statline) {
242
243 int len = estimateProtocolVersionLen(statline.getProtocolVersion())
244 + 1 + 3 + 1;
245 final String reason = statline.getReasonPhrase();
246 if (reason != null) {
247 len += reason.length();
248 }
249 buffer.ensureCapacity(len);
250
251 appendProtocolVersion(buffer, statline.getProtocolVersion());
252 buffer.append(' ');
253 buffer.append(Integer.toString(statline.getStatusCode()));
254 buffer.append(' ');
255 if (reason != null) {
256 buffer.append(reason);
257 }
258 }
259
260
261
262
263
264
265
266
267
268
269
270
271 public static String formatHeader(final Header header,
272 final LineFormatter formatter) {
273 return (formatter != null ? formatter : BasicLineFormatter.INSTANCE)
274 .formatHeader(null, header).toString();
275 }
276
277
278
279 @Override
280 public CharArrayBufferharArrayBuffer">CharArrayBuffer formatHeader(final CharArrayBuffer buffer,
281 final Header header) {
282 Args.notNull(header, "Header");
283 final CharArrayBuffer result;
284
285 if (header instanceof FormattedHeader) {
286
287 result = ((FormattedHeader)header).getBuffer();
288 } else {
289 result = initBuffer(buffer);
290 doFormatHeader(result, header);
291 }
292 return result;
293
294 }
295
296
297
298
299
300
301
302
303
304
305 protected void doFormatHeader(final CharArrayBuffer buffer,
306 final Header header) {
307 final String name = header.getName();
308 final String value = header.getValue();
309
310 int len = name.length() + 2;
311 if (value != null) {
312 len += value.length();
313 }
314 buffer.ensureCapacity(len);
315
316 buffer.append(name);
317 buffer.append(": ");
318 if (value != null) {
319 buffer.ensureCapacity(buffer.length() + value.length());
320 for (int valueIndex = 0; valueIndex < value.length(); valueIndex++) {
321 char valueChar = value.charAt(valueIndex);
322 if (valueChar == '\r'
323 || valueChar == '\n'
324 || valueChar == '\f'
325 || valueChar == 0x0b) {
326 valueChar = ' ';
327 }
328 buffer.append(valueChar);
329 }
330 }
331 }
332
333
334 }