View Javadoc
1 /* 2 * $Header: /home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/util/HttpURLConnection.java,v 1.12.2.1 2003/12/14 22:41:37 mbecke Exp $ 3 * $Revision: 1.12.2.1 $ 4 * $Date: 2003/12/14 22:41:37 $ 5 * 6 * ==================================================================== 7 * 8 * The Apache Software License, Version 1.1 9 * 10 * Copyright (c) 1999-2003 The Apache Software Foundation. All rights 11 * reserved. 12 * 13 * Redistribution and use in source and binary forms, with or without 14 * modification, are permitted provided that the following conditions 15 * are met: 16 * 17 * 1. Redistributions of source code must retain the above copyright 18 * notice, this list of conditions and the following disclaimer. 19 * 20 * 2. Redistributions in binary form must reproduce the above copyright 21 * notice, this list of conditions and the following disclaimer in 22 * the documentation and/or other materials provided with the 23 * distribution. 24 * 25 * 3. The end-user documentation included with the redistribution, if 26 * any, must include the following acknowlegement: 27 * "This product includes software developed by the 28 * Apache Software Foundation (http://www.apache.org/)." 29 * Alternately, this acknowlegement may appear in the software itself, 30 * if and wherever such third-party acknowlegements normally appear. 31 * 32 * 4. The names "The Jakarta Project", "Commons", and "Apache Software 33 * Foundation" must not be used to endorse or promote products derived 34 * from this software without prior written permission. For written 35 * permission, please contact apache@apache.org. 36 * 37 * 5. Products derived from this software may not be called "Apache" 38 * nor may "Apache" appear in their names without prior written 39 * permission of the Apache Group. 40 * 41 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 42 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 43 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 44 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR 45 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 46 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 47 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 48 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 49 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 50 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 51 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 52 * SUCH DAMAGE. 53 * ==================================================================== 54 * 55 * This software consists of voluntary contributions made by many 56 * individuals on behalf of the Apache Software Foundation. For more 57 * information on the Apache Software Foundation, please see 58 * <http://www.apache.org/>. 59 * 60 * [Additional notices, if required by prior licensing conditions] 61 * 62 */ 63 64 package org.apache.commons.httpclient.util; 65 66 import org.apache.commons.httpclient.HttpMethod; 67 import org.apache.commons.httpclient.Header; 68 69 import org.apache.commons.logging.LogFactory; 70 import org.apache.commons.logging.Log; 71 import java.io.IOException; 72 import java.io.InputStream; 73 import java.io.OutputStream; 74 import java.net.URL; 75 import java.net.ProtocolException; 76 import java.security.Permission; 77 78 /*** 79 * Provides a <code>HttpURLConnection</code> wrapper around HttpClient's 80 * <code>HttpMethod</code>. This allows existing code to easily switch to 81 * HttpClieht without breaking existing interfaces using the JDK 82 * <code>HttpURLConnection</code>. 83 * 84 * Note 1: The current implementations wraps only a connected 85 * <code>HttpMethod</code>, ie a method that has alreayd been used to connect 86 * to an HTTP server. 87 * 88 * Note 2: It is a best try effort as different version of the JDK have 89 * different behaviours for <code>HttpURLConnection</code> (And I'm not even 90 * including the numerous <code>HttpURLConnection</code> bugs!). 91 * 92 * @author <a href="mailto:vmassol@apache.org">Vincent Massol</a> 93 * @author <a href="mailto:jsdever@apache.org">Jeff Dever</a> 94 * @author <a href="mailto:mbowler@GargoyleSoftware.com">Mike Bowler</a> 95 * 96 * @since 2.0 97 * 98 * @version $Id: HttpURLConnection.java,v 1.12.2.1 2003/12/14 22:41:37 mbecke Exp $ 99 */ 100 public class HttpURLConnection extends java.net.HttpURLConnection { 101 102 // -------------------------------------------------------- Class Variables 103 104 /*** Log object for this class. */ 105 private static final Log LOG = LogFactory.getLog(HttpURLConnection.class); 106 107 108 // ----------------------------------------------------- Instance Variables 109 110 /*** 111 * The <code>HttpMethod</code> object that was used to connect to the 112 * HTTP server. It contains all the returned data. 113 */ 114 private HttpMethod method; 115 116 /*** 117 * The URL to which we are connected 118 */ 119 private URL url; 120 121 122 123 // ----------------------------------------------------------- Constructors 124 125 /*** 126 * Creates an <code>HttpURLConnection</code> from a <code>HttpMethod</code>. 127 * 128 * @param method the theMethod that was used to connect to the HTTP 129 * server and which contains the returned data. 130 * @param url the URL to which we are connected (includes query string) 131 */ 132 public HttpURLConnection(HttpMethod method, URL url) { 133 super(url); 134 this.method = method; 135 this.url = url; 136 } 137 138 /*** 139 * Create an instance. 140 * @param url The URL. 141 * @see java.net.HttpURLConnection#HttpURLConnection(URL) 142 */ 143 protected HttpURLConnection(URL url) { 144 super(url); 145 throw new RuntimeException("An HTTP URL connection can only be " 146 + "constructed from a HttpMethod class"); 147 } 148 149 150 // --------------------------------------------------------- Public Methods 151 152 /*** 153 * Gets an input stream for the HttpMethod response body. 154 * @throws IOException If an IO problem occurs. 155 * @return The input stream. 156 * @see java.net.HttpURLConnection#getInputStream() 157 * @see org.apache.commons.httpclient.HttpMethod#getResponseBodyAsStream() 158 */ 159 public InputStream getInputStream() throws IOException { 160 LOG.trace("enter HttpURLConnection.getInputStream()"); 161 return this.method.getResponseBodyAsStream(); 162 } 163 164 /*** 165 * Not yet implemented. 166 * Return the error stream. 167 * @see java.net.HttpURLConnection#getErrorStream() 168 */ 169 public InputStream getErrorStream() { 170 LOG.trace("enter HttpURLConnection.getErrorStream()"); 171 throw new RuntimeException("Not implemented yet"); 172 } 173 174 /*** 175 * Not yet implemented. 176 * @see java.net.HttpURLConnection#disconnect() 177 */ 178 public void disconnect() { 179 LOG.trace("enter HttpURLConnection.disconnect()"); 180 throw new RuntimeException("Not implemented yet"); 181 } 182 183 /*** 184 * Not available: the data must have already been retrieved. 185 * @throws IOException If an IO problem occurs. 186 * @see java.net.HttpURLConnection#connect() 187 */ 188 public void connect() throws IOException { 189 LOG.trace("enter HttpURLConnection.connect()"); 190 throw new RuntimeException("This class can only be used with already" 191 + "retrieved data"); 192 } 193 194 /*** 195 * Not yet implemented. 196 * @return true if we are using a proxy. 197 * @see java.net.HttpURLConnection#usingProxy() 198 */ 199 public boolean usingProxy() { 200 LOG.trace("enter HttpURLConnection.usingProxy()"); 201 throw new RuntimeException("Not implemented yet"); 202 } 203 204 /*** 205 * Return the request method. 206 * @return The request method. 207 * @see java.net.HttpURLConnection#getRequestMethod() 208 * @see org.apache.commons.httpclient.HttpMethod#getName() 209 */ 210 public String getRequestMethod() { 211 LOG.trace("enter HttpURLConnection.getRequestMethod()"); 212 return this.method.getName(); 213 } 214 215 /*** 216 * Return the response code. 217 * @return The response code. 218 * @throws IOException If an IO problem occurs. 219 * @see java.net.HttpURLConnection#getResponseCode() 220 * @see org.apache.commons.httpclient.HttpMethod#getStatusCode() 221 */ 222 public int getResponseCode() throws IOException { 223 LOG.trace("enter HttpURLConnection.getResponseCode()"); 224 return this.method.getStatusCode(); 225 } 226 227 /*** 228 * Return the response message 229 * @return The response message 230 * @throws IOException If an IO problem occurs. 231 * @see java.net.HttpURLConnection#getResponseMessage() 232 * @see org.apache.commons.httpclient.HttpMethod#getStatusText() 233 */ 234 public String getResponseMessage() throws IOException { 235 LOG.trace("enter HttpURLConnection.getResponseMessage()"); 236 return this.method.getStatusText(); 237 } 238 239 /*** 240 * Return the header field 241 * @param name the name of the header 242 * @return the header field. 243 * @see java.net.HttpURLConnection#getHeaderField(String) 244 * @see org.apache.commons.httpclient.HttpMethod#getResponseHeaders() 245 */ 246 public String getHeaderField(String name) { 247 LOG.trace("enter HttpURLConnection.getHeaderField(String)"); 248 // Note: Return the last matching header in the Header[] array, as in 249 // the JDK implementation. 250 Header[] headers = this.method.getResponseHeaders(); 251 for (int i = headers.length - 1; i >= 0; i--) { 252 if (headers[i].getName().equalsIgnoreCase(name)) { 253 return headers[i].getValue(); 254 } 255 } 256 257 return null; 258 } 259 260 /*** 261 * Return the header field key 262 * @param keyPosition The key position 263 * @return The header field key. 264 * @see java.net.HttpURLConnection#getHeaderFieldKey(int) 265 * @see org.apache.commons.httpclient.HttpMethod#getResponseHeaders() 266 */ 267 public String getHeaderFieldKey(int keyPosition) { 268 LOG.trace("enter HttpURLConnection.getHeaderFieldKey(int)"); 269 270 // Note: HttpClient does not consider the returned Status Line as 271 // a response header. However, getHeaderFieldKey(0) is supposed to 272 // return null. Hence the special case below ... 273 274 if (keyPosition == 0) { 275 return null; 276 } 277 278 // Note: HttpClient does not currently keep headers in the same order 279 // that they are read from the HTTP server. 280 281 Header[] headers = this.method.getResponseHeaders(); 282 if (keyPosition < 0 || keyPosition > headers.length) { 283 return null; 284 } 285 286 return headers[keyPosition - 1].getName(); 287 } 288 289 /*** 290 * Return the header field at the specified position 291 * @param position The position 292 * @return The header field. 293 * @see java.net.HttpURLConnection#getHeaderField(int) 294 * @see org.apache.commons.httpclient.HttpMethod#getResponseHeaders() 295 */ 296 public String getHeaderField(int position) { 297 LOG.trace("enter HttpURLConnection.getHeaderField(int)"); 298 299 // Note: HttpClient does not consider the returned Status Line as 300 // a response header. However, getHeaderField(0) is supposed to 301 // return the status line. Hence the special case below ... 302 303 if (position == 0) { 304 return this.method.getStatusLine().toString(); 305 } 306 307 // Note: HttpClient does not currently keep headers in the same order 308 // that they are read from the HTTP server. 309 310 Header[] headers = this.method.getResponseHeaders(); 311 if (position < 0 || position > headers.length) { 312 return null; 313 } 314 315 return headers[position - 1].getValue(); 316 } 317 318 /*** 319 * Return the URL 320 * @return The URL. 321 * @see java.net.HttpURLConnection#getURL() 322 */ 323 public URL getURL() { 324 LOG.trace("enter HttpURLConnection.getURL()"); 325 return this.url; 326 } 327 328 // Note: We don't implement the following methods so that they default to 329 // the JDK implementation. They will all call 330 // <code>getHeaderField(String)</code> which we have overridden. 331 332 // java.net.HttpURLConnection#getHeaderFieldDate(String, long) 333 // java.net.HttpURLConnection#getContentLength() 334 // java.net.HttpURLConnection#getContentType() 335 // java.net.HttpURLConnection#getContentEncoding() 336 // java.net.HttpURLConnection#getDate() 337 // java.net.HttpURLConnection#getHeaderFieldInt(String, int) 338 // java.net.HttpURLConnection#getExpiration() 339 // java.net.HttpURLConnection#getLastModified() 340 341 /*** 342 * Not available: the data must have already been retrieved. 343 */ 344 public void setInstanceFollowRedirects(boolean isFollowingRedirects) { 345 LOG.trace("enter HttpURLConnection.setInstanceFollowRedirects(boolean)"); 346 throw new RuntimeException("This class can only be used with already" 347 + "retrieved data"); 348 } 349 350 /*** 351 * Not yet implemented. 352 */ 353 public boolean getInstanceFollowRedirects() { 354 LOG.trace("enter HttpURLConnection.getInstanceFollowRedirects()"); 355 throw new RuntimeException("Not implemented yet"); 356 } 357 358 /*** 359 * Not available: the data must have already been retrieved. 360 * @see java.net.HttpURLConnection#setRequestMethod(String) 361 */ 362 public void setRequestMethod(String method) throws ProtocolException { 363 LOG.trace("enter HttpURLConnection.setRequestMethod(String)"); 364 throw new RuntimeException("This class can only be used with already" 365 + "retrieved data"); 366 } 367 368 /*** 369 * Not yet implemented. 370 * @see java.net.HttpURLConnection#getPermission() 371 */ 372 public Permission getPermission() throws IOException { 373 LOG.trace("enter HttpURLConnection.getPermission()"); 374 throw new RuntimeException("Not implemented yet"); 375 } 376 377 /*** 378 * Not yet implemented. 379 * @see java.net.HttpURLConnection#getContent() 380 */ 381 public Object getContent() throws IOException { 382 LOG.trace("enter HttpURLConnection.getContent()"); 383 throw new RuntimeException("Not implemented yet"); 384 } 385 386 /*** 387 * Not yet implemented. 388 */ 389 public Object getContent(Class[] classes) throws IOException { 390 LOG.trace("enter HttpURLConnection.getContent(Class[])"); 391 throw new RuntimeException("Not implemented yet"); 392 } 393 394 /*** 395 * @see java.net.HttpURLConnection#getOutputStream() 396 */ 397 public OutputStream getOutputStream() throws IOException { 398 LOG.trace("enter HttpURLConnection.getOutputStream()"); 399 throw new RuntimeException("This class can only be used with already" 400 + "retrieved data"); 401 } 402 403 /*** 404 * Not available: the data must have already been retrieved. 405 * @see java.net.HttpURLConnection#setDoInput(boolean) 406 */ 407 public void setDoInput(boolean isInput) { 408 LOG.trace("enter HttpURLConnection.setDoInput()"); 409 throw new RuntimeException("This class can only be used with already" 410 + "retrieved data"); 411 } 412 413 /*** 414 * Not yet implemented. 415 * @see java.net.HttpURLConnection#getDoInput() 416 */ 417 public boolean getDoInput() { 418 LOG.trace("enter HttpURLConnection.getDoInput()"); 419 throw new RuntimeException("Not implemented yet"); 420 } 421 422 /*** 423 * Not available: the data must have already been retrieved. 424 * @see java.net.HttpURLConnection#setDoOutput(boolean) 425 */ 426 public void setDoOutput(boolean isOutput) { 427 LOG.trace("enter HttpURLConnection.setDoOutput()"); 428 throw new RuntimeException("This class can only be used with already" 429 + "retrieved data"); 430 } 431 432 /*** 433 * Not yet implemented. 434 * @see java.net.HttpURLConnection#getDoOutput() 435 */ 436 public boolean getDoOutput() { 437 LOG.trace("enter HttpURLConnection.getDoOutput()"); 438 throw new RuntimeException("Not implemented yet"); 439 } 440 441 /*** 442 * Not available: the data must have already been retrieved. 443 * @see java.net.HttpURLConnection#setAllowUserInteraction(boolean) 444 */ 445 public void setAllowUserInteraction(boolean isAllowInteraction) { 446 LOG.trace("enter HttpURLConnection.setAllowUserInteraction(boolean)"); 447 throw new RuntimeException("This class can only be used with already" 448 + "retrieved data"); 449 } 450 451 /*** 452 * Not yet implemented. 453 * @see java.net.HttpURLConnection#getAllowUserInteraction() 454 */ 455 public boolean getAllowUserInteraction() { 456 LOG.trace("enter HttpURLConnection.getAllowUserInteraction()"); 457 throw new RuntimeException("Not implemented yet"); 458 } 459 460 /*** 461 * Not available: the data must have already been retrieved. 462 * @see java.net.HttpURLConnection#setUseCaches(boolean) 463 */ 464 public void setUseCaches(boolean isUsingCaches) { 465 LOG.trace("enter HttpURLConnection.setUseCaches(boolean)"); 466 throw new RuntimeException("This class can only be used with already" 467 + "retrieved data"); 468 } 469 470 /*** 471 * Not yet implemented. 472 * @see java.net.HttpURLConnection#getUseCaches() 473 */ 474 public boolean getUseCaches() { 475 LOG.trace("enter HttpURLConnection.getUseCaches()"); 476 throw new RuntimeException("Not implemented yet"); 477 } 478 479 /*** 480 * Not available: the data must have already been retrieved. 481 * @see java.net.HttpURLConnection#setIfModifiedSince(long) 482 */ 483 public void setIfModifiedSince(long modificationDate) { 484 LOG.trace("enter HttpURLConnection.setIfModifiedSince(long)"); 485 throw new RuntimeException("This class can only be used with already" 486 + "retrieved data"); 487 } 488 489 /*** 490 * Not yet implemented. 491 * @see java.net.HttpURLConnection#getIfModifiedSince() 492 */ 493 public long getIfModifiedSince() { 494 LOG.trace("enter HttpURLConnection.getIfmodifiedSince()"); 495 throw new RuntimeException("Not implemented yet"); 496 } 497 498 /*** 499 * Not available: the data must have already been retrieved. 500 * @see java.net.HttpURLConnection#getDefaultUseCaches() 501 */ 502 public boolean getDefaultUseCaches() { 503 LOG.trace("enter HttpURLConnection.getDefaultUseCaches()"); 504 throw new RuntimeException("Not implemented yet"); 505 } 506 507 /*** 508 * Not available: the data must have already been retrieved. 509 * @see java.net.HttpURLConnection#setDefaultUseCaches(boolean) 510 */ 511 public void setDefaultUseCaches(boolean isUsingCaches) { 512 LOG.trace("enter HttpURLConnection.setDefaultUseCaches(boolean)"); 513 throw new RuntimeException("This class can only be used with already" 514 + "retrieved data"); 515 } 516 517 /*** 518 * Not available: the data must have already been retrieved. 519 * @see java.net.HttpURLConnection#setRequestProperty(String,String) 520 */ 521 public void setRequestProperty(String key, String value) { 522 LOG.trace("enter HttpURLConnection.setRequestProperty()"); 523 throw new RuntimeException("This class can only be used with already" 524 + "retrieved data"); 525 } 526 527 /*** 528 * Not yet implemented. 529 * @see java.net.HttpURLConnection#getRequestProperty(String) 530 */ 531 public String getRequestProperty(String key) { 532 LOG.trace("enter HttpURLConnection.getRequestProperty()"); 533 throw new RuntimeException("Not implemented yet"); 534 } 535 536 } 537

This page was automatically generated by Maven