Title: [214807] trunk
Revision
214807
Author
carlo...@webkit.org
Date
2017-04-03 10:08:12 -0700 (Mon, 03 Apr 2017)

Log Message

[SOUP] URI Fragment is lost after redirect
https://bugs.webkit.org/show_bug.cgi?id=170058

Reviewed by Michael Catanzaro.

Source/WebKit2:

In case of redirection check if the current request has a fragment identifier and apply it to the redirection
only when it doesn't have a fragment identifier yet.

* NetworkProcess/soup/NetworkDataTaskSoup.cpp:
(WebKit::NetworkDataTaskSoup::NetworkDataTaskSoup):
(WebKit::NetworkDataTaskSoup::createRequest):
(WebKit::NetworkDataTaskSoup::continueHTTPRedirection):
* NetworkProcess/soup/NetworkDataTaskSoup.h:

LayoutTests:

Add tests to check we correctly handle fragment identifiers on server redirections.

* http/tests/navigation/redirect-preserves-fragment-expected.txt: Added.
* http/tests/navigation/redirect-preserves-fragment.html: Added.
* http/tests/navigation/redirect-to-fragment-expected.txt: Added.
* http/tests/navigation/redirect-to-fragment.html: Added.
* http/tests/navigation/redirect-to-fragment2-expected.txt: Added.
* http/tests/navigation/redirect-to-fragment2.html: Added.
* http/tests/navigation/resources/redirect-preserves-fragment.php: Added.
* http/tests/navigation/resources/redirect-to-fragment.php: Added.
* http/tests/navigation/resources/redirect-to-fragment2.php: Added.
* platform/ios/TestExpectations:
* platform/mac/TestExpectations:

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (214806 => 214807)


--- trunk/LayoutTests/ChangeLog	2017-04-03 16:59:41 UTC (rev 214806)
+++ trunk/LayoutTests/ChangeLog	2017-04-03 17:08:12 UTC (rev 214807)
@@ -1,3 +1,24 @@
+2017-04-03  Carlos Garcia Campos  <cgar...@igalia.com>
+
+        [SOUP] URI Fragment is lost after redirect
+        https://bugs.webkit.org/show_bug.cgi?id=170058
+
+        Reviewed by Michael Catanzaro.
+
+        Add tests to check we correctly handle fragment identifiers on server redirections.
+
+        * http/tests/navigation/redirect-preserves-fragment-expected.txt: Added.
+        * http/tests/navigation/redirect-preserves-fragment.html: Added.
+        * http/tests/navigation/redirect-to-fragment-expected.txt: Added.
+        * http/tests/navigation/redirect-to-fragment.html: Added.
+        * http/tests/navigation/redirect-to-fragment2-expected.txt: Added.
+        * http/tests/navigation/redirect-to-fragment2.html: Added.
+        * http/tests/navigation/resources/redirect-preserves-fragment.php: Added.
+        * http/tests/navigation/resources/redirect-to-fragment.php: Added.
+        * http/tests/navigation/resources/redirect-to-fragment2.php: Added.
+        * platform/ios/TestExpectations:
+        * platform/mac/TestExpectations:
+
 2017-04-03  Youenn Fablet  <you...@apple.com>
 
         captureStream is getting black frames with webgl canvas

Added: trunk/LayoutTests/http/tests/navigation/redirect-preserves-fragment-expected.txt (0 => 214807)


--- trunk/LayoutTests/http/tests/navigation/redirect-preserves-fragment-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/http/tests/navigation/redirect-preserves-fragment-expected.txt	2017-04-03 17:08:12 UTC (rev 214807)
@@ -0,0 +1,7 @@
+http://127.0.0.1:8000/navigation/resources/redirect-preserves-fragment.php#foo - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/navigation/resources/redirect-preserves-fragment.php#foo, main document URL http://127.0.0.1:8000/navigation/redirect-preserves-fragment.html, http method GET> redirectResponse (null)
+http://127.0.0.1:8000/navigation/redirect-preserves-fragment.html - didFinishLoading
+http://127.0.0.1:8000/navigation/resources/redirect-preserves-fragment.php#foo - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/navigation/resources/success.html#foo, main document URL http://127.0.0.1:8000/navigation/redirect-preserves-fragment.html, http method GET> redirectResponse <NSURLResponse http://127.0.0.1:8000/navigation/resources/redirect-preserves-fragment.php#foo, http status code 302>
+http://127.0.0.1:8000/navigation/resources/redirect-preserves-fragment.php#foo - didReceiveResponse <NSURLResponse http://127.0.0.1:8000/navigation/resources/success.html#foo, http status code 200>
+Test passes if WebKit preserves the request fragment identifier after the redirection.
+
+

Added: trunk/LayoutTests/http/tests/navigation/redirect-preserves-fragment.html (0 => 214807)


--- trunk/LayoutTests/http/tests/navigation/redirect-preserves-fragment.html	                        (rev 0)
+++ trunk/LayoutTests/http/tests/navigation/redirect-preserves-fragment.html	2017-04-03 17:08:12 UTC (rev 214807)
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+if (window.testRunner) {
+    testRunner.dumpAsText();
+    testRunner.dumpResourceLoadCallbacks();
+    testRunner.waitUntilDone();
+}
+
+_onload_ = function() {
+    if (window.testRunner)
+        testRunner.notifyDone();
+}
+</script>
+</head>
+<body>
+<p>Test passes if WebKit preserves the request fragment identifier after the redirection.</p>
+<iframe src=""
+</body>
+</html>

Added: trunk/LayoutTests/http/tests/navigation/redirect-to-fragment-expected.txt (0 => 214807)


--- trunk/LayoutTests/http/tests/navigation/redirect-to-fragment-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/http/tests/navigation/redirect-to-fragment-expected.txt	2017-04-03 17:08:12 UTC (rev 214807)
@@ -0,0 +1,7 @@
+http://127.0.0.1:8000/navigation/resources/redirect-to-fragment.php#foo - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/navigation/resources/redirect-to-fragment.php#foo, main document URL http://127.0.0.1:8000/navigation/redirect-to-fragment.html, http method GET> redirectResponse (null)
+http://127.0.0.1:8000/navigation/redirect-to-fragment.html - didFinishLoading
+http://127.0.0.1:8000/navigation/resources/redirect-to-fragment.php#foo - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/navigation/resources/success.html#bar, main document URL http://127.0.0.1:8000/navigation/redirect-to-fragment.html, http method GET> redirectResponse <NSURLResponse http://127.0.0.1:8000/navigation/resources/redirect-to-fragment.php#foo, http status code 302>
+http://127.0.0.1:8000/navigation/resources/redirect-to-fragment.php#foo - didReceiveResponse <NSURLResponse http://127.0.0.1:8000/navigation/resources/success.html#bar, http status code 200>
+Test passes if WebKit ignores the request fragment identifier after the redirect to a url with a fragment identifier.
+
+

Added: trunk/LayoutTests/http/tests/navigation/redirect-to-fragment.html (0 => 214807)


--- trunk/LayoutTests/http/tests/navigation/redirect-to-fragment.html	                        (rev 0)
+++ trunk/LayoutTests/http/tests/navigation/redirect-to-fragment.html	2017-04-03 17:08:12 UTC (rev 214807)
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+if (window.testRunner) {
+    testRunner.dumpAsText();
+    testRunner.dumpResourceLoadCallbacks();
+    testRunner.waitUntilDone();
+}
+
+_onload_ = function() {
+    if (window.testRunner)
+        testRunner.notifyDone();
+}
+</script>
+</head>
+<body>
+<p>Test passes if WebKit ignores the request fragment identifier after the redirect to a url with a fragment identifier.</p>
+<iframe src=""
+</body>
+</html>

Added: trunk/LayoutTests/http/tests/navigation/redirect-to-fragment2-expected.txt (0 => 214807)


--- trunk/LayoutTests/http/tests/navigation/redirect-to-fragment2-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/http/tests/navigation/redirect-to-fragment2-expected.txt	2017-04-03 17:08:12 UTC (rev 214807)
@@ -0,0 +1,8 @@
+http://127.0.0.1:8000/navigation/resources/redirect-to-fragment2.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/navigation/resources/redirect-to-fragment2.php, main document URL http://127.0.0.1:8000/navigation/redirect-to-fragment2.html, http method GET> redirectResponse (null)
+http://127.0.0.1:8000/navigation/redirect-to-fragment2.html - didFinishLoading
+http://127.0.0.1:8000/navigation/resources/redirect-to-fragment2.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/navigation/resources/redirect-preserves-fragment.php#bar, main document URL http://127.0.0.1:8000/navigation/redirect-to-fragment2.html, http method GET> redirectResponse <NSURLResponse http://127.0.0.1:8000/navigation/resources/redirect-to-fragment2.php, http status code 302>
+http://127.0.0.1:8000/navigation/resources/redirect-to-fragment2.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/navigation/resources/success.html#bar, main document URL http://127.0.0.1:8000/navigation/redirect-to-fragment2.html, http method GET> redirectResponse <NSURLResponse http://127.0.0.1:8000/navigation/resources/redirect-preserves-fragment.php#bar, http status code 302>
+http://127.0.0.1:8000/navigation/resources/redirect-to-fragment2.php - didReceiveResponse <NSURLResponse http://127.0.0.1:8000/navigation/resources/success.html#bar, http status code 200>
+Test passes if WebKit keeps fragment identifier from first redirected URL.
+
+

Added: trunk/LayoutTests/http/tests/navigation/redirect-to-fragment2.html (0 => 214807)


--- trunk/LayoutTests/http/tests/navigation/redirect-to-fragment2.html	                        (rev 0)
+++ trunk/LayoutTests/http/tests/navigation/redirect-to-fragment2.html	2017-04-03 17:08:12 UTC (rev 214807)
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+if (window.testRunner) {
+    testRunner.dumpAsText();
+    testRunner.dumpResourceLoadCallbacks();
+    testRunner.waitUntilDone();
+}
+
+_onload_ = function() {
+    if (window.testRunner)
+        testRunner.notifyDone();
+}
+</script>
+</head>
+<body>
+<p>Test passes if WebKit keeps fragment identifier from first redirected URL.</p>
+<iframe src=""
+</body>
+</html>

Added: trunk/LayoutTests/http/tests/navigation/resources/redirect-preserves-fragment.php (0 => 214807)


--- trunk/LayoutTests/http/tests/navigation/resources/redirect-preserves-fragment.php	                        (rev 0)
+++ trunk/LayoutTests/http/tests/navigation/resources/redirect-preserves-fragment.php	2017-04-03 17:08:12 UTC (rev 214807)
@@ -0,0 +1,4 @@
+<?php
+header('Location: success.html');
+?>
+

Added: trunk/LayoutTests/http/tests/navigation/resources/redirect-to-fragment.php (0 => 214807)


--- trunk/LayoutTests/http/tests/navigation/resources/redirect-to-fragment.php	                        (rev 0)
+++ trunk/LayoutTests/http/tests/navigation/resources/redirect-to-fragment.php	2017-04-03 17:08:12 UTC (rev 214807)
@@ -0,0 +1,4 @@
+<?php
+header('Location: success.html#bar');
+?>
+

Added: trunk/LayoutTests/http/tests/navigation/resources/redirect-to-fragment2.php (0 => 214807)


--- trunk/LayoutTests/http/tests/navigation/resources/redirect-to-fragment2.php	                        (rev 0)
+++ trunk/LayoutTests/http/tests/navigation/resources/redirect-to-fragment2.php	2017-04-03 17:08:12 UTC (rev 214807)
@@ -0,0 +1,4 @@
+<?php
+header('Location: redirect-preserves-fragment.php#bar');
+?>
+

Modified: trunk/LayoutTests/platform/ios/TestExpectations (214806 => 214807)


--- trunk/LayoutTests/platform/ios/TestExpectations	2017-04-03 16:59:41 UTC (rev 214806)
+++ trunk/LayoutTests/platform/ios/TestExpectations	2017-04-03 17:08:12 UTC (rev 214807)
@@ -2931,3 +2931,5 @@
 fast/css-generated-content/initial-letter-pagination-sunken.html [ Skip ]
 fast/css-generated-content/initial-letter-pagination-raised-rl.html [ Skip ]
 fast/css-generated-content/initial-letter-pagination-sunken-rl.html [ Skip ]
+
+webkit.org/b/158420 http/tests/navigation/redirect-to-fragment2.html [ Failure ]

Modified: trunk/LayoutTests/platform/mac/TestExpectations (214806 => 214807)


--- trunk/LayoutTests/platform/mac/TestExpectations	2017-04-03 16:59:41 UTC (rev 214806)
+++ trunk/LayoutTests/platform/mac/TestExpectations	2017-04-03 17:08:12 UTC (rev 214807)
@@ -1568,3 +1568,5 @@
 webkit.org/b/168132 http/tests/xmlhttprequest/simple-cross-origin-progress-events.html [ Pass Timeout ]
 
 webkit.org/b/169838 [ Release ] fast/workers/worker-close-more.html [ Pass Timeout ]
+
+webkit.org/b/158420 http/tests/navigation/redirect-to-fragment2.html [ Failure ]

Modified: trunk/Source/WebKit2/ChangeLog (214806 => 214807)


--- trunk/Source/WebKit2/ChangeLog	2017-04-03 16:59:41 UTC (rev 214806)
+++ trunk/Source/WebKit2/ChangeLog	2017-04-03 17:08:12 UTC (rev 214807)
@@ -1,3 +1,19 @@
+2017-04-03  Carlos Garcia Campos  <cgar...@igalia.com>
+
+        [SOUP] URI Fragment is lost after redirect
+        https://bugs.webkit.org/show_bug.cgi?id=170058
+
+        Reviewed by Michael Catanzaro.
+
+        In case of redirection check if the current request has a fragment identifier and apply it to the redirection
+        only when it doesn't have a fragment identifier yet.
+
+        * NetworkProcess/soup/NetworkDataTaskSoup.cpp:
+        (WebKit::NetworkDataTaskSoup::NetworkDataTaskSoup):
+        (WebKit::NetworkDataTaskSoup::createRequest):
+        (WebKit::NetworkDataTaskSoup::continueHTTPRedirection):
+        * NetworkProcess/soup/NetworkDataTaskSoup.h:
+
 2017-04-03  Antti Koivisto  <an...@apple.com>
 
         Mutex may be freed too late in NetworkCache::Storage::traverse

Modified: trunk/Source/WebKit2/NetworkProcess/soup/NetworkDataTaskSoup.cpp (214806 => 214807)


--- trunk/Source/WebKit2/NetworkProcess/soup/NetworkDataTaskSoup.cpp	2017-04-03 16:59:41 UTC (rev 214806)
+++ trunk/Source/WebKit2/NetworkProcess/soup/NetworkDataTaskSoup.cpp	2017-04-03 17:08:12 UTC (rev 214807)
@@ -75,7 +75,7 @@
         }
         applyAuthenticationToRequest(request);
     }
-    createRequest(request);
+    createRequest(WTFMove(request));
 }
 
 NetworkDataTaskSoup::~NetworkDataTaskSoup()
@@ -102,9 +102,11 @@
     m_allowOverwriteDownload = allowOverwrite;
 }
 
-void NetworkDataTaskSoup::createRequest(const ResourceRequest& request)
+void NetworkDataTaskSoup::createRequest(ResourceRequest&& request)
 {
-    GUniquePtr<SoupURI> soupURI = request.createSoupURI();
+    m_currentRequest = WTFMove(request);
+
+    GUniquePtr<SoupURI> soupURI = m_currentRequest.createSoupURI();
     if (!soupURI) {
         scheduleFailure(InvalidURLFailure);
         return;
@@ -116,9 +118,9 @@
         return;
     }
 
-    request.updateSoupRequest(soupRequest.get());
+    m_currentRequest.updateSoupRequest(soupRequest.get());
 
-    if (!request.url().protocolIsInHTTPFamily()) {
+    if (!m_currentRequest.url().protocolIsInHTTPFamily()) {
         m_soupRequest = WTFMove(soupRequest);
         return;
     }
@@ -132,7 +134,7 @@
 
     unsigned messageFlags = SOUP_MESSAGE_NO_REDIRECT;
 
-    request.updateSoupMessage(soupMessage.get());
+    m_currentRequest.updateSoupMessage(soupMessage.get());
     if (m_shouldContentSniff == DoNotSniffContent)
         soup_message_disable_feature(soupMessage.get(), SOUP_TYPE_CONTENT_SNIFFER);
     if (m_user.isEmpty() && m_password.isEmpty() && m_storedCredentials == DoNotAllowStoredCredentials) {
@@ -158,7 +160,7 @@
     soup_message_set_flags(soupMessage.get(), static_cast<SoupMessageFlags>(soup_message_get_flags(soupMessage.get()) | messageFlags));
 
 #if SOUP_CHECK_VERSION(2, 43, 1)
-    soup_message_set_priority(soupMessage.get(), toSoupMessagePriority(request.priority()));
+    soup_message_set_priority(soupMessage.get(), toSoupMessagePriority(m_currentRequest.priority()));
 #endif
 
     m_soupRequest = WTFMove(soupRequest);
@@ -636,14 +638,17 @@
         return;
     }
 
-    ResourceRequest request = m_firstRequest;
-    request.setURL(URL(m_response.url(), m_response.httpHeaderField(HTTPHeaderName::Location)));
+    ResourceRequest request = m_currentRequest;
+    URL redirectedURL = URL(m_response.url(), m_response.httpHeaderField(HTTPHeaderName::Location));
+    if (!redirectedURL.hasFragmentIdentifier() && request.url().hasFragmentIdentifier())
+        redirectedURL.setFragmentIdentifier(request.url().fragmentIdentifier());
+    request.setURL(redirectedURL);
 
     // Should not set Referer after a redirect from a secure resource to non-secure one.
     if (m_shouldClearReferrerOnHTTPSToHTTPRedirect && !request.url().protocolIs("https") && protocolIs(request.httpReferrer(), "https"))
         request.clearHTTPReferrer();
 
-    bool isCrossOrigin = !protocolHostAndPortAreEqual(m_firstRequest.url(), request.url());
+    bool isCrossOrigin = !protocolHostAndPortAreEqual(m_currentRequest.url(), request.url());
     if (!equalLettersIgnoringASCIICase(request.httpMethod(), "get")) {
         // Change newRequest method to GET if change was made during a previous redirection or if current redirection says so.
         if (m_soupMessage->method == SOUP_METHOD_GET || !request.url().protocolIsInHTTPFamily() || shouldRedirectAsGET(m_soupMessage.get(), isCrossOrigin)) {
@@ -689,7 +694,7 @@
 #endif
             applyAuthenticationToRequest(request);
         }
-        createRequest(request);
+        createRequest(WTFMove(request));
         if (m_soupRequest && m_state != State::Suspended) {
             m_state = State::Suspended;
             resume();

Modified: trunk/Source/WebKit2/NetworkProcess/soup/NetworkDataTaskSoup.h (214806 => 214807)


--- trunk/Source/WebKit2/NetworkProcess/soup/NetworkDataTaskSoup.h	2017-04-03 16:59:41 UTC (rev 214806)
+++ trunk/Source/WebKit2/NetworkProcess/soup/NetworkDataTaskSoup.h	2017-04-03 17:08:12 UTC (rev 214807)
@@ -59,7 +59,7 @@
     void startTimeout();
     void stopTimeout();
 
-    void createRequest(const WebCore::ResourceRequest&);
+    void createRequest(WebCore::ResourceRequest&&);
     void clearRequest();
     static void sendRequestCallback(SoupRequest*, GAsyncResult*, NetworkDataTaskSoup*);
     void didSendRequest(GRefPtr<GInputStream>&&);
@@ -129,6 +129,7 @@
     GRefPtr<GAsyncResult> m_pendingResult;
     WebCore::ProtectionSpace m_protectionSpaceForPersistentStorage;
     WebCore::Credential m_credentialForPersistentStorage;
+    WebCore::ResourceRequest m_currentRequest;
     WebCore::ResourceResponse m_response;
     Vector<char> m_readBuffer;
     unsigned m_redirectCount { 0 };
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to