Title: [188333] trunk
Revision
188333
Author
[email protected]
Date
2015-08-12 03:12:28 -0700 (Wed, 12 Aug 2015)

Log Message

XHR.setRequestHeader should remove trailing and leading whitespaces from the header value
https://bugs.webkit.org/show_bug.cgi?id=147445

Reviewed by Darin Adler.

Source/WebCore:

Covered by added and modifed tests.

* platform/network/HTTPParsers.h:
(WebCore::isHTTPSpace):
(WebCore::stripLeadingAndTrailingHTTPSpaces):
* xml/XMLHttpRequest.cpp:
(WebCore::XMLHttpRequest::setRequestHeader): strip trailing and leading whitespace before testing for header value validity and storing.

LayoutTests:

* http/tests/xmlhttprequest/inject-header-expected.txt:
* http/tests/xmlhttprequest/inject-header.html:
* http/tests/xmlhttprequest/resources/print-xtest-header.cgi: Added.
* http/tests/xmlhttprequest/set-bad-headervalue-expected.txt:
* http/tests/xmlhttprequest/set-bad-headervalue.html:
* http/tests/xmlhttprequest/setrequestheader-allow-whitespace-in-value-expected.txt: Added.
* http/tests/xmlhttprequest/setrequestheader-allow-whitespace-in-value.htm: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (188332 => 188333)


--- trunk/LayoutTests/ChangeLog	2015-08-12 07:29:33 UTC (rev 188332)
+++ trunk/LayoutTests/ChangeLog	2015-08-12 10:12:28 UTC (rev 188333)
@@ -1,3 +1,18 @@
+2015-08-12  Youenn Fablet  <[email protected]>
+
+        XHR.setRequestHeader should remove trailing and leading whitespaces from the header value
+        https://bugs.webkit.org/show_bug.cgi?id=147445
+
+        Reviewed by Darin Adler.
+
+        * http/tests/xmlhttprequest/inject-header-expected.txt:
+        * http/tests/xmlhttprequest/inject-header.html:
+        * http/tests/xmlhttprequest/resources/print-xtest-header.cgi: Added.
+        * http/tests/xmlhttprequest/set-bad-headervalue-expected.txt:
+        * http/tests/xmlhttprequest/set-bad-headervalue.html:
+        * http/tests/xmlhttprequest/setrequestheader-allow-whitespace-in-value-expected.txt: Added.
+        * http/tests/xmlhttprequest/setrequestheader-allow-whitespace-in-value.htm: Added.
+
 2015-08-11  Myles C. Maxfield  <[email protected]>
 
         [font-features] Map OpenType feature tags to TrueType feature selectors

Modified: trunk/LayoutTests/http/tests/xmlhttprequest/inject-header-expected.txt (188332 => 188333)


--- trunk/LayoutTests/http/tests/xmlhttprequest/inject-header-expected.txt	2015-08-12 07:29:33 UTC (rev 188332)
+++ trunk/LayoutTests/http/tests/xmlhttprequest/inject-header-expected.txt	2015-08-12 10:12:28 UTC (rev 188333)
@@ -1,9 +1,9 @@
 Test that setRequestHeader properly checks for line feeds in header values.
 
-%0AEvil%3A%20on -> SUCCESS, setRequestHeader() raised an exception Error: SyntaxError: DOM Exception 12
+a%0AEvil%3A%20on -> SUCCESS, setRequestHeader() raised an exception Error: SyntaxError: DOM Exception 12
 
-%0DEvil%3A%20on -> SUCCESS, setRequestHeader() raised an exception Error: SyntaxError: DOM Exception 12
+a%0DEvil%3A%20on -> SUCCESS, setRequestHeader() raised an exception Error: SyntaxError: DOM Exception 12
 
-%0D%0AEvil%3A%20on -> SUCCESS, setRequestHeader() raised an exception Error: SyntaxError: DOM Exception 12
+a%0D%0AEvil%3A%20on -> SUCCESS, setRequestHeader() raised an exception Error: SyntaxError: DOM Exception 12
 
-%0A%0DEvil%3A%20on -> SUCCESS, setRequestHeader() raised an exception Error: SyntaxError: DOM Exception 12
+a%0A%0DEvil%3A%20on -> SUCCESS, setRequestHeader() raised an exception Error: SyntaxError: DOM Exception 12

Modified: trunk/LayoutTests/http/tests/xmlhttprequest/inject-header.html (188332 => 188333)


--- trunk/LayoutTests/http/tests/xmlhttprequest/inject-header.html	2015-08-12 07:29:33 UTC (rev 188332)
+++ trunk/LayoutTests/http/tests/xmlhttprequest/inject-header.html	2015-08-12 10:12:28 UTC (rev 188333)
@@ -28,10 +28,10 @@
     }
 }
 
-test("\nEvil: on");
-test("\rEvil: on");
-test("\r\nEvil: on");
-test("\n\rEvil: on");
+test("a\nEvil: on");
+test("a\rEvil: on");
+test("a\r\nEvil: on");
+test("a\n\rEvil: on");
 </script>
 </body>
 </html>

Added: trunk/LayoutTests/http/tests/xmlhttprequest/resources/print-xtest-header.cgi (0 => 188333)


--- trunk/LayoutTests/http/tests/xmlhttprequest/resources/print-xtest-header.cgi	                        (rev 0)
+++ trunk/LayoutTests/http/tests/xmlhttprequest/resources/print-xtest-header.cgi	2015-08-12 10:12:28 UTC (rev 188333)
@@ -0,0 +1,8 @@
+#!/usr/bin/perl -w
+
+use CGI qw(:standard);
+my $cgi = new CGI;
+
+print "Cache-Control: no-cache, no-store\n";
+print "Content-type: text/plain\n\n"; 
+print "x-test: $ENV{\"HTTP_X_TEST\"}\n";
Property changes on: trunk/LayoutTests/http/tests/xmlhttprequest/resources/print-xtest-header.cgi
___________________________________________________________________

Added: svn:executable

Modified: trunk/LayoutTests/http/tests/xmlhttprequest/set-bad-headervalue-expected.txt (188332 => 188333)


--- trunk/LayoutTests/http/tests/xmlhttprequest/set-bad-headervalue-expected.txt	2015-08-12 07:29:33 UTC (rev 188332)
+++ trunk/LayoutTests/http/tests/xmlhttprequest/set-bad-headervalue-expected.txt	2015-08-12 10:12:28 UTC (rev 188333)
@@ -9,6 +9,4 @@
 PASS XMLHttpRequest: setRequestHeader() value argument checks 7 
 PASS XMLHttpRequest: setRequestHeader() value argument checks 8 
 PASS XMLHttpRequest: setRequestHeader() value argument checks 9 
-PASS XMLHttpRequest: setRequestHeader() value argument checks 10 
-PASS XMLHttpRequest: setRequestHeader() value argument checks 11 
 

Modified: trunk/LayoutTests/http/tests/xmlhttprequest/set-bad-headervalue.html (188332 => 188333)


--- trunk/LayoutTests/http/tests/xmlhttprequest/set-bad-headervalue.html	2015-08-12 07:29:33 UTC (rev 188332)
+++ trunk/LayoutTests/http/tests/xmlhttprequest/set-bad-headervalue.html	2015-08-12 10:12:28 UTC (rev 188333)
@@ -28,8 +28,6 @@
       try_value("t\vt", true)
       try_value("t\tt", false)
       try_value("t t", false)
-      try_value(" t", true)
-      try_value("t ", true)
       try_value("\xd0\xa1", false)
       try_value("\x7f", true)
       test(function() {

Added: trunk/LayoutTests/http/tests/xmlhttprequest/setrequestheader-allow-whitespace-in-value-expected.txt (0 => 188333)


--- trunk/LayoutTests/http/tests/xmlhttprequest/setrequestheader-allow-whitespace-in-value-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/http/tests/xmlhttprequest/setrequestheader-allow-whitespace-in-value-expected.txt	2015-08-12 10:12:28 UTC (rev 188333)
@@ -0,0 +1,6 @@
+
+PASS XMLHttpRequest: setRequestHeader() - header value with whitespace ( ) 
+PASS XMLHttpRequest: setRequestHeader() - header value with whitespace ( t) 
+PASS XMLHttpRequest: setRequestHeader() - header value with whitespace (t ) 
+PASS XMLHttpRequest: setRequestHeader() - header value with whitespace ( t ) 
+

Added: trunk/LayoutTests/http/tests/xmlhttprequest/setrequestheader-allow-whitespace-in-value.htm (0 => 188333)


--- trunk/LayoutTests/http/tests/xmlhttprequest/setrequestheader-allow-whitespace-in-value.htm	                        (rev 0)
+++ trunk/LayoutTests/http/tests/xmlhttprequest/setrequestheader-allow-whitespace-in-value.htm	2015-08-12 10:12:28 UTC (rev 188333)
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>XMLHttpRequest: setRequestHeader() - header value with whitespace</title>
+    <script src=""
+    <script src=""
+    <link rel="help" href="" data-tested-assertations="/following::ol/li[4]/p[contains(@class,'note')] /following::ol/li[6]" />
+  </head>
+  <body>
+    <!-- This is an adaptation of https://github.com/w3c/web-platform-tests/blob/4f91feb51adfdbfd150743bb3b94744b13b1edae/XMLHttpRequest/setrequestheader-allow-whitespace-in-value.htm -->
+    <div id="log"></div>
+    <script>
+      function request(value) {
+        test(function() {
+          var client = new XMLHttpRequest()
+          client.open("POST", "resources/print-xtest-header.cgi", false)
+          client.setRequestHeader("X-Test", value)
+          client.send(null)
+          assert_equals(client.responseText, "x-test: " + String(value.trim()).toLowerCase() + "\n" )
+        }, document.title + " (" + value + ")")
+      }
+      request(" ")
+      request(" t")
+      request("t ")
+      request(" t ")
+    </script>
+  </body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (188332 => 188333)


--- trunk/Source/WebCore/ChangeLog	2015-08-12 07:29:33 UTC (rev 188332)
+++ trunk/Source/WebCore/ChangeLog	2015-08-12 10:12:28 UTC (rev 188333)
@@ -1,3 +1,18 @@
+2015-08-12  Youenn Fablet  <[email protected]>
+
+        XHR.setRequestHeader should remove trailing and leading whitespaces from the header value
+        https://bugs.webkit.org/show_bug.cgi?id=147445
+
+        Reviewed by Darin Adler.
+
+        Covered by added and modifed tests.
+
+        * platform/network/HTTPParsers.h:
+        (WebCore::isHTTPSpace):
+        (WebCore::stripLeadingAndTrailingHTTPSpaces):
+        * xml/XMLHttpRequest.cpp:
+        (WebCore::XMLHttpRequest::setRequestHeader): strip trailing and leading whitespace before testing for header value validity and storing.
+
 2015-08-11  Carlos Garcia Campos  <[email protected]>
 
         NetworkProcess: DNS prefetch happens in the Web Process

Modified: trunk/Source/WebCore/platform/network/HTTPParsers.h (188332 => 188333)


--- trunk/Source/WebCore/platform/network/HTTPParsers.h	2015-08-12 07:29:33 UTC (rev 188332)
+++ trunk/Source/WebCore/platform/network/HTTPParsers.h	2015-08-12 10:12:28 UTC (rev 188333)
@@ -87,6 +87,17 @@
 size_t parseHTTPHeader(const char* data, size_t length, String& failureReason, String& nameStr, String& valueStr, bool strict = true);
 size_t parseHTTPRequestBody(const char* data, size_t length, Vector<unsigned char>& body);
 
+inline bool isHTTPSpace(UChar character)
+{
+    return character <= ' ' && (character == ' ' || character == '\n' || character == '\t' || character == '\r');
 }
 
+// Strip leading and trailing whitespace as defined in https://fetch.spec.whatwg.org/#concept-header-value-normalize.
+inline String stripLeadingAndTrailingHTTPSpaces(const String& string)
+{
+    return string.stripWhiteSpace(isHTTPSpace);
+}
+
+}
+
 #endif

Modified: trunk/Source/WebCore/xml/XMLHttpRequest.cpp (188332 => 188333)


--- trunk/Source/WebCore/xml/XMLHttpRequest.cpp	2015-08-12 07:29:33 UTC (rev 188332)
+++ trunk/Source/WebCore/xml/XMLHttpRequest.cpp	2015-08-12 10:12:28 UTC (rev 188333)
@@ -940,7 +940,8 @@
         return;
     }
 
-    if (!isValidHTTPToken(name) || !isValidHTTPHeaderValue(value)) {
+    String normalizedValue = stripLeadingAndTrailingHTTPSpaces(value);
+    if (!isValidHTTPToken(name) || !isValidHTTPHeaderValue(normalizedValue)) {
         ec = SYNTAX_ERR;
         return;
     }
@@ -951,7 +952,7 @@
         return;
     }
 
-    setRequestHeaderInternal(name, value);
+    setRequestHeaderInternal(name, normalizedValue);
 }
 
 void XMLHttpRequest::setRequestHeaderInternal(const String& name, const String& value)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to