- /*
- * $Header: /home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpMethod.java,v 1.41 2004/07/05 22:46:58 olegk Exp $
- * $Revision: 1.41 $
- * $Date: 2004/07/05 22:46:58 $
- *
- * ====================================================================
- *
- * Copyright 1999-2004 The Apache Software Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation. For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
- package org.apache.commons.httpclient;
- import java.io.IOException;
- import java.io.InputStream;
- import org.apache.commons.httpclient.auth.AuthState;
- import org.apache.commons.httpclient.params.HttpMethodParams;
- /**
- * <p>
- * HttpMethod interface represents a request to be sent via a
- * {@link HttpConnection HTTP connection} and a corresponding response.
- * </p>
- * @author <a href="mailto:remm@apache.org">Remy Maucherat</a>
- * @author Rod Waldhoff
- * @author <a href="jsdever@apache.org">Jeff Dever</a>
- * @author <a href="mailto:mbowler@GargoyleSoftware.com">Mike Bowler</a>
- * @author <a href="mailto:oleg@ural.ru">Oleg Kalnichevski</a>
- *
- * @version $Revision: 1.41 $ $Date: 2004/07/05 22:46:58 $
- *
- * @since 1.0
- */
- public interface HttpMethod {
- // ------------------------------------------- Property Setters and Getters
- /**
- * Obtains the name of the HTTP method as used in the HTTP request line,
- * for example <tt>"GET"</tt> or <tt>"POST"</tt>.
- *
- * @return the name of this method
- */
- String getName();
- /**
- * Gets the host configuration for this method. The configuration specifies
- * the server, port, protocol, and proxy server via which this method will
- * send its HTTP request.
- *
- * @return the HostConfiguration or <code>null</code> if none is set
- */
- HostConfiguration getHostConfiguration();
- /**
- * Sets the path of the HTTP method.
- * It is responsibility of the caller to ensure that the path is
- * properly encoded (URL safe).
- *
- * @param path The path of the HTTP method. The path is expected
- * to be URL encoded.
- */
- void setPath(String path);
- /**
- * Returns the path of the HTTP method.
- *
- * Calling this method <em>after</em> the request has been executed will
- * return the <em>actual</em> path, following any redirects automatically
- * handled by this HTTP method.
- *
- * @return the path of the HTTP method, in URL encoded form
- */
- String getPath();
- /**
- * Returns the URI for this method. The URI will be absolute if the host
- * configuration has been set and relative otherwise.
- *
- * @return the URI for this method
- *
- * @throws URIException if a URI cannot be constructed
- */
- URI getURI() throws URIException;
- /**
- * Sets the URI for this method.
- *
- * @param uri URI to be set
- *
- * @throws URIException if a URI cannot be set
- *
- * @since 3.0
- */
- void setURI(URI uri) throws URIException;
- /**
- * Defines how strictly the method follows the HTTP protocol specification.
- * (See RFC 2616 and other relevant RFCs.) In the strict mode the method precisely
- * implements the requirements of the specification, whereas in non-strict mode
- * it attempts to mimic the exact behaviour of commonly used HTTP agents,
- * which many HTTP servers expect.
- *
- * @param strictMode <tt>true</tt> for strict mode, <tt>false</tt> otherwise
- *
- * @deprecated Use {@link org.apache.commons.httpclient.params.HttpParams#setParameter(String, Object)}
- * to exercise a more granular control over HTTP protocol strictness.
- *
- * @see #isStrictMode()
- */
- void setStrictMode(boolean strictMode);
- /**
- * Returns the value of the strict mode flag.
- *
- * @return <tt>true</tt> if strict mode is enabled, <tt>false</tt> otherwise
- *
- * @deprecated Use {@link org.apache.commons.httpclient.params.HttpParams#setParameter(String, Object)}
- * to exercise a more granular control over HTTP protocol strictness.
- *
- * @see #setStrictMode(boolean)
- */
- boolean isStrictMode();
- /**
- * Sets the specified request header, overwriting any
- * previous value.
- * Note that header-name matching is case insensitive.
- * @param headerName the header's name
- * @param headerValue the header's value
- *
- * @see #setRequestHeader(Header)
- * @see #getRequestHeader(String)
- * @see #removeRequestHeader(String)
- */
- void setRequestHeader(String headerName, String headerValue);
- /**
- * Sets the specified request header, overwriting any
- * previous value.
- * Note that header-name matching is case insensitive.
- * @param header the header to be set
- *
- * @see #setRequestHeader(String,String)
- * @see #getRequestHeader(String)
- * @see #removeRequestHeader(String)
- */
- void setRequestHeader(Header header);
- /**
- * Adds the specified request header, <em>not</em> overwriting any previous value.
- * If the same header is added multiple times, perhaps with different values,
- * multiple instances of that header will be sent in the HTTP request.
- * Note that header-name matching is case insensitive.
- * @param headerName the header's name
- * @param headerValue the header's value
- *
- * @see #addRequestHeader(Header)
- * @see #getRequestHeader(String)
- * @see #removeRequestHeader(String)
- */
- void addRequestHeader(String headerName, String headerValue);
- /**
- * Adds the specified request header, <em>not</em> overwriting any previous value.
- * If the same header is added multiple times, perhaps with different values,
- * multiple instances of that header will be sent in the HTTP request.
- * Note that header-name matching is case insensitive.
- * @param header the header
- *
- * @see #addRequestHeader(String,String)
- * @see #getRequestHeader(String)
- * @see #removeRequestHeader(String)
- */
- void addRequestHeader(Header header);
- /**
- * Gets the request header with the given name.
- * If there are multiple headers with the same name,
- * there values will be combined with the ',' separator as specified by RFC2616.
- * Note that header-name matching is case insensitive.
- * @param headerName the header name
- * @return the header
- */
- Header getRequestHeader(String headerName);
- /**
- * Removes all request headers with the given name.
- * Note that header-name matching is case insensitive.
- * @param headerName the header name
- */
- void removeRequestHeader(String headerName);
- /**
- * Removes the given request header.
- *
- * @param header the header
- *
- * @since 3.0
- */
- void removeRequestHeader(Header header);
- /**
- * Returns <tt>true</tt> if the HTTP method should automatically follow HTTP redirects
- * (status code 302, etc.), <tt>false</tt> otherwise.
- *
- * @return <tt>true</tt> if the method will automatically follow HTTP redirects,
- * <tt>false</tt> otherwise
- */
- boolean getFollowRedirects();
- /**
- * Sets whether or not the HTTP method should automatically follow HTTP redirects
- * (status code 302, etc.)
- *
- * @param followRedirects <tt>true</tt> if the method will automatically follow redirects,
- * <tt>false</tt> otherwise.
- */
- void setFollowRedirects(boolean followRedirects);
- /**
- * Sets the query string of the HTTP method.
- * It is responsibility of the caller to ensure that the path is
- * properly encoded (URL safe). The string must not include an initial '?' character.
- *
- * @param queryString the query to be used in the request, with no leading '?' character
- *
- * @see #getQueryString()
- * @see #setQueryString(NameValuePair[])
- */
- void setQueryString(String queryString);
- /**
- * Sets the query string of this HTTP method. The pairs are encoded as UTF-8 characters.
- * To use a different charset the parameters can be encoded manually using EncodingUtil
- * and set as a single String.
- *
- * @param params An array of <code>NameValuePair</code>s to use as the query string.
- * The name/value pairs will be automatically URL encoded and should not
- * have been encoded previously.
- *
- * @see #getQueryString()
- * @see #setQueryString(String)
- * @see org.apache.commons.httpclient.util.EncodingUtil#formUrlEncode(NameValuePair[], String)
- */
- void setQueryString(NameValuePair[] params);
- /**
- * Returns the query string of this HTTP method.
- *
- * @return the query string in URL encoded form, without a leading '?'.
- *
- * @see #setQueryString(NameValuePair[])
- * @see #setQueryString(String)
- */
- String getQueryString();
- /**
- * Returns the current request headers for this HTTP method. The returned headers
- * will be in the same order that they were added with <code>addRequestHeader</code>.
- * If there are multiple request headers with the same name (e.g. <code>Cookie</code>),
- * they will be returned as multiple entries in the array.
- *
- * @return an array containing all of the request headers
- *
- * @see #addRequestHeader(Header)
- * @see #addRequestHeader(String,String)
- */
- Header[] getRequestHeaders();
- /**
- * Returns the request headers with the given name. Note that header-name matching is
- * case insensitive.
- * @param headerName the name of the headers to be returned.
- * @return an array of zero or more headers
- *
- * @since 3.0
- */
- Header[] getRequestHeaders(String headerName);
- // ---------------------------------------------------------------- Queries
- /**
- * Returns <tt>true</tt> the method is ready to execute, <tt>false</tt> otherwise.
- *
- * @return <tt>true</tt> if the method is ready to execute, <tt>false</tt> otherwise.
- */
- boolean validate();
- /**
- * Returns the status code associated with the latest response.
- *
- * @return The status code from the most recent execution of this method.
- * If the method has not yet been executed, the result is undefined.
- */
- int getStatusCode();
- /**
- * Returns the status text (or "reason phrase") associated with the latest
- * response.
- *
- * @return The status text from the most recent execution of this method.
- * If the method has not yet been executed, the result is undefined.
- */
- String getStatusText();
- /**
- * Returns the response headers from the most recent execution of this request.
- *
- * @return A newly-created array containing all of the response headers,
- * in the order in which they appeared in the response.
- */
- Header[] getResponseHeaders();
- /**
- * Returns the specified response header. Note that header-name matching is
- * case insensitive.
- *
- * @param headerName The name of the header to be returned.
- *
- * @return The specified response header. If the repsonse contained multiple
- * instances of the header, its values will be combined using the ','
- * separator as specified by RFC2616.
- */
- Header getResponseHeader(String headerName);
- /**
- * Returns the response headers with the given name. Note that header-name matching is
- * case insensitive.
- * @param headerName the name of the headers to be returned.
- * @return an array of zero or more headers
- *
- * @since 3.0
- */
- Header[] getResponseHeaders(String headerName);
- /**
- * Returns the response footers from the most recent execution of this request.
- *
- * @return an array containing the response footers in the order that they
- * appeared in the response. If the response had no footers,
- * an empty array will be returned.
- */
- Header[] getResponseFooters();
- /**
- * Return the specified response footer. Note that footer-name matching is
- * case insensitive.
- *
- * @param footerName The name of the footer.
- * @return The response footer.
- */
- Header getResponseFooter(String footerName);
- /**
- * Returns the response body of the HTTP method, if any, as an array of bytes.
- * If the method has not yet been executed or the response has no body, <code>null</code>
- * is returned. Note that this method does not propagate I/O exceptions.
- * If an error occurs while reading the body, <code>null</code> will be returned.
- *
- * @return The response body, or <code>null</code> if the
- * body is not available.
- *
- * @throws IOException if an I/O (transport) problem occurs
- */
- byte[] getResponseBody() throws IOException;
- /**
- * Returns the response body of the HTTP method, if any, as a {@link String}.
- * If response body is not available or cannot be read, <tt>null</tt> is returned.
- * The raw bytes in the body are converted to a <code>String</code> using the
- * character encoding specified in the response's <tt>Content-Type</tt> header, or
- * ISO-8859-1 if the response did not specify a character set.
- * <p>
- * Note that this method does not propagate I/O exceptions.
- * If an error occurs while reading the body, <code>null</code> will be returned.
- *
- * @return The response body converted to a <code>String</code>, or <code>null</code>
- * if the body is not available.
- *
- * @throws IOException if an I/O (transport) problem occurs
- */
- String getResponseBodyAsString() throws IOException;
- /**
- * Returns the response body of the HTTP method, if any, as an InputStream.
- * If the response had no body or the method has not yet been executed,
- * <code>null</code> is returned. Additionally, <code>null</code> may be returned
- * if {@link #releaseConnection} has been called or
- * if this method was called previously and the resulting stream was closed.
- *
- * @return The response body, or <code>null</code> if it is not available
- *
- * @throws IOException if an I/O (transport) problem occurs
- */
- InputStream getResponseBodyAsStream() throws IOException;
- /**
- * Returns <tt>true</tt> if the HTTP method has been already {@link #execute executed},
- * but not {@link #recycle recycled}.
- *
- * @return <tt>true</tt> if the method has been executed, <tt>false</tt> otherwise
- */
- boolean hasBeenUsed();
- // --------------------------------------------------------- Action Methods
- /**
- * Executes this method using the specified <code>HttpConnection</code> and
- * <code>HttpState</code>.
- *
- * @param state the {@link HttpState state} information to associate with this method
- * @param connection the {@link HttpConnection connection} used to execute
- * this HTTP method
- *
- * @throws IOException If an I/O (transport) error occurs. Some transport exceptions
- * can be recovered from.
- * @throws HttpException If a protocol exception occurs. Usually protocol exceptions
- * cannot be recovered from.
- *
- * @return the integer status code if one was obtained, or <tt>-1</tt>
- */
- int execute(HttpState state, HttpConnection connection)
- throws HttpException, IOException;
- /**
- * Aborts the execution of the HTTP method.
- *
- * @see #execute(HttpState, HttpConnection)
- *
- * @since 3.0
- */
- void abort();
- /**
- * Recycles the HTTP method so that it can be used again.
- * Note that all of the instance variables will be reset
- * once this method has been called. This method will also
- * release the connection being used by this HTTP method.
- *
- * @see #releaseConnection()
- *
- * @deprecated no longer supported and will be removed in the future
- * version of HttpClient
- */
- void recycle();
- /**
- * Releases the connection being used by this HTTP method. In particular the
- * connection is used to read the response (if there is one) and will be held
- * until the response has been read. If the connection can be reused by other
- * HTTP methods it is NOT closed at this point.
- * <p>
- * After this method is called, {@link #getResponseBodyAsStream} will return
- * <code>null</code>, and {@link #getResponseBody} and {@link #getResponseBodyAsString}
- * <em>may</em> return <code>null</code>.
- */
- void releaseConnection();
- /**
- * Add a footer to this method's response.
- * <p>
- * <b>Note:</b> This method is for
- * internal use only and should not be called by external clients.
- *
- * @param footer the footer to add
- *
- * @since 2.0
- */
- void addResponseFooter(Header footer);
- /**
- * Returns the Status-Line from the most recent response for this method,
- * or <code>null</code> if the method has not been executed.
- *
- * @return the status line, or <code>null</code> if the method has not been executed
- *
- * @since 2.0
- */
- StatusLine getStatusLine();
- /**
- * Returns <tt>true</tt> if the HTTP method should automatically handle HTTP
- * authentication challenges (status code 401, etc.), <tt>false</tt> otherwise
- *
- * @return <tt>true</tt> if authentication challenges will be processed
- * automatically, <tt>false</tt> otherwise.
- *
- * @since 2.0
- *
- * @see #setDoAuthentication(boolean)
- */
- boolean getDoAuthentication();
- /**
- * Sets whether or not the HTTP method should automatically handle HTTP
- * authentication challenges (status code 401, etc.)
- *
- * @param doAuthentication <tt>true</tt> to process authentication challenges
- * automatically, <tt>false</tt> otherwise.
- *
- * @since 2.0
- *
- * @see #getDoAuthentication()
- */
- void setDoAuthentication(boolean doAuthentication);
- /**
- * Returns {@link HttpMethodParams HTTP protocol parameters} associated with this method.
- *
- * @since 3.0
- *
- * @see HttpMethodParams
- */
- public HttpMethodParams getParams();
- /**
- * Assigns {@link HttpMethodParams HTTP protocol parameters} for this method.
- *
- * @since 3.0
- *
- * @see HttpMethodParams
- */
- public void setParams(final HttpMethodParams params);
- /**
- * Returns the target host {@link AuthState authentication state}
- *
- * @return host authentication state
- *
- * @since 3.0
- */
- public AuthState getHostAuthState();
- /**
- * Returns the proxy {@link AuthState authentication state}
- *
- * @return host authentication state
- *
- * @since 3.0
- */
- public AuthState getProxyAuthState();
- /**
- * Returns <tt>true</tt> if the HTTP has been transmitted to the target
- * server in its entirety, <tt>false</tt> otherwise. This flag can be useful
- * for recovery logic. If the request has not been transmitted in its entirety,
- * it is safe to retry the failed method.
- *
- * @return <tt>true</tt> if the request has been sent, <tt>false</tt> otherwise
- */
- boolean isRequestSent();
- }