Share code to normalize an HTTP method
authordbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 3 Oct 2017 23:35:41 +0000 (23:35 +0000)
committerdbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 3 Oct 2017 23:35:41 +0000 (23:35 +0000)
https://bugs.webkit.org/show_bug.cgi?id=177837

Reviewed by Andy Estes.

Currently we duplicate code in XMLHttpRequest and FetchRequest to normalize an HTTP method.
We should add a common helper function and update both classes to make use of it.

No functionality changed. So, no new tests.

* Modules/fetch/FetchRequest.cpp:
(WebCore::setMethod): Modified to use WebCore::normalizeHTTPMethod().
* platform/network/HTTPParsers.cpp:
(WebCore::normalizeHTTPMethod): Moved from XMLHttpRequest.cpp.
* platform/network/HTTPParsers.h:
* xml/XMLHttpRequest.cpp:
(WebCore::XMLHttpRequest::open): Modified to use WebCore::normalizeHTTPMethod().
(WebCore::XMLHttpRequest::uppercaseKnownHTTPMethod): Deleted; moved to HTTPParsers.cpp.
* xml/XMLHttpRequest.h:

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@222819 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/Modules/fetch/FetchRequest.cpp
Source/WebCore/platform/network/HTTPParsers.cpp
Source/WebCore/platform/network/HTTPParsers.h
Source/WebCore/xml/XMLHttpRequest.cpp
Source/WebCore/xml/XMLHttpRequest.h

index 3452d2e..a844956 100644 (file)
@@ -1,5 +1,27 @@
 2017-10-03  Daniel Bates  <dabates@apple.com>
 
+        Share code to normalize an HTTP method
+        https://bugs.webkit.org/show_bug.cgi?id=177837
+
+        Reviewed by Andy Estes.
+
+        Currently we duplicate code in XMLHttpRequest and FetchRequest to normalize an HTTP method.
+        We should add a common helper function and update both classes to make use of it.
+
+        No functionality changed. So, no new tests.
+
+        * Modules/fetch/FetchRequest.cpp:
+        (WebCore::setMethod): Modified to use WebCore::normalizeHTTPMethod().
+        * platform/network/HTTPParsers.cpp:
+        (WebCore::normalizeHTTPMethod): Moved from XMLHttpRequest.cpp.
+        * platform/network/HTTPParsers.h:
+        * xml/XMLHttpRequest.cpp:
+        (WebCore::XMLHttpRequest::open): Modified to use WebCore::normalizeHTTPMethod().
+        (WebCore::XMLHttpRequest::uppercaseKnownHTTPMethod): Deleted; moved to HTTPParsers.cpp.
+        * xml/XMLHttpRequest.h:
+
+2017-10-03  Daniel Bates  <dabates@apple.com>
+
         Share code to determine a forbidden method
         https://bugs.webkit.org/show_bug.cgi?id=177833
 
index 4084b1f..0e8742a 100644 (file)
@@ -41,8 +41,7 @@ static std::optional<Exception> setMethod(ResourceRequest& request, const String
         return Exception { TypeError, ASCIILiteral("Method is not a valid HTTP token.") };
     if (isForbiddenMethod(initMethod))
         return Exception { TypeError, ASCIILiteral("Method is forbidden.") };
-    String method = initMethod.convertToASCIIUppercase();
-    request.setHTTPMethod((method == "DELETE" || method == "GET" || method == "HEAD" || method == "OPTIONS" || method == "POST" || method == "PUT") ? method : initMethod);
+    request.setHTTPMethod(normalizeHTTPMethod(initMethod));
     return std::nullopt;
 }
 
index 48acc3c..eaed29b 100644 (file)
@@ -881,4 +881,19 @@ bool isCrossOriginSafeRequestHeader(HTTPHeaderName name, const String& value)
     }
 }
 
+// Implements <https://fetch.spec.whatwg.org/#concept-method-normalize>.
+String normalizeHTTPMethod(const String& method)
+{
+    const char* const methods[] = { "DELETE", "GET", "HEAD", "OPTIONS", "POST", "PUT" };
+    for (auto* value : methods) {
+        if (equalIgnoringASCIICase(method, value)) {
+            // Don't bother allocating a new string if it's already all uppercase.
+            if (method == value)
+                break;
+            return ASCIILiteral { value };
+        }
+    }
+    return method;
+}
+
 }
index 4981d80..80e603f 100644 (file)
@@ -101,6 +101,8 @@ bool isCrossOriginSafeHeader(HTTPHeaderName, const HTTPHeaderSet&);
 bool isCrossOriginSafeHeader(const String&, const HTTPHeaderSet&);
 bool isCrossOriginSafeRequestHeader(HTTPHeaderName, const String&);
 
+String normalizeHTTPMethod(const String&);
+
 inline bool isHTTPSpace(UChar character)
 {
     return character <= ' ' && (character == ' ' || character == '\n' || character == '\t' || character == '\r');
index e9902db..661a875 100644 (file)
@@ -327,20 +327,6 @@ ExceptionOr<void> XMLHttpRequest::setWithCredentials(bool value)
     return { };
 }
 
-String XMLHttpRequest::uppercaseKnownHTTPMethod(const String& method)
-{
-    const char* const methods[] = { "DELETE", "GET", "HEAD", "OPTIONS", "POST", "PUT" };
-    for (auto* value : methods) {
-        if (equalIgnoringASCIICase(method, value)) {
-            // Don't bother allocating a new string if it's already all uppercase.
-            if (method == value)
-                break;
-            return ASCIILiteral(value);
-        }
-    }
-    return method;
-}
-
 ExceptionOr<void> XMLHttpRequest::open(const String& method, const String& url)
 {
     // If the async argument is omitted, set async to true.
@@ -388,7 +374,7 @@ ExceptionOr<void> XMLHttpRequest::open(const String& method, const URL& url, boo
         }
     }
 
-    m_method = uppercaseKnownHTTPMethod(method);
+    m_method = normalizeHTTPMethod(method);
 
     m_url = url;
     scriptExecutionContext()->contentSecurityPolicy()->upgradeInsecureRequestIfNeeded(m_url, ContentSecurityPolicy::InsecureRequestType::Load);
index dbdc03d..354548b 100644 (file)
@@ -103,9 +103,6 @@ public:
     bool responseCacheIsValid() const { return m_responseCacheIsValid; }
     void didCacheResponse();
 
-    // Expose HTTP validation methods for other untrusted requests.
-    static String uppercaseKnownHTTPMethod(const String&);
-
     enum class ResponseType { EmptyString, Arraybuffer, Blob, Document, Json, Text };
     ExceptionOr<void> setResponseType(ResponseType);
     ResponseType responseType() const;