1 /* 2 * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//httpclient/src/java/org/apache/commons/httpclient/HttpMethod.java,v 1.43 2004/10/07 16:14:15 olegk Exp $ 3 * $Revision: 480424 $ 4 * $Date: 2006-11-29 06:56:49 +0100 (Wed, 29 Nov 2006) $ 5 * 6 * ==================================================================== 7 * 8 * Licensed to the Apache Software Foundation (ASF) under one or more 9 * contributor license agreements. See the NOTICE file distributed with 10 * this work for additional information regarding copyright ownership. 11 * The ASF licenses this file to You under the Apache License, Version 2.0 12 * (the "License"); you may not use this file except in compliance with 13 * 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, software 18 * distributed under the License is distributed on an "AS IS" BASIS, 19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 20 * See the License for the specific language governing permissions and 21 * limitations under the License. 22 * ==================================================================== 23 * 24 * This software consists of voluntary contributions made by many 25 * individuals on behalf of the Apache Software Foundation. For more 26 * information on the Apache Software Foundation, please see 27 * <http://www.apache.org/>. 28 * 29 */ 30 31 package org.apache.commons.httpclient; 32 33 import java.io.IOException; 34 import java.io.InputStream; 35 36 import org.apache.commons.httpclient.auth.AuthState; 37 import org.apache.commons.httpclient.params.HttpMethodParams; 38 39 /** 40 * <p> 41 * HttpMethod interface represents a request to be sent via a 42 * {@link HttpConnection HTTP connection} and a corresponding response. 43 * </p> 44 * @author <a href="mailto:remm@apache.org">Remy Maucherat</a> 45 * @author Rod Waldhoff 46 * @author <a href="jsdever@apache.org">Jeff Dever</a> 47 * @author <a href="mailto:mbowler@GargoyleSoftware.com">Mike Bowler</a> 48 * @author <a href="mailto:oleg@ural.ru">Oleg Kalnichevski</a> 49 * 50 * @version $Revision: 480424 $ $Date: 2006-11-29 06:56:49 +0100 (Wed, 29 Nov 2006) $ 51 * 52 * @since 1.0 53 */ 54 public interface HttpMethod { 55 56 // ------------------------------------------- Property Setters and Getters 57 58 /** 59 * Obtains the name of the HTTP method as used in the HTTP request line, 60 * for example <tt>"GET"</tt> or <tt>"POST"</tt>. 61 * 62 * @return the name of this method 63 */ getName()64 String getName(); 65 66 /** 67 * Gets the host configuration for this method. The configuration specifies 68 * the server, port, protocol, and proxy server via which this method will 69 * send its HTTP request. 70 * 71 * @deprecated no longer applicable 72 * 73 * @return the HostConfiguration or <code>null</code> if none is set 74 */ getHostConfiguration()75 HostConfiguration getHostConfiguration(); 76 77 /** 78 * Sets the path of the HTTP method. 79 * It is responsibility of the caller to ensure that the path is 80 * properly encoded (URL safe). 81 * 82 * @param path The path of the HTTP method. The path is expected 83 * to be URL encoded. 84 */ setPath(String path)85 void setPath(String path); 86 87 /** 88 * Returns the path of the HTTP method. 89 * 90 * Calling this method <em>after</em> the request has been executed will 91 * return the <em>actual</em> path, following any redirects automatically 92 * handled by this HTTP method. 93 * 94 * @return the path of the HTTP method, in URL encoded form 95 */ getPath()96 String getPath(); 97 98 /** 99 * Returns the URI for this method. The URI will be absolute if the host 100 * configuration has been set and relative otherwise. 101 * 102 * @return the URI for this method 103 * 104 * @throws URIException if a URI cannot be constructed 105 */ getURI()106 URI getURI() throws URIException; 107 108 /** 109 * Sets the URI for this method. 110 * 111 * @param uri URI to be set 112 * 113 * @throws URIException if a URI cannot be set 114 * 115 * @since 3.0 116 */ setURI(URI uri)117 void setURI(URI uri) throws URIException; 118 119 /** 120 * Defines how strictly the method follows the HTTP protocol specification. 121 * (See RFC 2616 and other relevant RFCs.) In the strict mode the method precisely 122 * implements the requirements of the specification, whereas in non-strict mode 123 * it attempts to mimic the exact behaviour of commonly used HTTP agents, 124 * which many HTTP servers expect. 125 * 126 * @param strictMode <tt>true</tt> for strict mode, <tt>false</tt> otherwise 127 * 128 * @deprecated Use {@link org.apache.commons.httpclient.params.HttpParams#setParameter(String, Object)} 129 * to exercise a more granular control over HTTP protocol strictness. 130 * 131 * @see #isStrictMode() 132 */ setStrictMode(boolean strictMode)133 void setStrictMode(boolean strictMode); 134 135 /** 136 * Returns the value of the strict mode flag. 137 * 138 * @return <tt>true</tt> if strict mode is enabled, <tt>false</tt> otherwise 139 * 140 * @deprecated Use {@link org.apache.commons.httpclient.params.HttpParams#setParameter(String, Object)} 141 * to exercise a more granular control over HTTP protocol strictness. 142 * 143 * @see #setStrictMode(boolean) 144 */ isStrictMode()145 boolean isStrictMode(); 146 147 /** 148 * Sets the specified request header, overwriting any 149 * previous value. 150 * Note that header-name matching is case insensitive. 151 * @param headerName the header's name 152 * @param headerValue the header's value 153 * 154 * @see #setRequestHeader(Header) 155 * @see #getRequestHeader(String) 156 * @see #removeRequestHeader(String) 157 */ setRequestHeader(String headerName, String headerValue)158 void setRequestHeader(String headerName, String headerValue); 159 160 /** 161 * Sets the specified request header, overwriting any 162 * previous value. 163 * Note that header-name matching is case insensitive. 164 * @param header the header to be set 165 * 166 * @see #setRequestHeader(String,String) 167 * @see #getRequestHeader(String) 168 * @see #removeRequestHeader(String) 169 */ setRequestHeader(Header header)170 void setRequestHeader(Header header); 171 172 /** 173 * Adds the specified request header, <em>not</em> overwriting any previous value. 174 * If the same header is added multiple times, perhaps with different values, 175 * multiple instances of that header will be sent in the HTTP request. 176 * Note that header-name matching is case insensitive. 177 * @param headerName the header's name 178 * @param headerValue the header's value 179 * 180 * @see #addRequestHeader(Header) 181 * @see #getRequestHeader(String) 182 * @see #removeRequestHeader(String) 183 */ addRequestHeader(String headerName, String headerValue)184 void addRequestHeader(String headerName, String headerValue); 185 186 /** 187 * Adds the specified request header, <em>not</em> overwriting any previous value. 188 * If the same header is added multiple times, perhaps with different values, 189 * multiple instances of that header will be sent in the HTTP request. 190 * Note that header-name matching is case insensitive. 191 * @param header the header 192 * 193 * @see #addRequestHeader(String,String) 194 * @see #getRequestHeader(String) 195 * @see #removeRequestHeader(String) 196 */ addRequestHeader(Header header)197 void addRequestHeader(Header header); 198 199 /** 200 * Gets the request header with the given name. 201 * If there are multiple headers with the same name, 202 * there values will be combined with the ',' separator as specified by RFC2616. 203 * Note that header-name matching is case insensitive. 204 * @param headerName the header name 205 * @return the header 206 */ getRequestHeader(String headerName)207 Header getRequestHeader(String headerName); 208 209 /** 210 * Removes all request headers with the given name. 211 * Note that header-name matching is case insensitive. 212 * @param headerName the header name 213 */ removeRequestHeader(String headerName)214 void removeRequestHeader(String headerName); 215 216 /** 217 * Removes the given request header. 218 * 219 * @param header the header 220 * 221 * @since 3.0 222 */ removeRequestHeader(Header header)223 void removeRequestHeader(Header header); 224 225 /** 226 * Returns <tt>true</tt> if the HTTP method should automatically follow HTTP redirects 227 * (status code 302, etc.), <tt>false</tt> otherwise. 228 * 229 * @return <tt>true</tt> if the method will automatically follow HTTP redirects, 230 * <tt>false</tt> otherwise 231 */ getFollowRedirects()232 boolean getFollowRedirects(); 233 234 /** 235 * Sets whether or not the HTTP method should automatically follow HTTP redirects 236 * (status code 302, etc.) 237 * 238 * @param followRedirects <tt>true</tt> if the method will automatically follow redirects, 239 * <tt>false</tt> otherwise. 240 */ setFollowRedirects(boolean followRedirects)241 void setFollowRedirects(boolean followRedirects); 242 243 /** 244 * Sets the query string of the HTTP method. 245 * It is responsibility of the caller to ensure that the path is 246 * properly encoded (URL safe). The string must not include an initial '?' character. 247 * 248 * @param queryString the query to be used in the request, with no leading '?' character 249 * 250 * @see #getQueryString() 251 * @see #setQueryString(NameValuePair[]) 252 */ setQueryString(String queryString)253 void setQueryString(String queryString); 254 255 /** 256 * Sets the query string of this HTTP method. The pairs are encoded as UTF-8 characters. 257 * To use a different charset the parameters can be encoded manually using EncodingUtil 258 * and set as a single String. 259 * 260 * @param params An array of <code>NameValuePair</code>s to use as the query string. 261 * The name/value pairs will be automatically URL encoded and should not 262 * have been encoded previously. 263 * 264 * @see #getQueryString() 265 * @see #setQueryString(String) 266 * @see org.apache.commons.httpclient.util.EncodingUtil#formUrlEncode(NameValuePair[], String) 267 */ setQueryString(NameValuePair[] params)268 void setQueryString(NameValuePair[] params); 269 270 /** 271 * Returns the query string of this HTTP method. 272 * 273 * @return the query string in URL encoded form, without a leading '?'. 274 * 275 * @see #setQueryString(NameValuePair[]) 276 * @see #setQueryString(String) 277 */ getQueryString()278 String getQueryString(); 279 280 /** 281 * Returns the current request headers for this HTTP method. The returned headers 282 * will be in the same order that they were added with <code>addRequestHeader</code>. 283 * If there are multiple request headers with the same name (e.g. <code>Cookie</code>), 284 * they will be returned as multiple entries in the array. 285 * 286 * @return an array containing all of the request headers 287 * 288 * @see #addRequestHeader(Header) 289 * @see #addRequestHeader(String,String) 290 */ getRequestHeaders()291 Header[] getRequestHeaders(); 292 293 /** 294 * Returns the request headers with the given name. Note that header-name matching is 295 * case insensitive. 296 * @param headerName the name of the headers to be returned. 297 * @return an array of zero or more headers 298 * 299 * @since 3.0 300 */ getRequestHeaders(String headerName)301 Header[] getRequestHeaders(String headerName); 302 303 // ---------------------------------------------------------------- Queries 304 305 /** 306 * Returns <tt>true</tt> the method is ready to execute, <tt>false</tt> otherwise. 307 * 308 * @return <tt>true</tt> if the method is ready to execute, <tt>false</tt> otherwise. 309 */ validate()310 boolean validate(); 311 312 /** 313 * Returns the status code associated with the latest response. 314 * 315 * @return The status code from the most recent execution of this method. 316 * If the method has not yet been executed, the result is undefined. 317 */ getStatusCode()318 int getStatusCode(); 319 320 /** 321 * Returns the status text (or "reason phrase") associated with the latest 322 * response. 323 * 324 * @return The status text from the most recent execution of this method. 325 * If the method has not yet been executed, the result is undefined. 326 */ getStatusText()327 String getStatusText(); 328 329 /** 330 * Returns the response headers from the most recent execution of this request. 331 * 332 * @return A newly-created array containing all of the response headers, 333 * in the order in which they appeared in the response. 334 */ getResponseHeaders()335 Header[] getResponseHeaders(); 336 337 /** 338 * Returns the specified response header. Note that header-name matching is 339 * case insensitive. 340 * 341 * @param headerName The name of the header to be returned. 342 * 343 * @return The specified response header. If the repsonse contained multiple 344 * instances of the header, its values will be combined using the ',' 345 * separator as specified by RFC2616. 346 */ getResponseHeader(String headerName)347 Header getResponseHeader(String headerName); 348 349 /** 350 * Returns the response headers with the given name. Note that header-name matching is 351 * case insensitive. 352 * @param headerName the name of the headers to be returned. 353 * @return an array of zero or more headers 354 * 355 * @since 3.0 356 */ getResponseHeaders(String headerName)357 Header[] getResponseHeaders(String headerName); 358 359 /** 360 * Returns the response footers from the most recent execution of this request. 361 * 362 * @return an array containing the response footers in the order that they 363 * appeared in the response. If the response had no footers, 364 * an empty array will be returned. 365 */ getResponseFooters()366 Header[] getResponseFooters(); 367 368 /** 369 * Return the specified response footer. Note that footer-name matching is 370 * case insensitive. 371 * 372 * @param footerName The name of the footer. 373 * @return The response footer. 374 */ getResponseFooter(String footerName)375 Header getResponseFooter(String footerName); 376 377 /** 378 * Returns the response body of the HTTP method, if any, as an array of bytes. 379 * If the method has not yet been executed or the response has no body, <code>null</code> 380 * is returned. Note that this method does not propagate I/O exceptions. 381 * If an error occurs while reading the body, <code>null</code> will be returned. 382 * 383 * @return The response body, or <code>null</code> if the 384 * body is not available. 385 * 386 * @throws IOException if an I/O (transport) problem occurs 387 */ getResponseBody()388 byte[] getResponseBody() throws IOException; 389 390 /** 391 * Returns the response body of the HTTP method, if any, as a {@link String}. 392 * If response body is not available or cannot be read, <tt>null</tt> is returned. 393 * The raw bytes in the body are converted to a <code>String</code> using the 394 * character encoding specified in the response's <tt>Content-Type</tt> header, or 395 * ISO-8859-1 if the response did not specify a character set. 396 * <p> 397 * Note that this method does not propagate I/O exceptions. 398 * If an error occurs while reading the body, <code>null</code> will be returned. 399 * 400 * @return The response body converted to a <code>String</code>, or <code>null</code> 401 * if the body is not available. 402 * 403 * @throws IOException if an I/O (transport) problem occurs 404 */ getResponseBodyAsString()405 String getResponseBodyAsString() throws IOException; 406 407 /** 408 * Returns the response body of the HTTP method, if any, as an InputStream. 409 * If the response had no body or the method has not yet been executed, 410 * <code>null</code> is returned. Additionally, <code>null</code> may be returned 411 * if {@link #releaseConnection} has been called or 412 * if this method was called previously and the resulting stream was closed. 413 * 414 * @return The response body, or <code>null</code> if it is not available 415 * 416 * @throws IOException if an I/O (transport) problem occurs 417 */ getResponseBodyAsStream()418 InputStream getResponseBodyAsStream() throws IOException; 419 420 /** 421 * Returns <tt>true</tt> if the HTTP method has been already {@link #execute executed}, 422 * but not {@link #recycle recycled}. 423 * 424 * @return <tt>true</tt> if the method has been executed, <tt>false</tt> otherwise 425 */ hasBeenUsed()426 boolean hasBeenUsed(); 427 428 // --------------------------------------------------------- Action Methods 429 430 /** 431 * Executes this method using the specified <code>HttpConnection</code> and 432 * <code>HttpState</code>. 433 * 434 * @param state the {@link HttpState state} information to associate with this method 435 * @param connection the {@link HttpConnection connection} used to execute 436 * this HTTP method 437 * 438 * @throws IOException If an I/O (transport) error occurs. Some transport exceptions 439 * can be recovered from. 440 * @throws HttpException If a protocol exception occurs. Usually protocol exceptions 441 * cannot be recovered from. 442 * 443 * @return the integer status code if one was obtained, or <tt>-1</tt> 444 */ execute(HttpState state, HttpConnection connection)445 int execute(HttpState state, HttpConnection connection) 446 throws HttpException, IOException; 447 448 /** 449 * Aborts the execution of the HTTP method. 450 * 451 * @see #execute(HttpState, HttpConnection) 452 * 453 * @since 3.0 454 */ abort()455 void abort(); 456 457 /** 458 * Recycles the HTTP method so that it can be used again. 459 * Note that all of the instance variables will be reset 460 * once this method has been called. This method will also 461 * release the connection being used by this HTTP method. 462 * 463 * @see #releaseConnection() 464 * 465 * @deprecated no longer supported and will be removed in the future 466 * version of HttpClient 467 */ recycle()468 void recycle(); 469 470 /** 471 * Releases the connection being used by this HTTP method. In particular the 472 * connection is used to read the response (if there is one) and will be held 473 * until the response has been read. If the connection can be reused by other 474 * HTTP methods it is NOT closed at this point. 475 * <p> 476 * After this method is called, {@link #getResponseBodyAsStream} will return 477 * <code>null</code>, and {@link #getResponseBody} and {@link #getResponseBodyAsString} 478 * <em>may</em> return <code>null</code>. 479 */ releaseConnection()480 void releaseConnection(); 481 482 /** 483 * Add a footer to this method's response. 484 * <p> 485 * <b>Note:</b> This method is for 486 * internal use only and should not be called by external clients. 487 * 488 * @param footer the footer to add 489 * 490 * @since 2.0 491 */ addResponseFooter(Header footer)492 void addResponseFooter(Header footer); 493 494 /** 495 * Returns the Status-Line from the most recent response for this method, 496 * or <code>null</code> if the method has not been executed. 497 * 498 * @return the status line, or <code>null</code> if the method has not been executed 499 * 500 * @since 2.0 501 */ getStatusLine()502 StatusLine getStatusLine(); 503 504 /** 505 * Returns <tt>true</tt> if the HTTP method should automatically handle HTTP 506 * authentication challenges (status code 401, etc.), <tt>false</tt> otherwise 507 * 508 * @return <tt>true</tt> if authentication challenges will be processed 509 * automatically, <tt>false</tt> otherwise. 510 * 511 * @since 2.0 512 * 513 * @see #setDoAuthentication(boolean) 514 */ getDoAuthentication()515 boolean getDoAuthentication(); 516 517 /** 518 * Sets whether or not the HTTP method should automatically handle HTTP 519 * authentication challenges (status code 401, etc.) 520 * 521 * @param doAuthentication <tt>true</tt> to process authentication challenges 522 * automatically, <tt>false</tt> otherwise. 523 * 524 * @since 2.0 525 * 526 * @see #getDoAuthentication() 527 */ setDoAuthentication(boolean doAuthentication)528 void setDoAuthentication(boolean doAuthentication); 529 530 531 /** 532 * Returns {@link HttpMethodParams HTTP protocol parameters} associated with this method. 533 * 534 * @since 3.0 535 * 536 * @see HttpMethodParams 537 */ getParams()538 public HttpMethodParams getParams(); 539 540 /** 541 * Assigns {@link HttpMethodParams HTTP protocol parameters} for this method. 542 * 543 * @since 3.0 544 * 545 * @see HttpMethodParams 546 */ setParams(final HttpMethodParams params)547 public void setParams(final HttpMethodParams params); 548 549 /** 550 * Returns the target host {@link AuthState authentication state} 551 * 552 * @return host authentication state 553 * 554 * @since 3.0 555 */ getHostAuthState()556 public AuthState getHostAuthState(); 557 558 /** 559 * Returns the proxy {@link AuthState authentication state} 560 * 561 * @return host authentication state 562 * 563 * @since 3.0 564 */ getProxyAuthState()565 public AuthState getProxyAuthState(); 566 567 /** 568 * Returns <tt>true</tt> if the HTTP has been transmitted to the target 569 * server in its entirety, <tt>false</tt> otherwise. This flag can be useful 570 * for recovery logic. If the request has not been transmitted in its entirety, 571 * it is safe to retry the failed method. 572 * 573 * @return <tt>true</tt> if the request has been sent, <tt>false</tt> otherwise 574 */ isRequestSent()575 boolean isRequestSent(); 576 577 } 578