1 /* 2 * $HeadURL: http://svn.apache.org/repos/asf/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/message/BasicLineFormatter.java $ 3 * $Revision: 574185 $ 4 * $Date: 2007-09-10 02:19:47 -0700 (Mon, 10 Sep 2007) $ 5 * 6 * ==================================================================== 7 * Licensed to the Apache Software Foundation (ASF) under one 8 * or more contributor license agreements. See the NOTICE file 9 * distributed with this work for additional information 10 * regarding copyright ownership. The ASF licenses this file 11 * to you under the Apache License, Version 2.0 (the 12 * "License"); you may not use this file except in compliance 13 * with the License. You may obtain a copy of the License at 14 * 15 * http://www.apache.org/licenses/LICENSE-2.0 16 * 17 * Unless required by applicable law or agreed to in writing, 18 * software distributed under the License is distributed on an 19 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 20 * KIND, either express or implied. See the License for the 21 * specific language governing permissions and limitations 22 * under the License. 23 * ==================================================================== 24 * 25 * This software consists of voluntary contributions made by many 26 * individuals on behalf of the Apache Software Foundation. For more 27 * information on the Apache Software Foundation, please see 28 * <http://www.apache.org/>. 29 * 30 */ 31 32 package org.apache.http.message; 33 34 35 import org.apache.http.ProtocolVersion; 36 import org.apache.http.RequestLine; 37 import org.apache.http.StatusLine; 38 import org.apache.http.Header; 39 import org.apache.http.FormattedHeader; 40 import org.apache.http.util.CharArrayBuffer; 41 42 43 /** 44 * Interface for formatting elements of the HEAD section of an HTTP message. 45 * This is the complement to {@link LineParser}. 46 * There are individual methods for formatting a request line, a 47 * status line, or a header line. The formatting does <i>not</i> include the 48 * trailing line break sequence CR-LF. 49 * The formatted lines are returned in memory, the formatter does not depend 50 * on any specific IO mechanism. 51 * Instances of this interface are expected to be stateless and thread-safe. 52 * 53 * @author <a href="mailto:remm@apache.org">Remy Maucherat</a> 54 * @author <a href="mailto:mbowler@GargoyleSoftware.com">Mike Bowler</a> 55 * @author <a href="mailto:jsdever@apache.org">Jeff Dever</a> 56 * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a> 57 * @author and others 58 * 59 * 60 * <!-- empty lines above to avoid 'svn diff' context problems --> 61 * @version $Revision: 574185 $ 62 * 63 * @since 4.0 64 * 65 * @deprecated Please use {@link java.net.URL#openConnection} instead. 66 * Please visit <a href="http://android-developers.blogspot.com/2011/09/androids-http-clients.html">this webpage</a> 67 * for further details. 68 */ 69 @Deprecated 70 public class BasicLineFormatter implements LineFormatter { 71 72 /** 73 * A default instance of this class, for use as default or fallback. 74 * Note that {@link BasicLineFormatter} is not a singleton, there can 75 * be many instances of the class itself and of derived classes. 76 * The instance here provides non-customized, default behavior. 77 */ 78 public final static BasicLineFormatter DEFAULT = new BasicLineFormatter(); 79 80 81 82 // public default constructor 83 84 85 /** 86 * Obtains a buffer for formatting. 87 * 88 * @param buffer a buffer already available, or <code>null</code> 89 * 90 * @return the cleared argument buffer if there is one, or 91 * a new empty buffer that can be used for formatting 92 */ initBuffer(CharArrayBuffer buffer)93 protected CharArrayBuffer initBuffer(CharArrayBuffer buffer) { 94 if (buffer != null) { 95 buffer.clear(); 96 } else { 97 buffer = new CharArrayBuffer(64); 98 } 99 return buffer; 100 } 101 102 103 /** 104 * Formats a protocol version. 105 * 106 * @param version the protocol version to format 107 * @param formatter the formatter to use, or 108 * <code>null</code> for the 109 * {@link #DEFAULT default} 110 * 111 * @return the formatted protocol version 112 */ 113 public final static formatProtocolVersion(final ProtocolVersion version, LineFormatter formatter)114 String formatProtocolVersion(final ProtocolVersion version, 115 LineFormatter formatter) { 116 if (formatter == null) 117 formatter = BasicLineFormatter.DEFAULT; 118 return formatter.appendProtocolVersion(null, version).toString(); 119 } 120 121 122 // non-javadoc, see interface LineFormatter appendProtocolVersion(final CharArrayBuffer buffer, final ProtocolVersion version)123 public CharArrayBuffer appendProtocolVersion(final CharArrayBuffer buffer, 124 final ProtocolVersion version) { 125 if (version == null) { 126 throw new IllegalArgumentException 127 ("Protocol version may not be null"); 128 } 129 130 // can't use initBuffer, that would clear the argument! 131 CharArrayBuffer result = buffer; 132 final int len = estimateProtocolVersionLen(version); 133 if (result == null) { 134 result = new CharArrayBuffer(len); 135 } else { 136 result.ensureCapacity(len); 137 } 138 139 result.append(version.getProtocol()); 140 result.append('/'); 141 result.append(Integer.toString(version.getMajor())); 142 result.append('.'); 143 result.append(Integer.toString(version.getMinor())); 144 145 return result; 146 } 147 148 149 /** 150 * Guesses the length of a formatted protocol version. 151 * Needed to guess the length of a formatted request or status line. 152 * 153 * @param version the protocol version to format, or <code>null</code> 154 * 155 * @return the estimated length of the formatted protocol version, 156 * in characters 157 */ estimateProtocolVersionLen(final ProtocolVersion version)158 protected int estimateProtocolVersionLen(final ProtocolVersion version) { 159 return version.getProtocol().length() + 4; // room for "HTTP/1.1" 160 } 161 162 163 /** 164 * Formats a request line. 165 * 166 * @param reqline the request line to format 167 * @param formatter the formatter to use, or 168 * <code>null</code> for the 169 * {@link #DEFAULT default} 170 * 171 * @return the formatted request line 172 */ formatRequestLine(final RequestLine reqline, LineFormatter formatter)173 public final static String formatRequestLine(final RequestLine reqline, 174 LineFormatter formatter) { 175 if (formatter == null) 176 formatter = BasicLineFormatter.DEFAULT; 177 return formatter.formatRequestLine(null, reqline).toString(); 178 } 179 180 181 // non-javadoc, see interface LineFormatter formatRequestLine(CharArrayBuffer buffer, RequestLine reqline)182 public CharArrayBuffer formatRequestLine(CharArrayBuffer buffer, 183 RequestLine reqline) { 184 if (reqline == null) { 185 throw new IllegalArgumentException 186 ("Request line may not be null"); 187 } 188 189 CharArrayBuffer result = initBuffer(buffer); 190 doFormatRequestLine(result, reqline); 191 192 return result; 193 } 194 195 196 /** 197 * Actually formats a request line. 198 * Called from {@link #formatRequestLine}. 199 * 200 * @param buffer the empty buffer into which to format, 201 * never <code>null</code> 202 * @param reqline the request line to format, never <code>null</code> 203 */ doFormatRequestLine(final CharArrayBuffer buffer, final RequestLine reqline)204 protected void doFormatRequestLine(final CharArrayBuffer buffer, 205 final RequestLine reqline) { 206 final String method = reqline.getMethod(); 207 final String uri = reqline.getUri(); 208 209 // room for "GET /index.html HTTP/1.1" 210 int len = method.length() + 1 + uri.length() + 1 + 211 estimateProtocolVersionLen(reqline.getProtocolVersion()); 212 buffer.ensureCapacity(len); 213 214 buffer.append(method); 215 buffer.append(' '); 216 buffer.append(uri); 217 buffer.append(' '); 218 appendProtocolVersion(buffer, reqline.getProtocolVersion()); 219 } 220 221 222 223 /** 224 * Formats a status line. 225 * 226 * @param statline the status line to format 227 * @param formatter the formatter to use, or 228 * <code>null</code> for the 229 * {@link #DEFAULT default} 230 * 231 * @return the formatted status line 232 */ formatStatusLine(final StatusLine statline, LineFormatter formatter)233 public final static String formatStatusLine(final StatusLine statline, 234 LineFormatter formatter) { 235 if (formatter == null) 236 formatter = BasicLineFormatter.DEFAULT; 237 return formatter.formatStatusLine(null, statline).toString(); 238 } 239 240 241 // non-javadoc, see interface LineFormatter formatStatusLine(final CharArrayBuffer buffer, final StatusLine statline)242 public CharArrayBuffer formatStatusLine(final CharArrayBuffer buffer, 243 final StatusLine statline) { 244 if (statline == null) { 245 throw new IllegalArgumentException 246 ("Status line may not be null"); 247 } 248 249 CharArrayBuffer result = initBuffer(buffer); 250 doFormatStatusLine(result, statline); 251 252 return result; 253 } 254 255 256 /** 257 * Actually formats a status line. 258 * Called from {@link #formatStatusLine}. 259 * 260 * @param buffer the empty buffer into which to format, 261 * never <code>null</code> 262 * @param statline the status line to format, never <code>null</code> 263 */ doFormatStatusLine(final CharArrayBuffer buffer, final StatusLine statline)264 protected void doFormatStatusLine(final CharArrayBuffer buffer, 265 final StatusLine statline) { 266 267 int len = estimateProtocolVersionLen(statline.getProtocolVersion()) 268 + 1 + 3 + 1; // room for "HTTP/1.1 200 " 269 final String reason = statline.getReasonPhrase(); 270 if (reason != null) { 271 len += reason.length(); 272 } 273 buffer.ensureCapacity(len); 274 275 appendProtocolVersion(buffer, statline.getProtocolVersion()); 276 buffer.append(' '); 277 buffer.append(Integer.toString(statline.getStatusCode())); 278 buffer.append(' '); // keep whitespace even if reason phrase is empty 279 if (reason != null) { 280 buffer.append(reason); 281 } 282 } 283 284 285 /** 286 * Formats a header. 287 * 288 * @param header the header to format 289 * @param formatter the formatter to use, or 290 * <code>null</code> for the 291 * {@link #DEFAULT default} 292 * 293 * @return the formatted header 294 */ formatHeader(final Header header, LineFormatter formatter)295 public final static String formatHeader(final Header header, 296 LineFormatter formatter) { 297 if (formatter == null) 298 formatter = BasicLineFormatter.DEFAULT; 299 return formatter.formatHeader(null, header).toString(); 300 } 301 302 303 // non-javadoc, see interface LineFormatter formatHeader(CharArrayBuffer buffer, Header header)304 public CharArrayBuffer formatHeader(CharArrayBuffer buffer, 305 Header header) { 306 if (header == null) { 307 throw new IllegalArgumentException 308 ("Header may not be null"); 309 } 310 CharArrayBuffer result = null; 311 312 if (header instanceof FormattedHeader) { 313 // If the header is backed by a buffer, re-use the buffer 314 result = ((FormattedHeader)header).getBuffer(); 315 } else { 316 result = initBuffer(buffer); 317 doFormatHeader(result, header); 318 } 319 return result; 320 321 } // formatHeader 322 323 324 /** 325 * Actually formats a header. 326 * Called from {@link #formatHeader}. 327 * 328 * @param buffer the empty buffer into which to format, 329 * never <code>null</code> 330 * @param header the header to format, never <code>null</code> 331 */ doFormatHeader(final CharArrayBuffer buffer, final Header header)332 protected void doFormatHeader(final CharArrayBuffer buffer, 333 final Header header) { 334 final String name = header.getName(); 335 final String value = header.getValue(); 336 337 int len = name.length() + 2; 338 if (value != null) { 339 len += value.length(); 340 } 341 buffer.ensureCapacity(len); 342 343 buffer.append(name); 344 buffer.append(": "); 345 if (value != null) { 346 buffer.append(value); 347 } 348 } 349 350 351 } // class BasicLineFormatter 352