Title: [264566] trunk/Source
Revision
264566
Author
[email protected]
Date
2020-07-18 03:33:54 -0700 (Sat, 18 Jul 2020)

Log Message

Only use enum classes in HTTPParsers
https://bugs.webkit.org/show_bug.cgi?id=214451

Patch by Rob Buis <[email protected]> on 2020-07-18
Reviewed by Darin Adler.

Source/WebCore:

Only use enum classes in HTTPParsers by converting XFrameOptionsSameOrigin
and ContentTypeOptionsDisposition. Remove HTTPVersion enum since its
only use is by parseHTTPRequestLine, but this method is unused.

* loader/FrameLoader.cpp:
(WebCore::FrameLoader::shouldInterruptLoadForXFrameOptions):
* loader/cache/CachedCSSStyleSheet.cpp:
(WebCore::CachedCSSStyleSheet::mimeTypeAllowedByNosniff const):
* platform/network/HTTPParsers.cpp:
(WebCore::parseContentTypeOptionsHeader):
(WebCore::parseXFrameOptionsHeader):
(WebCore::parseHTTPRequestLine): Deleted.
* platform/network/HTTPParsers.h:
(): Deleted.
* platform/network/ResourceResponseBase.cpp:
(WebCore::isScriptAllowedByNosniff):

Source/WebKit:

Adjust to XFrameOptionsDisposition change.

* NetworkProcess/NetworkResourceLoader.cpp:
(WebKit::NetworkResourceLoader::shouldInterruptLoadForXFrameOptions):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (264565 => 264566)


--- trunk/Source/WebCore/ChangeLog	2020-07-18 03:13:20 UTC (rev 264565)
+++ trunk/Source/WebCore/ChangeLog	2020-07-18 10:33:54 UTC (rev 264566)
@@ -1,3 +1,27 @@
+2020-07-18  Rob Buis  <[email protected]>
+
+        Only use enum classes in HTTPParsers
+        https://bugs.webkit.org/show_bug.cgi?id=214451
+
+        Reviewed by Darin Adler.
+
+        Only use enum classes in HTTPParsers by converting XFrameOptionsSameOrigin
+        and ContentTypeOptionsDisposition. Remove HTTPVersion enum since its
+        only use is by parseHTTPRequestLine, but this method is unused.
+
+        * loader/FrameLoader.cpp:
+        (WebCore::FrameLoader::shouldInterruptLoadForXFrameOptions):
+        * loader/cache/CachedCSSStyleSheet.cpp:
+        (WebCore::CachedCSSStyleSheet::mimeTypeAllowedByNosniff const):
+        * platform/network/HTTPParsers.cpp:
+        (WebCore::parseContentTypeOptionsHeader):
+        (WebCore::parseXFrameOptionsHeader):
+        (WebCore::parseHTTPRequestLine): Deleted.
+        * platform/network/HTTPParsers.h:
+        (): Deleted.
+        * platform/network/ResourceResponseBase.cpp:
+        (WebCore::isScriptAllowedByNosniff):
+
 2020-07-17  Sam Weinig  <[email protected]>
 
         Remove final vestigates of SimpleColor

Modified: trunk/Source/WebCore/loader/FrameLoader.cpp (264565 => 264566)


--- trunk/Source/WebCore/loader/FrameLoader.cpp	2020-07-18 03:13:20 UTC (rev 264565)
+++ trunk/Source/WebCore/loader/FrameLoader.cpp	2020-07-18 10:33:54 UTC (rev 264566)
@@ -3615,7 +3615,7 @@
     XFrameOptionsDisposition disposition = parseXFrameOptionsHeader(content);
 
     switch (disposition) {
-    case XFrameOptionsSameOrigin: {
+    case XFrameOptionsDisposition::SameOrigin: {
         auto origin = SecurityOrigin::create(url);
         if (!origin->isSameSchemeHostPort(topFrame.document()->securityOrigin()))
             return true;
@@ -3625,17 +3625,17 @@
         }
         return false;
     }
-    case XFrameOptionsDeny:
+    case XFrameOptionsDisposition::Deny:
         return true;
-    case XFrameOptionsAllowAll:
+    case XFrameOptionsDisposition::AllowAll:
         return false;
-    case XFrameOptionsConflict:
+    case XFrameOptionsDisposition::Conflict:
         m_frame.document()->addConsoleMessage(MessageSource::JS, MessageLevel::Error, "Multiple 'X-Frame-Options' headers with conflicting values ('" + content + "') encountered when loading '" + url.stringCenterEllipsizedToLength() + "'. Falling back to 'DENY'.", requestIdentifier);
         return true;
-    case XFrameOptionsInvalid:
+    case XFrameOptionsDisposition::Invalid:
         m_frame.document()->addConsoleMessage(MessageSource::JS, MessageLevel::Error, "Invalid 'X-Frame-Options' header encountered when loading '" + url.stringCenterEllipsizedToLength() + "': '" + content + "' is not a recognized directive. The header will be ignored.", requestIdentifier);
         return false;
-    case XFrameOptionsNone:
+    case XFrameOptionsDisposition::None:
         return false;
     }
     ASSERT_NOT_REACHED();

Modified: trunk/Source/WebCore/loader/cache/CachedCSSStyleSheet.cpp (264565 => 264566)


--- trunk/Source/WebCore/loader/cache/CachedCSSStyleSheet.cpp	2020-07-18 03:13:20 UTC (rev 264565)
+++ trunk/Source/WebCore/loader/cache/CachedCSSStyleSheet.cpp	2020-07-18 10:33:54 UTC (rev 264566)
@@ -127,7 +127,7 @@
 
 bool CachedCSSStyleSheet::mimeTypeAllowedByNosniff() const
 {
-    return parseContentTypeOptionsHeader(m_response.httpHeaderField(HTTPHeaderName::XContentTypeOptions)) != ContentTypeOptionsNosniff || equalLettersIgnoringASCIICase(responseMIMEType(), "text/css");
+    return parseContentTypeOptionsHeader(m_response.httpHeaderField(HTTPHeaderName::XContentTypeOptions)) != ContentTypeOptionsDisposition::Nosniff || equalLettersIgnoringASCIICase(responseMIMEType(), "text/css");
 }
 
 bool CachedCSSStyleSheet::canUseSheet(MIMETypeCheckHint mimeTypeCheckHint, bool* hasValidMIMEType) const

Modified: trunk/Source/WebCore/platform/network/HTTPParsers.cpp (264565 => 264566)


--- trunk/Source/WebCore/platform/network/HTTPParsers.cpp	2020-07-18 03:13:20 UTC (rev 264565)
+++ trunk/Source/WebCore/platform/network/HTTPParsers.cpp	2020-07-18 10:33:54 UTC (rev 264566)
@@ -538,8 +538,8 @@
 {
     StringView leftToken = header.left(header.find(','));
     if (equalLettersIgnoringASCIICase(stripLeadingAndTrailingHTTPSpaces(leftToken), "nosniff"))
-        return ContentTypeOptionsNosniff;
-    return ContentTypeOptionsNone;
+        return ContentTypeOptionsDisposition::Nosniff;
+    return ContentTypeOptionsDisposition::None;
 }
 
 // For example: "HTTP/1.1 200 OK" => "OK".
@@ -559,7 +559,7 @@
 
 XFrameOptionsDisposition parseXFrameOptionsHeader(const String& header)
 {
-    XFrameOptionsDisposition result = XFrameOptionsNone;
+    XFrameOptionsDisposition result = XFrameOptionsDisposition::None;
 
     if (header.isEmpty())
         return result;
@@ -566,20 +566,20 @@
 
     for (auto& currentHeader : header.split(',')) {
         currentHeader = currentHeader.stripWhiteSpace();
-        XFrameOptionsDisposition currentValue = XFrameOptionsNone;
+        XFrameOptionsDisposition currentValue = XFrameOptionsDisposition::None;
         if (equalLettersIgnoringASCIICase(currentHeader, "deny"))
-            currentValue = XFrameOptionsDeny;
+            currentValue = XFrameOptionsDisposition::Deny;
         else if (equalLettersIgnoringASCIICase(currentHeader, "sameorigin"))
-            currentValue = XFrameOptionsSameOrigin;
+            currentValue = XFrameOptionsDisposition::SameOrigin;
         else if (equalLettersIgnoringASCIICase(currentHeader, "allowall"))
-            currentValue = XFrameOptionsAllowAll;
+            currentValue = XFrameOptionsDisposition::AllowAll;
         else
-            currentValue = XFrameOptionsInvalid;
+            currentValue = XFrameOptionsDisposition::Invalid;
 
-        if (result == XFrameOptionsNone)
+        if (result == XFrameOptionsDisposition::None)
             result = currentValue;
         else if (result != currentValue)
-            return XFrameOptionsConflict;
+            return XFrameOptionsDisposition::Conflict;
     }
     return result;
 }
@@ -642,69 +642,6 @@
     return true;
 }
 
-// HTTP/1.1 - RFC 2616
-// http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.1
-// Request-Line = Method SP Request-URI SP HTTP-Version CRLF
-size_t parseHTTPRequestLine(const char* data, size_t length, String& failureReason, String& method, String& url, HTTPVersion& httpVersion)
-{
-    method = String();
-    url = ""
-    httpVersion = Unknown;
-
-    const char* space1 = 0;
-    const char* space2 = 0;
-    const char* p;
-    size_t consumedLength;
-
-    for (p = data, consumedLength = 0; consumedLength < length; p++, consumedLength++) {
-        if (*p == ' ') {
-            if (!space1)
-                space1 = p;
-            else if (!space2)
-                space2 = p;
-        } else if (*p == '\n')
-            break;
-    }
-
-    // Haven't finished header line.
-    if (consumedLength == length) {
-        failureReason = "Incomplete Request Line"_s;
-        return 0;
-    }
-
-    // RequestLine does not contain 3 parts.
-    if (!space1 || !space2) {
-        failureReason = "Request Line does not appear to contain: <Method> <Url> <HTTPVersion>."_s;
-        return 0;
-    }
-
-    // The line must end with "\r\n".
-    const char* end = p + 1;
-    if (*(end - 2) != '\r') {
-        failureReason = "Request line does not end with CRLF"_s;
-        return 0;
-    }
-
-    // Request Method.
-    method = String(data, space1 - data); // For length subtract 1 for space, but add 1 for data being the first character.
-
-    // Request URI.
-    url = "" + 1, space2 - space1 - 1); // For length subtract 1 for space.
-
-    // HTTP Version.
-    String httpVersionString(space2 + 1, end - space2 - 3); // For length subtract 1 for space, and 2 for "\r\n".
-    if (httpVersionString.length() != 8 || !httpVersionString.startsWith("HTTP/1."))
-        httpVersion = Unknown;
-    else if (httpVersionString[7] == '0')
-        httpVersion = HTTP_1_0;
-    else if (httpVersionString[7] == '1')
-        httpVersion = HTTP_1_1;
-    else
-        httpVersion = Unknown;
-
-    return end - data;
-}
-
 static inline bool isValidHeaderNameCharacter(const char* character)
 {
     // https://tools.ietf.org/html/rfc7230#section-3.2

Modified: trunk/Source/WebCore/platform/network/HTTPParsers.h (264565 => 264566)


--- trunk/Source/WebCore/platform/network/HTTPParsers.h	2020-07-18 03:13:20 UTC (rev 264565)
+++ trunk/Source/WebCore/platform/network/HTTPParsers.h	2020-07-18 10:33:54 UTC (rev 264566)
@@ -47,18 +47,18 @@
     BlockEnabled,
 };
 
-enum ContentTypeOptionsDisposition {
-    ContentTypeOptionsNone,
-    ContentTypeOptionsNosniff
+enum class ContentTypeOptionsDisposition : bool {
+    None,
+    Nosniff
 };
 
-enum XFrameOptionsDisposition {
-    XFrameOptionsNone,
-    XFrameOptionsDeny,
-    XFrameOptionsSameOrigin,
-    XFrameOptionsAllowAll,
-    XFrameOptionsInvalid,
-    XFrameOptionsConflict
+enum class XFrameOptionsDisposition : uint8_t {
+    None,
+    Deny,
+    SameOrigin,
+    AllowAll,
+    Invalid,
+    Conflict
 };
 
 enum class CrossOriginResourcePolicy {
@@ -91,8 +91,6 @@
 ContentTypeOptionsDisposition parseContentTypeOptionsHeader(StringView header);
 
 // Parsing Complete HTTP Messages.
-enum HTTPVersion { Unknown, HTTP_1_0, HTTP_1_1 };
-size_t parseHTTPRequestLine(const char* data, size_t length, String& failureReason, String& method, String& url, HTTPVersion&);
 size_t parseHTTPHeader(const char* data, size_t length, String& failureReason, StringView& nameStr, String& valueStr, bool strict = true);
 size_t parseHTTPRequestBody(const char* data, size_t length, Vector<unsigned char>& body);
 

Modified: trunk/Source/WebCore/platform/network/ResourceResponseBase.cpp (264565 => 264566)


--- trunk/Source/WebCore/platform/network/ResourceResponseBase.cpp	2020-07-18 03:13:20 UTC (rev 264565)
+++ trunk/Source/WebCore/platform/network/ResourceResponseBase.cpp	2020-07-18 10:33:54 UTC (rev 264566)
@@ -41,7 +41,7 @@
 
 bool isScriptAllowedByNosniff(const ResourceResponse& response)
 {
-    if (parseContentTypeOptionsHeader(response.httpHeaderField(HTTPHeaderName::XContentTypeOptions)) != ContentTypeOptionsNosniff)
+    if (parseContentTypeOptionsHeader(response.httpHeaderField(HTTPHeaderName::XContentTypeOptions)) != ContentTypeOptionsDisposition::Nosniff)
         return true;
     String mimeType = extractMIMETypeFromMediaType(response.httpHeaderField(HTTPHeaderName::ContentType));
     return MIMETypeRegistry::isSupportedJavaScriptMIMEType(mimeType);

Modified: trunk/Source/WebKit/ChangeLog (264565 => 264566)


--- trunk/Source/WebKit/ChangeLog	2020-07-18 03:13:20 UTC (rev 264565)
+++ trunk/Source/WebKit/ChangeLog	2020-07-18 10:33:54 UTC (rev 264566)
@@ -1,3 +1,15 @@
+2020-07-18  Rob Buis  <[email protected]>
+
+        Only use enum classes in HTTPParsers
+        https://bugs.webkit.org/show_bug.cgi?id=214451
+
+        Reviewed by Darin Adler.
+
+        Adjust to XFrameOptionsDisposition change.
+
+        * NetworkProcess/NetworkResourceLoader.cpp:
+        (WebKit::NetworkResourceLoader::shouldInterruptLoadForXFrameOptions):
+
 2020-07-17  Sam Weinig  <[email protected]>
 
         Remove final vestigates of SimpleColor

Modified: trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp (264565 => 264566)


--- trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp	2020-07-18 03:13:20 UTC (rev 264565)
+++ trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp	2020-07-18 10:33:54 UTC (rev 264566)
@@ -515,12 +515,12 @@
         return false;
 
     switch (parseXFrameOptionsHeader(xFrameOptions)) {
-    case XFrameOptionsNone:
-    case XFrameOptionsAllowAll:
+    case XFrameOptionsDisposition::None:
+    case XFrameOptionsDisposition::AllowAll:
         return false;
-    case XFrameOptionsDeny:
+    case XFrameOptionsDisposition::Deny:
         return true;
-    case XFrameOptionsSameOrigin: {
+    case XFrameOptionsDisposition::SameOrigin: {
         auto origin = SecurityOrigin::create(url);
         auto topFrameOrigin = m_parameters.frameAncestorOrigins.last();
         if (!origin->isSameSchemeHostPort(*topFrameOrigin))
@@ -531,12 +531,12 @@
         }
         return false;
     }
-    case XFrameOptionsConflict: {
+    case XFrameOptionsDisposition::Conflict: {
         String errorMessage = "Multiple 'X-Frame-Options' headers with conflicting values ('" + xFrameOptions + "') encountered when loading '" + url.stringCenterEllipsizedToLength() + "'. Falling back to 'DENY'.";
         send(Messages::WebPage::AddConsoleMessage { m_parameters.webFrameID,  MessageSource::JS, MessageLevel::Error, errorMessage, identifier() }, m_parameters.webPageID);
         return true;
     }
-    case XFrameOptionsInvalid: {
+    case XFrameOptionsDisposition::Invalid: {
         String errorMessage = "Invalid 'X-Frame-Options' header encountered when loading '" + url.stringCenterEllipsizedToLength() + "': '" + xFrameOptions + "' is not a recognized directive. The header will be ignored.";
         send(Messages::WebPage::AddConsoleMessage { m_parameters.webFrameID,  MessageSource::JS, MessageLevel::Error, errorMessage, identifier() }, m_parameters.webPageID);
         return false;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to