~ubuntu-branches/ubuntu/lucid/commons-httpclient/lucid

« back to all changes in this revision

Viewing changes to src/java/org/apache/commons/httpclient/HttpMethod.java

  • Committer: Bazaar Package Importer
  • Author(s): Barry Hawkins
  • Date: 2005-11-25 13:12:23 UTC
  • Revision ID: james.westby@ubuntu.com-20051125131223-2g7eyo21pqgrohpo
Tags: upstream-2.0.2
ImportĀ upstreamĀ versionĀ 2.0.2

Show diffs side-by-side

added added

removed removed

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