1 /*
2 * Copyright (c) 2002-2026 Gargoyle Software Inc.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 * https://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 package org.htmlunit;
16
17 /**
18 * Represents the various ways a page can be submitted.
19 *
20 * @see <a href="http://www.ietf.org/rfc/rfc2616.txt">RFC2616</a>
21 * @see <a href="http://tools.ietf.org/html/rfc5789">RFC5789</a>
22 *
23 * @author Mike Bowler
24 * @author Ahmed Ashour
25 * @author Marc Guillemot
26 * @author Ronald Brill
27 */
28 public enum HttpMethod {
29 /** OPTIONS. */
30 OPTIONS,
31 /** GET. */
32 GET,
33 /** HEAD. */
34 HEAD,
35 /** POST. */
36 POST,
37 /** PUT. */
38 PUT,
39 /** DELETE. */
40 DELETE,
41 /** TRACE. */
42 TRACE,
43 /** PATCH. */
44 PATCH;
45
46 /**
47 * Validates that an HTTP method string contains only ASCII characters
48 * and matches the HTTP token specification (RFC 7230).
49 *
50 * @param methodName the HTTP method to validate
51 * @throws IllegalArgumentException if method is null or empty
52 */
53 public static void validateHttpMethodName(final String methodName) {
54 if (methodName == null || methodName.isEmpty()) {
55 throw new IllegalArgumentException("HTTP method cannot be null or empty");
56 }
57
58 for (int i = 0; i < methodName.length(); i++) {
59 final char c = methodName.charAt(i);
60
61 // Check if non-ASCII
62 if (c > 127) {
63 throw new IllegalArgumentException(
64 "'" + methodName + "' is not a valid HTTP method (contains non-ASCII character)");
65 }
66
67 // Check if invalid token character
68 if (!isHttpTokenChar(c)) {
69 throw new IllegalArgumentException(
70 "'" + methodName + "' is not a valid HTTP method (invalid character: '" + c + "')");
71 }
72 }
73 }
74
75 private static boolean isHttpTokenChar(final char c) {
76 return (c >= 'A' && c <= 'Z')
77 || (c >= 'a' && c <= 'z')
78 || (c >= '0' && c <= '9')
79 || c == '!'
80 || c == '#'
81 || c == '$'
82 || c == '%'
83 || c == '&'
84 || c == '\''
85 || c == '*'
86 || c == '+'
87 || c == '-'
88 || c == '.'
89 || c == '^'
90 || c == '_'
91 || c == '`'
92 || c == '|'
93 || c == '~';
94 }
95 }