View Javadoc

1   // ========================================================================
2   // Copyright (c) 2004-2009 Mort Bay Consulting Pty. Ltd.
3   // ------------------------------------------------------------------------
4   // All rights reserved. This program and the accompanying materials
5   // are made available under the terms of the Eclipse Public License v1.0
6   // and Apache License v2.0 which accompanies this distribution.
7   // The Eclipse Public License is available at 
8   // http://www.eclipse.org/legal/epl-v10.html
9   // The Apache License v2.0 is available at
10  // http://www.opensource.org/licenses/apache2.0.php
11  // You may elect to redistribute this code under either of these licenses. 
12  // ========================================================================
13  
14  package org.eclipse.jetty.http;
15  
16  import org.eclipse.jetty.util.TypeUtil;
17  
18  /**
19   * <p>
20   * HttpStatusCode enum class, for status codes based on various HTTP RFCs. (see
21   * table below)
22   * </p>
23   * 
24   * <table border="1" cellpadding="5">
25   * <tr>
26   * <th>Enum</th>
27   * <th>Code</th>
28   * <th>Message</th>
29   * <th>
30   * <a href="http://tools.ietf.org/html/rfc1945">RFC 1945 - HTTP/1.0</a></th>
31   * <th>
32   * <a href="http://tools.ietf.org/html/rfc2616">RFC 2616 - HTTP/1.1</a></th>
33   * <th>
34   * <a href="http://tools.ietf.org/html/rfc2518">RFC 2518 - WEBDAV</a></th>
35   * </tr>
36   * 
37   * <tr>
38   * <td><strong><code>Informational - 1xx</code></strong></td>
39   * <td colspan="5">{@link #isInformational(int)}</td>
40   * </tr>
41   * 
42   * <tr>
43   * <td>{@link #CONTINUE}</td>
44   * <td>100</td>
45   * <td>Continue</td>
46   * <td>&nbsp;</td>
47   * <td>
48   * <a href="http://tools.ietf.org/html/rfc2616#section-10.1.1">Sec. 10.1.1</a></td>
49   * <td>&nbsp;</td>
50   * </tr>
51   * <tr>
52   * <td>{@link #SWITCHING_PROTOCOLS}</td>
53   * <td>101</td>
54   * <td>Switching Protocols</td>
55   * <td>&nbsp;</td>
56   * <td>
57   * <a href="http://tools.ietf.org/html/rfc2616#section-10.1.2">Sec. 10.1.2</a></td>
58   * <td>&nbsp;</td>
59   * </tr>
60   * <tr>
61   * <td>{@link #PROCESSING}</td>
62   * <td>102</td>
63   * <td>Processing</td>
64   * <td>&nbsp;</td>
65   * <td>&nbsp;</td>
66   * <td>
67   * <a href="http://tools.ietf.org/html/rfc2518#section-10.1">Sec. 10.1</a></td>
68   * </tr>
69   * 
70   * <tr>
71   * <td><strong><code>Success - 2xx</code></strong></td>
72   * <td colspan="5">{@link #isSuccess(int)}</td>
73   * </tr>
74   * 
75   * <tr>
76   * <td>{@link #OK}</td>
77   * <td>200</td>
78   * <td>OK</td>
79   * <td>
80   * <a href="http://tools.ietf.org/html/rfc1945#section-9.2">Sec. 9.2</a></td>
81   * <td>
82   * <a href="http://tools.ietf.org/html/rfc2616#section-10.2.1">Sec. 10.2.1</a></td>
83   * <td>&nbsp;</td>
84   * </tr>
85   * <tr>
86   * <td>{@link #CREATED}</td>
87   * <td>201</td>
88   * <td>Created</td>
89   * <td>
90   * <a href="http://tools.ietf.org/html/rfc1945#section-9.2">Sec. 9.2</a></td>
91   * <td>
92   * <a href="http://tools.ietf.org/html/rfc2616#section-10.2.2">Sec. 10.2.2</a></td>
93   * <td>&nbsp;</td>
94   * </tr>
95   * <tr>
96   * <td>{@link #ACCEPTED}</td>
97   * <td>202</td>
98   * <td>Accepted</td>
99   * <td>
100  * <a href="http://tools.ietf.org/html/rfc1945#section-9.2">Sec. 9.2</a></td>
101  * <td>
102  * <a href="http://tools.ietf.org/html/rfc2616#section-10.2.3">Sec. 10.2.3</a></td>
103  * <td>&nbsp;</td>
104  * </tr>
105  * <tr>
106  * <td>{@link #NON_AUTHORITATIVE_INFORMATION}</td>
107  * <td>203</td>
108  * <td>Non Authoritative Information</td>
109  * <td>&nbsp;</td>
110  * <td>
111  * <a href="http://tools.ietf.org/html/rfc2616#section-10.2.4">Sec. 10.2.4</a></td>
112  * <td>&nbsp;</td>
113  * </tr>
114  * <tr>
115  * <td>{@link #NO_CONTENT}</td>
116  * <td>204</td>
117  * <td>No Content</td>
118  * <td>
119  * <a href="http://tools.ietf.org/html/rfc1945#section-9.2">Sec. 9.2</a></td>
120  * <td>
121  * <a href="http://tools.ietf.org/html/rfc2616#section-10.2.5">Sec. 10.2.5</a></td>
122  * <td>&nbsp;</td>
123  * </tr>
124  * <tr>
125  * <td>{@link #RESET_CONTENT}</td>
126  * <td>205</td>
127  * <td>Reset Content</td>
128  * <td>&nbsp;</td>
129  * <td>
130  * <a href="http://tools.ietf.org/html/rfc2616#section-10.2.6">Sec. 10.2.6</a></td>
131  * <td>&nbsp;</td>
132  * </tr>
133  * <tr>
134  * <td>{@link #PARTIAL_CONTENT}</td>
135  * <td>206</td>
136  * <td>Partial Content</td>
137  * <td>&nbsp;</td>
138  * <td>
139  * <a href="http://tools.ietf.org/html/rfc2616#section-10.2.7">Sec. 10.2.7</a></td>
140  * <td>&nbsp;</td>
141  * </tr>
142  * <tr>
143  * <td>{@link #MULTI_STATUS}</td>
144  * <td>207</td>
145  * <td>Multi-Status</td>
146  * <td>&nbsp;</td>
147  * <td>&nbsp;</td>
148  * <td>
149  * <a href="http://tools.ietf.org/html/rfc2518#section-10.2">Sec. 10.2</a></td>
150  * </tr>
151  * <tr>
152  * <td>&nbsp;</td>
153  * <td><strike>207</strike></td>
154  * <td><strike>Partial Update OK</strike></td>
155  * <td>&nbsp;</td>
156  * <td>
157  * <a href=
158  * "http://www.w3.org/Protocols/HTTP/1.1/draft-ietf-http-v11-spec-rev-01.txt"
159  * >draft/01</a></td>
160  * <td>&nbsp;</td>
161  * </tr>
162  * 
163  * <tr>
164  * <td><strong><code>Redirection - 3xx</code></strong></td>
165  * <td colspan="5">{@link #isRedirection(int)}</td>
166  * </tr>
167  * 
168  * <tr>
169  * <td>{@link #MULTIPLE_CHOICES}</td>
170  * <td>300</td>
171  * <td>Multiple Choices</td>
172  * <td>
173  * <a href="http://tools.ietf.org/html/rfc1945#section-9.3">Sec. 9.3</a></td>
174  * <td>
175  * <a href="http://tools.ietf.org/html/rfc2616#section-10.3.1">Sec. 10.3.1</a></td>
176  * <td>&nbsp;</td>
177  * </tr>
178  * <tr>
179  * <td>{@link #MOVED_PERMANENTLY}</td>
180  * <td>301</td>
181  * <td>Moved Permanently</td>
182  * <td>
183  * <a href="http://tools.ietf.org/html/rfc1945#section-9.3">Sec. 9.3</a></td>
184  * <td>
185  * <a href="http://tools.ietf.org/html/rfc2616#section-10.3.2">Sec. 10.3.2</a></td>
186  * <td>&nbsp;</td>
187  * </tr>
188  * <tr>
189  * <td>{@link #MOVED_TEMPORARILY}</td>
190  * <td>302</td>
191  * <td>Moved Temporarily</td>
192  * <td>
193  * <a href="http://tools.ietf.org/html/rfc1945#section-9.3">Sec. 9.3</a></td>
194  * <td>(now "<code>302 Found</code>")</td>
195  * <td>&nbsp;</td>
196  * </tr>
197  * <tr>
198  * <td>{@link #FOUND}</td>
199  * <td>302</td>
200  * <td>Found</td>
201  * <td>(was "<code>302 Moved Temporarily</code>")</td>
202  * <td>
203  * <a href="http://tools.ietf.org/html/rfc2616#section-10.3.3">Sec. 10.3.3</a></td>
204  * <td>&nbsp;</td>
205  * </tr>
206  * <tr>
207  * <td>{@link #SEE_OTHER}</td>
208  * <td>303</td>
209  * <td>See Other</td>
210  * <td>&nbsp;</td>
211  * <td>
212  * <a href="http://tools.ietf.org/html/rfc2616#section-10.3.4">Sec. 10.3.4</a></td>
213  * <td>&nbsp;</td>
214  * </tr>
215  * <tr>
216  * <td>{@link #NOT_MODIFIED}</td>
217  * <td>304</td>
218  * <td>Not Modified</td>
219  * <td>
220  * <a href="http://tools.ietf.org/html/rfc1945#section-9.3">Sec. 9.3</a></td>
221  * <td>
222  * <a href="http://tools.ietf.org/html/rfc2616#section-10.3.5">Sec. 10.3.5</a></td>
223  * <td>&nbsp;</td>
224  * </tr>
225  * <tr>
226  * <td>{@link #USE_PROXY}</td>
227  * <td>305</td>
228  * <td>Use Proxy</td>
229  * <td>&nbsp;</td>
230  * <td>
231  * <a href="http://tools.ietf.org/html/rfc2616#section-10.3.6">Sec. 10.3.6</a></td>
232  * <td>&nbsp;</td>
233  * </tr>
234  * <tr>
235  * <td>&nbsp;</td>
236  * <td>306</td>
237  * <td><em>(Unused)</em></td>
238  * <td>&nbsp;</td>
239  * <td>
240  * <a href="http://tools.ietf.org/html/rfc2616#section-10.3.7">Sec. 10.3.7</a></td>
241  * <td>&nbsp;</td>
242  * </tr>
243  * <tr>
244  * <td>{@link #TEMPORARY_REDIRECT}</td>
245  * <td>307</td>
246  * <td>Temporary Redirect</td>
247  * <td>&nbsp;</td>
248  * <td>
249  * <a href="http://tools.ietf.org/html/rfc2616#section-10.3.8">Sec. 10.3.8</a></td>
250  * <td>&nbsp;</td>
251  * </tr>
252  * 
253  * <tr>
254  * <td><strong><code>Client Error - 4xx</code></strong></td>
255  * <td colspan="5">{@link #isClientError(int)}</td>
256  * </tr>
257  * 
258  * <tr>
259  * <td>{@link #BAD_REQUEST}</td>
260  * <td>400</td>
261  * <td>Bad Request</td>
262  * <td>
263  * <a href="http://tools.ietf.org/html/rfc1945#section-9.4">Sec. 9.4</a></td>
264  * <td>
265  * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.1">Sec. 10.4.1</a></td>
266  * <td>&nbsp;</td>
267  * </tr>
268  * <tr>
269  * <td>{@link #UNAUTHORIZED}</td>
270  * <td>401</td>
271  * <td>Unauthorized</td>
272  * <td>
273  * <a href="http://tools.ietf.org/html/rfc1945#section-9.4">Sec. 9.4</a></td>
274  * <td>
275  * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.2">Sec. 10.4.2</a></td>
276  * <td>&nbsp;</td>
277  * </tr>
278  * <tr>
279  * <td>{@link #PAYMENT_REQUIRED}</td>
280  * <td>402</td>
281  * <td>Payment Required</td>
282  * <td>
283  * <a href="http://tools.ietf.org/html/rfc1945#section-9.4">Sec. 9.4</a></td>
284  * <td>
285  * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.3">Sec. 10.4.3</a></td>
286  * <td>&nbsp;</td>
287  * </tr>
288  * <tr>
289  * <td>{@link #FORBIDDEN}</td>
290  * <td>403</td>
291  * <td>Forbidden</td>
292  * <td>
293  * <a href="http://tools.ietf.org/html/rfc1945#section-9.4">Sec. 9.4</a></td>
294  * <td>
295  * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.4">Sec. 10.4.4</a></td>
296  * <td>&nbsp;</td>
297  * </tr>
298  * <tr>
299  * <td>{@link #NOT_FOUND}</td>
300  * <td>404</td>
301  * <td>Not Found</td>
302  * <td>
303  * <a href="http://tools.ietf.org/html/rfc1945#section-9.4">Sec. 9.4</a></td>
304  * <td>
305  * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.5">Sec. 10.4.5</a></td>
306  * <td>&nbsp;</td>
307  * </tr>
308  * <tr>
309  * <td>{@link #METHOD_NOT_ALLOWED}</td>
310  * <td>405</td>
311  * <td>Method Not Allowed</td>
312  * <td>&nbsp;</td>
313  * <td>
314  * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.6">Sec. 10.4.6</a></td>
315  * <td>&nbsp;</td>
316  * </tr>
317  * <tr>
318  * <td>{@link #NOT_ACCEPTABLE}</td>
319  * <td>406</td>
320  * <td>Not Acceptable</td>
321  * <td>&nbsp;</td>
322  * <td>
323  * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.7">Sec. 10.4.7</a></td>
324  * <td>&nbsp;</td>
325  * </tr>
326  * <tr>
327  * <td>{@link #PROXY_AUTHENTICATION_REQUIRED}</td>
328  * <td>407</td>
329  * <td>Proxy Authentication Required</td>
330  * <td>&nbsp;</td>
331  * <td>
332  * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.8">Sec. 10.4.8</a></td>
333  * <td>&nbsp;</td>
334  * </tr>
335  * <tr>
336  * <td>{@link #REQUEST_TIMEOUT}</td>
337  * <td>408</td>
338  * <td>Request Timeout</td>
339  * <td>&nbsp;</td>
340  * <td>
341  * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.9">Sec. 10.4.9</a></td>
342  * <td>&nbsp;</td>
343  * </tr>
344  * <tr>
345  * <td>{@link #CONFLICT}</td>
346  * <td>409</td>
347  * <td>Conflict</td>
348  * <td>&nbsp;</td>
349  * <td>
350  * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.10">Sec. 10.4.10</a>
351  * </td>
352  * <td>&nbsp;</td>
353  * </tr>
354  * <tr>
355  * <td>{@link #GONE}</td>
356  * <td>410</td>
357  * <td>Gone</td>
358  * <td>&nbsp;</td>
359  * <td>
360  * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.11">Sec. 10.4.11</a>
361  * </td>
362  * <td>&nbsp;</td>
363  * </tr>
364  * <tr>
365  * <td>{@link #LENGTH_REQUIRED}</td>
366  * <td>411</td>
367  * <td>Length Required</td>
368  * <td>&nbsp;</td>
369  * <td>
370  * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.12">Sec. 10.4.12</a>
371  * </td>
372  * <td>&nbsp;</td>
373  * </tr>
374  * <tr>
375  * <td>{@link #PRECONDITION_FAILED}</td>
376  * <td>412</td>
377  * <td>Precondition Failed</td>
378  * <td>&nbsp;</td>
379  * <td>
380  * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.13">Sec. 10.4.13</a>
381  * </td>
382  * <td>&nbsp;</td>
383  * </tr>
384  * <tr>
385  * <td>{@link #REQUEST_ENTITY_TOO_LARGE}</td>
386  * <td>413</td>
387  * <td>Request Entity Too Large</td>
388  * <td>&nbsp;</td>
389  * <td>
390  * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.14">Sec. 10.4.14</a>
391  * </td>
392  * <td>&nbsp;</td>
393  * </tr>
394  * <tr>
395  * <td>{@link #REQUEST_URI_TOO_LONG}</td>
396  * <td>414</td>
397  * <td>Request-URI Too Long</td>
398  * <td>&nbsp;</td>
399  * <td>
400  * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.15">Sec. 10.4.15</a>
401  * </td>
402  * <td>&nbsp;</td>
403  * </tr>
404  * <tr>
405  * <td>{@link #UNSUPPORTED_MEDIA_TYPE}</td>
406  * <td>415</td>
407  * <td>Unsupported Media Type</td>
408  * <td>&nbsp;</td>
409  * <td>
410  * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.16">Sec. 10.4.16</a>
411  * </td>
412  * <td>&nbsp;</td>
413  * </tr>
414  * <tr>
415  * <td>{@link #REQUESTED_RANGE_NOT_SATISFIABLE}</td>
416  * <td>416</td>
417  * <td>Requested Range Not Satisfiable</td>
418  * <td>&nbsp;</td>
419  * <td>
420  * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.17">Sec. 10.4.17</a>
421  * </td>
422  * <td>&nbsp;</td>
423  * </tr>
424  * <tr>
425  * <td>{@link #EXPECTATION_FAILED}</td>
426  * <td>417</td>
427  * <td>Expectation Failed</td>
428  * <td>&nbsp;</td>
429  * <td>
430  * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.18">Sec. 10.4.18</a>
431  * </td>
432  * <td>&nbsp;</td>
433  * </tr>
434  * <tr>
435  * <td>&nbsp;</td>
436  * <td><strike>418</strike></td>
437  * <td><strike>Reauthentication Required</strike></td>
438  * <td>&nbsp;</td>
439  * <td>
440  * <a href=
441  * "http://tools.ietf.org/html/draft-ietf-http-v11-spec-rev-01#section-10.4.19"
442  * >draft/01</a></td>
443  * <td>&nbsp;</td>
444  * </tr>
445  * <tr>
446  * <td>&nbsp;</td>
447  * <td><strike>418</strike></td>
448  * <td><strike>Unprocessable Entity</strike></td>
449  * <td>&nbsp;</td>
450  * <td>&nbsp;</td>
451  * <td>
452  * <a href=
453  * "http://tools.ietf.org/html/draft-ietf-webdav-protocol-05#section-10.3"
454  * >draft/05</a></td>
455  * </tr>
456  * <tr>
457  * <td>&nbsp;</td>
458  * <td><strike>419</strike></td>
459  * <td><strike>Proxy Reauthentication Required</stike></td>
460  * <td>&nbsp;</td>
461  * <td>
462  * <a href=
463  * "http://tools.ietf.org/html/draft-ietf-http-v11-spec-rev-01#section-10.4.20"
464  * >draft/01</a></td>
465  * <td>&nbsp;</td>
466  * </tr>
467  * <tr>
468  * <td>&nbsp;</td>
469  * <td><strike>419</strike></td>
470  * <td><strike>Insufficient Space on Resource</stike></td>
471  * <td>&nbsp;</td>
472  * <td>&nbsp;</td>
473  * <td>
474  * <a href=
475  * "http://tools.ietf.org/html/draft-ietf-webdav-protocol-05#section-10.4"
476  * >draft/05</a></td>
477  * </tr>
478  * <tr>
479  * <td>&nbsp;</td>
480  * <td><strike>420</strike></td>
481  * <td><strike>Method Failure</strike></td>
482  * <td>&nbsp;</td>
483  * <td>&nbsp;</td>
484  * <td>
485  * <a href=
486  * "http://tools.ietf.org/html/draft-ietf-webdav-protocol-05#section-10.5"
487  * >draft/05</a></td>
488  * </tr>
489  * <tr>
490  * <td>&nbsp;</td>
491  * <td>421</td>
492  * <td><em>(Unused)</em></td>
493  * <td>&nbsp;</td>
494  * <td>&nbsp;</td>
495  * <td>&nbsp;</td>
496  * </tr>
497  * <tr>
498  * <td>{@link #UNPROCESSABLE_ENTITY}</td>
499  * <td>422</td>
500  * <td>Unprocessable Entity</td>
501  * <td>&nbsp;</td>
502  * <td>&nbsp;</td>
503  * <td>
504  * <a href="http://tools.ietf.org/html/rfc2518#section-10.3">Sec. 10.3</a></td>
505  * </tr>
506  * <tr>
507  * <td>{@link #LOCKED}</td>
508  * <td>423</td>
509  * <td>Locked</td>
510  * <td>&nbsp;</td>
511  * <td>&nbsp;</td>
512  * <td>
513  * <a href="http://tools.ietf.org/html/rfc2518#section-10.4">Sec. 10.4</a></td>
514  * </tr>
515  * <tr>
516  * <td>{@link #FAILED_DEPENDENCY}</td>
517  * <td>424</td>
518  * <td>Failed Dependency</td>
519  * <td>&nbsp;</td>
520  * <td>&nbsp;</td>
521  * <td>
522  * <a href="http://tools.ietf.org/html/rfc2518#section-10.5">Sec. 10.5</a></td>
523  * </tr>
524  * 
525  * <tr>
526  * <td><strong><code>Server Error - 5xx</code></strong></td>
527  * <td colspan="5">{@link #isServerError(int)}</td>
528  * </tr>
529  * 
530  * <tr>
531  * <td>{@link #INTERNAL_SERVER_ERROR}</td>
532  * <td>500</td>
533  * <td>Internal Server Error</td>
534  * <td>
535  * <a href="http://tools.ietf.org/html/rfc1945#section-9.5">Sec. 9.5</a></td>
536  * <td>
537  * <a href="http://tools.ietf.org/html/rfc2616#section-10.5.1">Sec. 10.5.1</a></td>
538  * <td>&nbsp;</td>
539  * </tr>
540  * <tr>
541  * <td>{@link #NOT_IMPLEMENTED}</td>
542  * <td>501</td>
543  * <td>Not Implemented</td>
544  * <td>
545  * <a href="http://tools.ietf.org/html/rfc1945#section-9.5">Sec. 9.5</a></td>
546  * <td>
547  * <a href="http://tools.ietf.org/html/rfc2616#section-10.5.2">Sec. 10.5.2</a></td>
548  * <td>&nbsp;</td>
549  * </tr>
550  * <tr>
551  * <td>{@link #BAD_GATEWAY}</td>
552  * <td>502</td>
553  * <td>Bad Gateway</td>
554  * <td>
555  * <a href="http://tools.ietf.org/html/rfc1945#section-9.5">Sec. 9.5</a></td>
556  * <td>
557  * <a href="http://tools.ietf.org/html/rfc2616#section-10.5.3">Sec. 10.5.3</a></td>
558  * <td>&nbsp;</td>
559  * </tr>
560  * <tr>
561  * <td>{@link #SERVICE_UNAVAILABLE}</td>
562  * <td>503</td>
563  * <td>Service Unavailable</td>
564  * <td>
565  * <a href="http://tools.ietf.org/html/rfc1945#section-9.5">Sec. 9.5</a></td>
566  * <td>
567  * <a href="http://tools.ietf.org/html/rfc2616#section-10.5.4">Sec. 10.5.4</a></td>
568  * <td>&nbsp;</td>
569  * </tr>
570  * <tr>
571  * <td>{@link #GATEWAY_TIMEOUT}</td>
572  * <td>504</td>
573  * <td>Gateway Timeout</td>
574  * <td>&nbsp;</td>
575  * <td>
576  * <a href="http://tools.ietf.org/html/rfc2616#section-10.5.5">Sec. 10.5.5</a></td>
577  * <td>&nbsp;</td>
578  * </tr>
579  * <tr>
580  * <td>{@link #HTTP_VERSION_NOT_SUPPORTED}</td>
581  * <td>505</td>
582  * <td>HTTP Version Not Supported</td>
583  * <td>&nbsp;</td>
584  * <td>
585  * <a href="http://tools.ietf.org/html/rfc2616#section-10.5.6">Sec. 10.5.6</a></td>
586  * <td>&nbsp;</td>
587  * </tr>
588  * <tr>
589  * <td>&nbsp;</td>
590  * <td>506</td>
591  * <td><em>(Unused)</em></td>
592  * <td>&nbsp;</td>
593  * <td>&nbsp;</td>
594  * <td>&nbsp;</td>
595  * </tr>
596  * <tr>
597  * <td>{@link #INSUFFICIENT_STORAGE}</td>
598  * <td>507</td>
599  * <td>Insufficient Storage</td>
600  * <td>&nbsp;</td>
601  * <td>&nbsp;</td>
602  * <td>
603  * <a href="http://tools.ietf.org/html/rfc2518#section-10.6">Sec. 10.6</a></td>
604  * </tr>
605  * 
606  * </table>
607  * 
608  * @version $Id$
609  */
610 public class HttpStatus
611 {
612     public final static int CONTINUE_100 = 100;
613     public final static int SWITCHING_PROTOCOLS_101 = 101;
614     public final static int PROCESSING_102 = 102;
615     
616     public final static int OK_200 = 200;
617     public final static int CREATED_201 = 201;
618     public final static int ACCEPTED_202 = 202;
619     public final static int NON_AUTHORITATIVE_INFORMATION_203 = 203;
620     public final static int NO_CONTENT_204 = 204;
621     public final static int RESET_CONTENT_205 = 205;
622     public final static int PARTIAL_CONTENT_206 = 206;
623     public final static int MULTI_STATUS_207 = 207;
624     
625     public final static int MULTIPLE_CHOICES_300 = 300;
626     public final static int MOVED_PERMANENTLY_301 = 301;
627     public final static int MOVED_TEMPORARILY_302 = 302;
628     public final static int FOUND_302 = 302;
629     public final static int SEE_OTHER_303 = 303;
630     public final static int NOT_MODIFIED_304 = 304;
631     public final static int USE_PROXY_305 = 305;
632     public final static int TEMPORARY_REDIRECT_307 = 307;
633     
634     public final static int BAD_REQUEST_400 = 400;
635     public final static int UNAUTHORIZED_401 = 401;
636     public final static int PAYMENT_REQUIRED_402 = 402;
637     public final static int FORBIDDEN_403 = 403;
638     public final static int NOT_FOUND_404 = 404;
639     public final static int METHOD_NOT_ALLOWED_405 = 405;
640     public final static int NOT_ACCEPTABLE_406 = 406;
641     public final static int PROXY_AUTHENTICATION_REQUIRED_407 = 407;
642     public final static int REQUEST_TIMEOUT_408 = 408;
643     public final static int CONFLICT_409 = 409;
644     public final static int GONE_410 = 410;
645     public final static int LENGTH_REQUIRED_411 = 411;
646     public final static int PRECONDITION_FAILED_412 = 412;
647     public final static int REQUEST_ENTITY_TOO_LARGE_413 = 413;
648     public final static int REQUEST_URI_TOO_LONG_414 = 414;
649     public final static int UNSUPPORTED_MEDIA_TYPE_415 = 415;
650     public final static int REQUESTED_RANGE_NOT_SATISFIABLE_416 = 416;
651     public final static int EXPECTATION_FAILED_417 = 417;
652     public final static int UNPROCESSABLE_ENTITY_422 = 422;
653     public final static int LOCKED_423 = 423;
654     public final static int FAILED_DEPENDENCY_424 = 424;
655     
656     public final static int INTERNAL_SERVER_ERROR_500 = 500;
657     public final static int NOT_IMPLEMENTED_501 = 501;
658     public final static int BAD_GATEWAY_502 = 502;
659     public final static int SERVICE_UNAVAILABLE_503 = 503;
660     public final static int GATEWAY_TIMEOUT_504 = 504;
661     public final static int HTTP_VERSION_NOT_SUPPORTED_505 = 505;
662     public final static int INSUFFICIENT_STORAGE_507 = 507;
663     
664     public static final int MAX_CODE = 507;
665     
666 
667     private static final Code[] codeMap = new Code[MAX_CODE+1];
668 
669     static
670     {
671         for (Code code : Code.values())
672         {
673             codeMap[code._code] = code;
674         }
675     }
676     
677 
678     public enum Code
679     {
680         /*
681          * --------------------------------------------------------------------
682          * Informational messages in 1xx series. As defined by ... RFC 1945 -
683          * HTTP/1.0 RFC 2616 - HTTP/1.1 RFC 2518 - WebDAV
684          */
685 
686         /** <code>100 Continue</code> */
687         CONTINUE(CONTINUE_100, "Continue"),
688         /** <code>101 Switching Protocols</code> */
689         SWITCHING_PROTOCOLS(SWITCHING_PROTOCOLS_101, "Switching Protocols"),
690         /** <code>102 Processing</code> */
691         PROCESSING(PROCESSING_102, "Processing"),
692 
693         /*
694          * --------------------------------------------------------------------
695          * Success messages in 2xx series. As defined by ... RFC 1945 - HTTP/1.0
696          * RFC 2616 - HTTP/1.1 RFC 2518 - WebDAV
697          */
698 
699         /** <code>200 OK</code> */
700         OK(OK_200, "OK"),
701         /** <code>201 Created</code> */
702         CREATED(CREATED_201, "Created"),
703         /** <code>202 Accepted</code> */
704         ACCEPTED(ACCEPTED_202, "Accepted"),
705         /** <code>203 Non Authoritative Information</code> */
706         NON_AUTHORITATIVE_INFORMATION(NON_AUTHORITATIVE_INFORMATION_203, "Non Authoritative Information"),
707         /** <code>204 No Content</code> */
708         NO_CONTENT(NO_CONTENT_204, "No Content"),
709         /** <code>205 Reset Content</code> */
710         RESET_CONTENT(RESET_CONTENT_205, "Reset Content"),
711         /** <code>206 Partial Content</code> */
712         PARTIAL_CONTENT(PARTIAL_CONTENT_206, "Partial Content"),
713         /** <code>207 Multi-Status</code> */
714         MULTI_STATUS(MULTI_STATUS_207, "Multi-Status"),
715 
716         /*
717          * --------------------------------------------------------------------
718          * Redirection messages in 3xx series. As defined by ... RFC 1945 -
719          * HTTP/1.0 RFC 2616 - HTTP/1.1
720          */
721 
722         /** <code>300 Mutliple Choices</code> */
723         MULTIPLE_CHOICES(MULTIPLE_CHOICES_300, "Multiple Choices"),
724         /** <code>301 Moved Permanently</code> */
725         MOVED_PERMANENTLY(MOVED_PERMANENTLY_301, "Moved Permanently"),
726         /** <code>302 Moved Temporarily</code> */
727         MOVED_TEMPORARILY(MOVED_TEMPORARILY_302, "Moved Temporarily"),
728         /** <code>302 Found</code> */
729         FOUND(FOUND_302, "Found"),
730         /** <code>303 See Other</code> */
731         SEE_OTHER(SEE_OTHER_303, "See Other"),
732         /** <code>304 Not Modified</code> */
733         NOT_MODIFIED(NOT_MODIFIED_304, "Not Modified"),
734         /** <code>305 Use Proxy</code> */
735         USE_PROXY(USE_PROXY_305, "Use Proxy"),
736         /** <code>307 Temporary Redirect</code> */
737         TEMPORARY_REDIRECT(TEMPORARY_REDIRECT_307, "Temporary Redirect"),
738 
739         /*
740          * --------------------------------------------------------------------
741          * Client Error messages in 4xx series. As defined by ... RFC 1945 -
742          * HTTP/1.0 RFC 2616 - HTTP/1.1 RFC 2518 - WebDAV
743          */
744 
745         /** <code>400 Bad Request</code> */
746         BAD_REQUEST(BAD_REQUEST_400, "Bad Request"),
747         /** <code>401 Unauthorized</code> */
748         UNAUTHORIZED(UNAUTHORIZED_401, "Unauthorized"),
749         /** <code>402 Payment Required</code> */
750         PAYMENT_REQUIRED(PAYMENT_REQUIRED_402, "Payment Required"),
751         /** <code>403 Forbidden</code> */
752         FORBIDDEN(FORBIDDEN_403, "Forbidden"),
753         /** <code>404 Not Found</code> */
754         NOT_FOUND(NOT_FOUND_404, "Not Found"),
755         /** <code>405 Method Not Allowed</code> */
756         METHOD_NOT_ALLOWED(METHOD_NOT_ALLOWED_405, "Method Not Allowed"),
757         /** <code>406 Not Acceptable</code> */
758         NOT_ACCEPTABLE(NOT_ACCEPTABLE_406, "Not Acceptable"),
759         /** <code>407 Proxy Authentication Required</code> */
760         PROXY_AUTHENTICATION_REQUIRED(PROXY_AUTHENTICATION_REQUIRED_407, "Proxy Authentication Required"),
761         /** <code>408 Request Timeout</code> */
762         REQUEST_TIMEOUT(REQUEST_TIMEOUT_408, "Request Timeout"),
763         /** <code>409 Conflict</code> */
764         CONFLICT(CONFLICT_409, "Conflict"),
765         /** <code>410 Gone</code> */
766         GONE(GONE_410, "Gone"),
767         /** <code>411 Length Required</code> */
768         LENGTH_REQUIRED(LENGTH_REQUIRED_411, "Length Required"),
769         /** <code>412 Precondition Failed</code> */
770         PRECONDITION_FAILED(PRECONDITION_FAILED_412, "Precondition Failed"),
771         /** <code>413 Request Entity Too Large</code> */
772         REQUEST_ENTITY_TOO_LARGE(REQUEST_ENTITY_TOO_LARGE_413, "Request Entity Too Large"),
773         /** <code>414 Request-URI Too Long</code> */
774         REQUEST_URI_TOO_LONG(REQUEST_URI_TOO_LONG_414, "Request-URI Too Long"),
775         /** <code>415 Unsupported Media Type</code> */
776         UNSUPPORTED_MEDIA_TYPE(UNSUPPORTED_MEDIA_TYPE_415, "Unsupported Media Type"),
777         /** <code>416 Requested Range Not Satisfiable</code> */
778         REQUESTED_RANGE_NOT_SATISFIABLE(REQUESTED_RANGE_NOT_SATISFIABLE_416, "Requested Range Not Satisfiable"),
779         /** <code>417 Expectation Failed</code> */
780         EXPECTATION_FAILED(EXPECTATION_FAILED_417, "Expectation Failed"),
781         /** <code>422 Unprocessable Entity</code> */
782         UNPROCESSABLE_ENTITY(UNPROCESSABLE_ENTITY_422, "Unprocessable Entity"),
783         /** <code>423 Locked</code> */
784         LOCKED(LOCKED_423, "Locked"),
785         /** <code>424 Failed Dependency</code> */
786         FAILED_DEPENDENCY(FAILED_DEPENDENCY_424, "Failed Dependency"),
787 
788         /*
789          * --------------------------------------------------------------------
790          * Server Error messages in 5xx series. As defined by ... RFC 1945 -
791          * HTTP/1.0 RFC 2616 - HTTP/1.1 RFC 2518 - WebDAV
792          */
793 
794         /** <code>500 Server Error</code> */
795         INTERNAL_SERVER_ERROR(INTERNAL_SERVER_ERROR_500, "Server Error"),
796         /** <code>501 Not Implemented</code> */
797         NOT_IMPLEMENTED(NOT_IMPLEMENTED_501, "Not Implemented"),
798         /** <code>502 Bad Gateway</code> */
799         BAD_GATEWAY(BAD_GATEWAY_502, "Bad Gateway"),
800         /** <code>503 Service Unavailable</code> */
801         SERVICE_UNAVAILABLE(SERVICE_UNAVAILABLE_503, "Service Unavailable"),
802         /** <code>504 Gateway Timeout</code> */
803         GATEWAY_TIMEOUT(GATEWAY_TIMEOUT_504, "Gateway Timeout"),
804         /** <code>505 HTTP Version Not Supported</code> */
805         HTTP_VERSION_NOT_SUPPORTED(HTTP_VERSION_NOT_SUPPORTED_505, "HTTP Version Not Supported"),
806         /** <code>507 Insufficient Storage</code> */
807         INSUFFICIENT_STORAGE(INSUFFICIENT_STORAGE_507, "Insufficient Storage");
808 
809         private final int _code;
810         private final String _message;
811 
812         private Code(int code, String message)
813         {
814             this._code = code;
815             _message=message;
816         }
817 
818         public int getCode()
819         {
820             return _code;
821         }
822 
823         public String getMessage()
824         {
825             return _message;
826         }
827 
828 
829         public boolean equals(int code)
830         {
831             return (this._code == code);
832         }
833 
834         @Override
835         public String toString()
836         {
837             return String.format("[%03d %s]",this._code,this.getMessage());
838         }
839 
840         /**
841          * Simple test against an code to determine if it falls into the
842          * <code>Informational</code> message category as defined in the <a
843          * href="http://tools.ietf.org/html/rfc1945">RFC 1945 - HTTP/1.0</a>,
844          * and <a href="http://tools.ietf.org/html/rfc2616">RFC 2616 -
845          * HTTP/1.1</a>.
846          * 
847          * @return true if within range of codes that belongs to
848          *         <code>Informational</code> messages.
849          */
850         public boolean isInformational()
851         {
852             return HttpStatus.isInformational(this._code);
853         }
854 
855         /**
856          * Simple test against an code to determine if it falls into the
857          * <code>Success</code> message category as defined in the <a
858          * href="http://tools.ietf.org/html/rfc1945">RFC 1945 - HTTP/1.0</a>,
859          * and <a href="http://tools.ietf.org/html/rfc2616">RFC 2616 -
860          * HTTP/1.1</a>.
861          * 
862          * @return true if within range of codes that belongs to
863          *         <code>Success</code> messages.
864          */
865         public boolean isSuccess()
866         {
867             return HttpStatus.isSuccess(this._code);
868         }
869 
870         /**
871          * Simple test against an code to determine if it falls into the
872          * <code>Redirection</code> message category as defined in the <a
873          * href="http://tools.ietf.org/html/rfc1945">RFC 1945 - HTTP/1.0</a>,
874          * and <a href="http://tools.ietf.org/html/rfc2616">RFC 2616 -
875          * HTTP/1.1</a>.
876          * 
877          * @return true if within range of codes that belongs to
878          *         <code>Redirection</code> messages.
879          */
880         public boolean isRedirection()
881         {
882             return HttpStatus.isRedirection(this._code);
883         }
884 
885         /**
886          * Simple test against an code to determine if it falls into the
887          * <code>Client Error</code> message category as defined in the <a
888          * href="http://tools.ietf.org/html/rfc1945">RFC 1945 - HTTP/1.0</a>,
889          * and <a href="http://tools.ietf.org/html/rfc2616">RFC 2616 -
890          * HTTP/1.1</a>.
891          * 
892          * @return true if within range of codes that belongs to
893          *         <code>Client Error</code> messages.
894          */
895         public boolean isClientError()
896         {
897             return HttpStatus.isClientError(this._code);
898         }
899 
900         /**
901          * Simple test against an code to determine if it falls into the
902          * <code>Server Error</code> message category as defined in the <a
903          * href="http://tools.ietf.org/html/rfc1945">RFC 1945 - HTTP/1.0</a>,
904          * and <a href="http://tools.ietf.org/html/rfc2616">RFC 2616 -
905          * HTTP/1.1</a>.
906          * 
907          * @return true if within range of codes that belongs to
908          *         <code>Server Error</code> messages.
909          */
910         public boolean isServerError()
911         {
912             return HttpStatus.isServerError(this._code);
913         }
914     }
915 
916 
917     /**
918      * Get the HttpStatusCode for a specific code
919      * 
920      * @param code
921      *            the code to lookup.
922      * @return the {@link HttpStatus} if found, or null if not found.
923      */
924     public static Code getCode(int code)
925     {
926         if (code <= MAX_CODE)
927         {
928             return codeMap[code];
929         }
930         return null;
931     }
932     
933     /**
934      * Get the status message for a specific code.
935      * 
936      * @param code
937      *            the code to look up
938      * @return the specific message, or the code number itself if code
939      *         does not match known list.
940      */
941     public static String getMessage(int code)
942     {
943         Code codeEnum = getCode(code);
944         if (codeEnum != null)
945         {
946             return codeEnum.getMessage();
947         }
948         else
949         {
950             return TypeUtil.toString(code);
951         }
952     }
953 
954     /**
955      * Simple test against an code to determine if it falls into the
956      * <code>Informational</code> message category as defined in the <a
957      * href="http://tools.ietf.org/html/rfc1945">RFC 1945 - HTTP/1.0</a>, and <a
958      * href="http://tools.ietf.org/html/rfc2616">RFC 2616 - HTTP/1.1</a>.
959      * 
960      * @param code
961      *            the code to test.
962      * @return true if within range of codes that belongs to
963      *         <code>Informational</code> messages.
964      */
965     public static boolean isInformational(int code)
966     {
967         return ((100 <= code) && (code <= 199));
968     }
969 
970     /**
971      * Simple test against an code to determine if it falls into the
972      * <code>Success</code> message category as defined in the <a
973      * href="http://tools.ietf.org/html/rfc1945">RFC 1945 - HTTP/1.0</a>, and <a
974      * href="http://tools.ietf.org/html/rfc2616">RFC 2616 - HTTP/1.1</a>.
975      * 
976      * @param code
977      *            the code to test.
978      * @return true if within range of codes that belongs to
979      *         <code>Success</code> messages.
980      */
981     public static boolean isSuccess(int code)
982     {
983         return ((200 <= code) && (code <= 299));
984     }
985 
986     /**
987      * Simple test against an code to determine if it falls into the
988      * <code>Redirection</code> message category as defined in the <a
989      * href="http://tools.ietf.org/html/rfc1945">RFC 1945 - HTTP/1.0</a>, and <a
990      * href="http://tools.ietf.org/html/rfc2616">RFC 2616 - HTTP/1.1</a>.
991      * 
992      * @param code
993      *            the code to test.
994      * @return true if within range of codes that belongs to
995      *         <code>Redirection</code> messages.
996      */
997     public static boolean isRedirection(int code)
998     {
999         return ((300 <= code) && (code <= 399));
1000     }
1001 
1002     /**
1003      * Simple test against an code to determine if it falls into the
1004      * <code>Client Error</code> message category as defined in the <a
1005      * href="http://tools.ietf.org/html/rfc1945">RFC 1945 - HTTP/1.0</a>, and <a
1006      * href="http://tools.ietf.org/html/rfc2616">RFC 2616 - HTTP/1.1</a>.
1007      * 
1008      * @param code
1009      *            the code to test.
1010      * @return true if within range of codes that belongs to
1011      *         <code>Client Error</code> messages.
1012      */
1013     public static boolean isClientError(int code)
1014     {
1015         return ((400 <= code) && (code <= 499));
1016     }
1017 
1018     /**
1019      * Simple test against an code to determine if it falls into the
1020      * <code>Server Error</code> message category as defined in the <a
1021      * href="http://tools.ietf.org/html/rfc1945">RFC 1945 - HTTP/1.0</a>, and <a
1022      * href="http://tools.ietf.org/html/rfc2616">RFC 2616 - HTTP/1.1</a>.
1023      * 
1024      * @param code
1025      *            the code to test.
1026      * @return true if within range of codes that belongs to
1027      *         <code>Server Error</code> messages.
1028      */
1029     public static boolean isServerError(int code)
1030     {
1031         return ((500 <= code) && (code <= 599));
1032     }
1033 }