1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 package org.apache.commons.httpclient.methods;
33
34 import org.apache.commons.httpclient.Header;
35 import org.apache.commons.httpclient.HttpConnection;
36 import org.apache.commons.httpclient.HttpMethodBase;
37 import org.apache.commons.httpclient.HttpState;
38
39 import org.apache.commons.logging.LogFactory;
40 import org.apache.commons.logging.Log;
41 import java.util.Enumeration;
42 import java.util.StringTokenizer;
43 import java.util.Vector;
44
45
46 /***
47 * Implements the HTTP OPTIONS method.
48 * <p>
49 * The HTTP OPTIONS method is defined in section 9.2 of
50 * <a href="http://www.ietf.org/rfc/rfc2616.txt">RFC2616</a>:
51 * <blockquote>
52 * The OPTIONS method represents a request for information about the
53 * communication options available on the request/response chain
54 * identified by the Request-URI. This method allows the client to
55 * determine the options and/or requirements associated with a resource,
56 * or the capabilities of a server, without implying a resource action
57 * or initiating a resource retrieval.
58 * </blockquote>
59 * </p>
60 *
61 * @author <a href="mailto:remm@apache.org">Remy Maucherat</a>
62 * @author <a href="mailto:mbowler@GargoyleSoftware.com">Mike Bowler</a>
63 * @author <a href="mailto:jsdever@apache.org">Jeff Dever</a>
64 *
65 * @version $Revision: 1.12.2.2 $
66 * @since 1.0
67 */
68 public class OptionsMethod
69 extends HttpMethodBase {
70
71
72
73
74 /*** Log object for this class. */
75 private static final Log LOG = LogFactory.getLog(OptionsMethod.class);
76
77
78
79
80 /***
81 * Method constructor.
82 *
83 * @since 1.0
84 */
85 public OptionsMethod() {
86 }
87
88
89 /***
90 * Constructor specifying a URI.
91 *
92 * @param uri either an absolute or relative URI
93 *
94 * @since 1.0
95 */
96 public OptionsMethod(String uri) {
97 super(uri);
98 }
99
100
101
102
103
104 /***
105 * Methods allowed.
106 */
107 private Vector methodsAllowed = new Vector();
108
109
110
111
112 /***
113 * Get the name.
114 * @return "OPTIONS"
115 * @since 2.0
116 */
117 public String getName() {
118 return "OPTIONS";
119 }
120
121
122 /***
123 * Is the specified method allowed ?
124 *
125 * @param method The method to check.
126 * @return true if the specified method is allowed.
127 * @since 1.0
128 */
129 public boolean isAllowed(String method) {
130 checkUsed();
131 return methodsAllowed.contains(method);
132 }
133
134
135 /***
136 * Get a list of allowed methods.
137 * @return An enumeration of all the allowed methods.
138 *
139 * @since 1.0
140 */
141 public Enumeration getAllowedMethods() {
142 checkUsed();
143 return methodsAllowed.elements();
144 }
145
146
147
148
149 /***
150 * <p>
151 * This implementation will parse the <tt>Allow</tt> header to obtain
152 * the set of methods supported by the resource identified by the Request-URI.
153 * </p>
154 *
155 * @param state the {@link HttpState state} information associated with this method
156 * @param conn the {@link HttpConnection connection} used to execute
157 * this HTTP method
158 *
159 * @see #readResponse
160 * @see #readResponseHeaders
161 * @since 2.0
162 */
163 protected void processResponseHeaders(HttpState state, HttpConnection conn) {
164 LOG.trace("enter OptionsMethod.processResponseHeaders(HttpState, HttpConnection)");
165
166 Header allowHeader = getResponseHeader("allow");
167 if (allowHeader != null) {
168 String allowHeaderValue = allowHeader.getValue();
169 StringTokenizer tokenizer =
170 new StringTokenizer(allowHeaderValue, ",");
171 while (tokenizer.hasMoreElements()) {
172 String methodAllowed =
173 tokenizer.nextToken().trim().toUpperCase();
174 methodsAllowed.addElement(methodAllowed);
175 }
176 }
177 }
178
179 /***
180 * Return true if the method needs a content-length header in the request.
181 *
182 * @return true if a content-length header will be expected by the server
183 *
184 * @since 1.0
185 */
186 public boolean needContentLength() {
187 return false;
188 }
189
190
191 }