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