<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[200655] trunk/Source</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/200655">200655</a></dd>
<dt>Author</dt> <dd>achristensen@apple.com</dd>
<dt>Date</dt> <dd>2016-05-10 16:49:01 -0700 (Tue, 10 May 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Handle _schemeUpgraded delegate callbacks in NSURLSessionDataDelegate
https://bugs.webkit.org/show_bug.cgi?id=157354
rdar://problem/25842107

Reviewed by Darin Adler.

Source/WebCore:

No new tests.  This cannot be tested with a self-signed certificate.
This needs to be tested once we use real ssl certificates for testing.

* platform/network/mac/WebCoreResourceHandleAsDelegate.mm:
(-[WebCoreResourceHandleAsDelegate connection:willSendRequest:redirectResponse:]):
* platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm:
(-[WebCoreResourceHandleAsOperationQueueDelegate connection:willSendRequest:redirectResponse:]):
* platform/network/mac/WebCoreURLResponse.h:
* platform/network/mac/WebCoreURLResponse.mm:
(WebCore::synthesizeRedirectResponseIfNecessary):
Take the NSURLRequest instead of the NSURLConnection as a parameter so we can share this code with the NSURLSession loader,
which has an NSURLSessionDataTask.  Both have the currentRequest, which is all we need in this function anyway.

Source/WebKit2:

* NetworkProcess/cocoa/NetworkSessionCocoa.mm:
(-[WKNetworkSessionDelegate URLSession:task:_schemeUpgraded:completionHandler:]):
When we make a request to a http url and CFNetwork determines that that url would have redirected to an HSTS site
and it is going to change the request to an https request, this delegate callback is called.  We need to call the
redirection code to have the same behavior as the NSURLConnection-based loader.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkmacWebCoreResourceHandleAsDelegatemm">trunk/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsDelegate.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkmacWebCoreResourceHandleAsOperationQueueDelegatemm">trunk/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkmacWebCoreURLResponseh">trunk/Source/WebCore/platform/network/mac/WebCoreURLResponse.h</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkmacWebCoreURLResponsemm">trunk/Source/WebCore/platform/network/mac/WebCoreURLResponse.mm</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscocoaNetworkSessionCocoamm">trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (200654 => 200655)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-05-10 23:47:10 UTC (rev 200654)
+++ trunk/Source/WebCore/ChangeLog        2016-05-10 23:49:01 UTC (rev 200655)
</span><span class="lines">@@ -1,3 +1,24 @@
</span><ins>+2016-05-10  Alex Christensen  &lt;achristensen@webkit.org&gt;
+
+        Handle _schemeUpgraded delegate callbacks in NSURLSessionDataDelegate
+        https://bugs.webkit.org/show_bug.cgi?id=157354
+        rdar://problem/25842107
+
+        Reviewed by Darin Adler.
+
+        No new tests.  This cannot be tested with a self-signed certificate.
+        This needs to be tested once we use real ssl certificates for testing.
+
+        * platform/network/mac/WebCoreResourceHandleAsDelegate.mm:
+        (-[WebCoreResourceHandleAsDelegate connection:willSendRequest:redirectResponse:]):
+        * platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm:
+        (-[WebCoreResourceHandleAsOperationQueueDelegate connection:willSendRequest:redirectResponse:]):
+        * platform/network/mac/WebCoreURLResponse.h:
+        * platform/network/mac/WebCoreURLResponse.mm:
+        (WebCore::synthesizeRedirectResponseIfNecessary):
+        Take the NSURLRequest instead of the NSURLConnection as a parameter so we can share this code with the NSURLSession loader,
+        which has an NSURLSessionDataTask.  Both have the currentRequest, which is all we need in this function anyway.
+
</ins><span class="cx"> 2016-05-10  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: Backend should initiate timeline recordings on page navigations to ensure nothing is missed
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkmacWebCoreResourceHandleAsDelegatemm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsDelegate.mm (200654 => 200655)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsDelegate.mm        2016-05-10 23:47:10 UTC (rev 200654)
+++ trunk/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsDelegate.mm        2016-05-10 23:49:01 UTC (rev 200655)
</span><span class="lines">@@ -64,7 +64,7 @@
</span><span class="cx">     if (!m_handle)
</span><span class="cx">         return nil;
</span><span class="cx"> 
</span><del>-    redirectResponse = synthesizeRedirectResponseIfNecessary(connection, newRequest, redirectResponse);
</del><ins>+    redirectResponse = synthesizeRedirectResponseIfNecessary([connection currentRequest], newRequest, redirectResponse);
</ins><span class="cx">     
</span><span class="cx">     // See &lt;rdar://problem/5380697&gt;. This is a workaround for a behavior change in CFNetwork where willSendRequest gets called more often.
</span><span class="cx">     if (!redirectResponse)
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkmacWebCoreResourceHandleAsOperationQueueDelegatemm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm (200654 => 200655)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm        2016-05-10 23:47:10 UTC (rev 200654)
+++ trunk/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm        2016-05-10 23:49:01 UTC (rev 200655)
</span><span class="lines">@@ -100,7 +100,7 @@
</span><span class="cx">     ASSERT(!isMainThread());
</span><span class="cx">     UNUSED_PARAM(connection);
</span><span class="cx"> 
</span><del>-    redirectResponse = synthesizeRedirectResponseIfNecessary(connection, newRequest, redirectResponse);
</del><ins>+    redirectResponse = synthesizeRedirectResponseIfNecessary([connection currentRequest], newRequest, redirectResponse);
</ins><span class="cx"> 
</span><span class="cx">     // See &lt;rdar://problem/5380697&gt;. This is a workaround for a behavior change in CFNetwork where willSendRequest gets called more often.
</span><span class="cx">     if (!redirectResponse)
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkmacWebCoreURLResponseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/mac/WebCoreURLResponse.h (200654 => 200655)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/mac/WebCoreURLResponse.h        2016-05-10 23:47:10 UTC (rev 200654)
+++ trunk/Source/WebCore/platform/network/mac/WebCoreURLResponse.h        2016-05-10 23:49:01 UTC (rev 200655)
</span><span class="lines">@@ -38,7 +38,7 @@
</span><span class="cx"> @class NSURLResponse;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><del>-WEBCORE_EXPORT NSURLResponse *synthesizeRedirectResponseIfNecessary(NSURLConnection *, NSURLRequest *newRequest, NSURLResponse *redirectResponse);
</del><ins>+WEBCORE_EXPORT NSURLResponse *synthesizeRedirectResponseIfNecessary(NSURLRequest *currentRequest, NSURLRequest *newRequest, NSURLResponse *redirectResponse);
</ins><span class="cx"> }
</span><span class="cx"> #endif // __OBJC__
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkmacWebCoreURLResponsemm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/mac/WebCoreURLResponse.mm (200654 => 200655)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/mac/WebCoreURLResponse.mm        2016-05-10 23:47:10 UTC (rev 200654)
+++ trunk/Source/WebCore/platform/network/mac/WebCoreURLResponse.mm        2016-05-10 23:49:01 UTC (rev 200655)
</span><span class="lines">@@ -326,18 +326,18 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if !USE(CFNETWORK)
</span><del>-NSURLResponse *synthesizeRedirectResponseIfNecessary(NSURLConnection *connection, NSURLRequest *newRequest, NSURLResponse *redirectResponse)
</del><ins>+NSURLResponse *synthesizeRedirectResponseIfNecessary(NSURLRequest *currentRequest, NSURLRequest *newRequest, NSURLResponse *redirectResponse)
</ins><span class="cx"> {
</span><span class="cx">     if (redirectResponse)
</span><span class="cx">         return redirectResponse;
</span><span class="cx"> 
</span><del>-    if ([[[newRequest URL] scheme] isEqualToString:[[[connection currentRequest] URL] scheme]])
</del><ins>+    if ([[[newRequest URL] scheme] isEqualToString:[[currentRequest URL] scheme]])
</ins><span class="cx">         return nil;
</span><span class="cx"> 
</span><span class="cx">     // If the new request is a different protocol than the current request, synthesize a redirect response.
</span><span class="cx">     // This is critical for HSTS (&lt;rdar://problem/14241270&gt;).
</span><span class="cx">     NSDictionary *synthesizedResponseHeaderFields = @{ @&quot;Location&quot;: [[newRequest URL] absoluteString], @&quot;Cache-Control&quot;: @&quot;no-store&quot; };
</span><del>-    return [[[NSHTTPURLResponse alloc] initWithURL:[[connection currentRequest] URL] statusCode:302 HTTPVersion:(NSString *)kCFHTTPVersion1_1 headerFields:synthesizedResponseHeaderFields] autorelease];
</del><ins>+    return [[[NSHTTPURLResponse alloc] initWithURL:[currentRequest URL] statusCode:302 HTTPVersion:(NSString *)kCFHTTPVersion1_1 headerFields:synthesizedResponseHeaderFields] autorelease];
</ins><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (200654 => 200655)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-05-10 23:47:10 UTC (rev 200654)
+++ trunk/Source/WebKit2/ChangeLog        2016-05-10 23:49:01 UTC (rev 200655)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2016-05-10  Alex Christensen  &lt;achristensen@webkit.org&gt;
+
+        Handle _schemeUpgraded delegate callbacks in NSURLSessionDataDelegate
+        https://bugs.webkit.org/show_bug.cgi?id=157354
+        rdar://problem/25842107
+
+        Reviewed by Darin Adler.
+
+        * NetworkProcess/cocoa/NetworkSessionCocoa.mm:
+        (-[WKNetworkSessionDelegate URLSession:task:_schemeUpgraded:completionHandler:]):
+        When we make a request to a http url and CFNetwork determines that that url would have redirected to an HSTS site
+        and it is going to change the request to an https request, this delegate callback is called.  We need to call the
+        redirection code to have the same behavior as the NSURLConnection-based loader.
+
</ins><span class="cx"> 2016-05-10  Csaba Osztrogonác  &lt;ossy@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Fix the !ENABLE(VIDEO) build
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscocoaNetworkSessionCocoamm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm (200654 => 200655)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm        2016-05-10 23:47:10 UTC (rev 200654)
+++ trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm        2016-05-10 23:49:01 UTC (rev 200655)
</span><span class="lines">@@ -125,6 +125,19 @@
</span><span class="cx">         completionHandler(nil);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask*)task _schemeUpgraded:(NSURLRequest*)request completionHandler:(void (^)(NSURLRequest*))completionHandler
+{
+    auto storedCredentials = _withCredentials ? WebCore::StoredCredentials::AllowStoredCredentials : WebCore::StoredCredentials::DoNotAllowStoredCredentials;
+    if (auto* networkDataTask = _session-&gt;dataTaskForIdentifier(task.taskIdentifier, storedCredentials)) {
+        auto completionHandlerCopy = Block_copy(completionHandler);
+        networkDataTask-&gt;willPerformHTTPRedirection(WebCore::synthesizeRedirectResponseIfNecessary([task currentRequest], request, nil), request, [completionHandlerCopy](const WebCore::ResourceRequest&amp; request) {
+            completionHandlerCopy(request.nsURLRequest(WebCore::UpdateHTTPBody));
+            Block_release(completionHandlerCopy);
+        });
+    } else
+        completionHandler(nil);
+}
+
</ins><span class="cx"> - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask willCacheResponse:(NSCachedURLResponse *)proposedResponse completionHandler:(void (^)(NSCachedURLResponse * _Nullable cachedResponse))completionHandler
</span><span class="cx"> {
</span><span class="cx">     // FIXME: remove if &lt;rdar://problem/20001985&gt; is ever resolved.
</span></span></pre>
</div>
</div>

</body>
</html>