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