Title: [224386] trunk/Source/WebCore
Revision
224386
Author
commit-qu...@webkit.org
Date
2017-11-02 23:05:33 -0700 (Thu, 02 Nov 2017)

Log Message

[Curl] Fix cancellation process implementation
https://bugs.webkit.org/show_bug.cgi?id=179199

Patch by Basuke Suzuki <basuke.suz...@sony.com> on 2017-11-02
Reviewed by Alex Christensen.

* platform/network/curl/CurlRequest.cpp:
(WebCore::CurlRequest::cancel):
(WebCore::CurlRequest::willSendData):
(WebCore::CurlRequest::didReceiveHeader):
(WebCore::CurlRequest::didReceiveData):
(WebCore::CurlRequest::completeDidReceiveResponse):
(WebCore::CurlRequest::pausedStatusChanged):
* platform/network/curl/CurlRequest.h:
(WebCore::CurlRequest::isSyncRequest const):
(WebCore::CurlRequest::isCompletedOrCancelled const):
(WebCore::CurlRequest::needToInvokeDidCancelTransfer const):
(WebCore::CurlRequest::isSyncRequest): Deleted.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (224385 => 224386)


--- trunk/Source/WebCore/ChangeLog	2017-11-03 05:33:45 UTC (rev 224385)
+++ trunk/Source/WebCore/ChangeLog	2017-11-03 06:05:33 UTC (rev 224386)
@@ -1,3 +1,23 @@
+2017-11-02  Basuke Suzuki  <basuke.suz...@sony.com>
+
+        [Curl] Fix cancellation process implementation
+        https://bugs.webkit.org/show_bug.cgi?id=179199
+
+        Reviewed by Alex Christensen.
+
+        * platform/network/curl/CurlRequest.cpp:
+        (WebCore::CurlRequest::cancel):
+        (WebCore::CurlRequest::willSendData):
+        (WebCore::CurlRequest::didReceiveHeader):
+        (WebCore::CurlRequest::didReceiveData):
+        (WebCore::CurlRequest::completeDidReceiveResponse):
+        (WebCore::CurlRequest::pausedStatusChanged):
+        * platform/network/curl/CurlRequest.h:
+        (WebCore::CurlRequest::isSyncRequest const):
+        (WebCore::CurlRequest::isCompletedOrCancelled const):
+        (WebCore::CurlRequest::needToInvokeDidCancelTransfer const):
+        (WebCore::CurlRequest::isSyncRequest): Deleted.
+
 2017-11-02  Brady Eidson  <beid...@apple.com>
 
         SW: Implement "Update Registration State" algorithm (unused for now)

Modified: trunk/Source/WebCore/platform/network/curl/CurlRequest.cpp (224385 => 224386)


--- trunk/Source/WebCore/platform/network/curl/CurlRequest.cpp	2017-11-03 05:33:45 UTC (rev 224385)
+++ trunk/Source/WebCore/platform/network/curl/CurlRequest.cpp	2017-11-03 06:05:33 UTC (rev 224386)
@@ -103,14 +103,25 @@
 {
     ASSERT(isMainThread());
 
-    if (m_cancelled)
+    if (isCompletedOrCancelled())
         return;
 
     m_cancelled = true;
 
-    if (!m_isSyncRequest)
-        CurlRequestScheduler::singleton().cancel(this);
+    if (!m_isSyncRequest) {
+        auto& scheduler = CurlRequestScheduler::singleton();
 
+        if (needToInvokeDidCancelTransfer()) {
+            scheduler.callOnWorkerThread([protectedThis = makeRef(*this)]() {
+                protectedThis->didCancelTransfer();
+            });
+        } else
+            scheduler.cancel(this);
+    } else {
+        if (needToInvokeDidCancelTransfer())
+            didCancelTransfer();
+    }
+
     setRequestPaused(false);
     setCallbackPaused(false);
 }
@@ -226,7 +237,7 @@
 
 size_t CurlRequest::willSendData(char* ptr, size_t blockSize, size_t numberOfBlocks)
 {
-    if (m_cancelled)
+    if (isCompletedOrCancelled())
         return CURL_READFUNC_ABORT;
 
     if (!blockSize || !numberOfBlocks)
@@ -252,7 +263,7 @@
     static const auto emptyLineCRLF = "\r\n";
     static const auto emptyLineLF = "\n";
 
-    if (m_cancelled)
+    if (isCompletedOrCancelled())
         return 0;
 
     // libcurl sends all headers that libcurl received to application.
@@ -308,7 +319,7 @@
 
 size_t CurlRequest::didReceiveData(Ref<SharedBuffer>&& buffer)
 {
-    if (m_cancelled)
+    if (isCompletedOrCancelled())
         return 0;
 
     if (needToInvokeDidReceiveResponse()) {
@@ -525,7 +536,7 @@
     ASSERT(m_didNotifyResponse);
     ASSERT(!m_didReturnFromNotify);
 
-    if (m_cancelled)
+    if (isCompletedOrCancelled())
         return;
 
     m_didReturnFromNotify = true;
@@ -537,7 +548,6 @@
         // Start transfer for file scheme
         startWithJobManager();
     } else if (m_actionAfterInvoke == Action::FinishTransfer) {
-        // Keep the calling thread of didCompleteTransfer()
         if (!m_isSyncRequest) {
             CurlRequestScheduler::singleton().callOnWorkerThread([protectedThis = makeRef(*this), finishedResultCode = m_finishedResultCode]() {
                 protectedThis->didCompleteTransfer(finishedResultCode);
@@ -577,18 +587,20 @@
 
 void CurlRequest::pausedStatusChanged()
 {
-    if (m_cancelled || !m_curlHandle)
+    if (isCompletedOrCancelled())
         return;
 
     if (!m_isSyncRequest && isMainThread()) {
         CurlRequestScheduler::singleton().callOnWorkerThread([protectedThis = makeRef(*this), paused = isPaused()]() {
-            if (protectedThis->m_cancelled)
+            if (protectedThis->isCompletedOrCancelled())
                 return;
 
             auto error = protectedThis->m_curlHandle->pause(paused ? CURLPAUSE_ALL : CURLPAUSE_CONT);
             if ((error != CURLE_OK) && !paused) {
                 // Restarting the handle has failed so just cancel it.
-                protectedThis->cancel();
+                callOnMainThread([protectedThis = makeRef(protectedThis.get())]() {
+                    protectedThis->cancel();
+                });
             }
         });
     } else {

Modified: trunk/Source/WebCore/platform/network/curl/CurlRequest.h (224385 => 224386)


--- trunk/Source/WebCore/platform/network/curl/CurlRequest.h	2017-11-03 05:33:45 UTC (rev 224385)
+++ trunk/Source/WebCore/platform/network/curl/CurlRequest.h	2017-11-03 06:05:33 UTC (rev 224386)
@@ -59,8 +59,10 @@
     void suspend();
     void resume();
 
-    bool isSyncRequest() { return m_isSyncRequest; }
+    bool isSyncRequest() const { return m_isSyncRequest; }
+    bool isCompletedOrCancelled() const { return !m_curlHandle || m_cancelled; }
 
+
     // Processing for DidReceiveResponse
     void completeDidReceiveResponse();
 
@@ -107,6 +109,7 @@
 
     // Processing for DidReceiveResponse
     bool needToInvokeDidReceiveResponse() const { return !m_didNotifyResponse || !m_didReturnFromNotify; }
+    bool needToInvokeDidCancelTransfer() const { return m_didNotifyResponse && !m_didReturnFromNotify && m_actionAfterInvoke == Action::FinishTransfer; }
     void invokeDidReceiveResponseForFile(URL&);
     void invokeDidReceiveResponse(Action);
     void setRequestPaused(bool);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to