View Javadoc
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  }