Diff
Modified: trunk/Source/WebCore/ChangeLog (222268 => 222269)
--- trunk/Source/WebCore/ChangeLog 2017-09-20 17:21:19 UTC (rev 222268)
+++ trunk/Source/WebCore/ChangeLog 2017-09-20 17:31:06 UTC (rev 222269)
@@ -1,3 +1,24 @@
+2017-09-20 Basuke Suzuki <[email protected]>
+
+ [Curl] improve the implementation of FormDataStream
+ https://bugs.webkit.org/show_bug.cgi?id=177111
+
+ Reviewed by Alex Christensen.
+
+ * platform/network/curl/FormDataStreamCurl.cpp:
+ (WebCore::FormDataStream::read):
+ (WebCore::FormDataStream::hasMoreElements const):
+ * platform/network/curl/FormDataStreamCurl.h:
+ (WebCore::FormDataStream::setHTTPBody):
+ (WebCore::FormDataStream::FormDataStream): Deleted.
+ * platform/network/curl/ResourceHandleCurlDelegate.cpp:
+ (WebCore::ResourceHandleCurlDelegate::ResourceHandleCurlDelegate):
+ (WebCore::ResourceHandleCurlDelegate::prepareSendData):
+ (WebCore::ResourceHandleCurlDelegate::didFinish):
+ (WebCore::ResourceHandleCurlDelegate::didFail):
+ (WebCore::ResourceHandleCurlDelegate::setupFormData):
+ * platform/network/curl/ResourceHandleCurlDelegate.h:
+
2017-09-20 Miguel Gomez <[email protected]>
[GTK] Completely garbled display in GMail
Modified: trunk/Source/WebCore/platform/network/curl/FormDataStreamCurl.cpp (222268 => 222269)
--- trunk/Source/WebCore/platform/network/curl/FormDataStreamCurl.cpp 2017-09-20 17:21:19 UTC (rev 222268)
+++ trunk/Source/WebCore/platform/network/curl/FormDataStreamCurl.cpp 2017-09-20 17:31:06 UTC (rev 222269)
@@ -4,6 +4,7 @@
* Copyright (C) 2007 Alp Toker <[email protected]>
* Copyright (C) 2007 Holger Hans Peter Freyther
* Copyright (C) 2008 Collabora Ltd.
+ * Copyright (C) 2017 Sony Interactive Entertainment Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -29,14 +30,11 @@
*/
#include "config.h"
+#include "FormDataStreamCurl.h"
#if USE(CURL)
-#include "FormDataStreamCurl.h"
-
#include "FormData.h"
-#include "ResourceRequest.h"
-#include <wtf/text/CString.h>
namespace WebCore {
@@ -53,8 +51,8 @@
return 0;
Vector<FormDataElement> elements;
- if (m_resourceHandle->firstRequest().httpBody())
- elements = m_resourceHandle->firstRequest().httpBody()->elements();
+ if (m_formData)
+ elements = m_formData->elements();
if (m_formDataElementIndex >= elements.size())
return 0;
@@ -107,8 +105,8 @@
bool FormDataStream::hasMoreElements() const
{
Vector<FormDataElement> elements;
- if (m_resourceHandle->firstRequest().httpBody())
- elements = m_resourceHandle->firstRequest().httpBody()->elements();
+ if (m_formData)
+ elements = m_formData->elements();
return m_formDataElementIndex < elements.size();
}
Modified: trunk/Source/WebCore/platform/network/curl/FormDataStreamCurl.h (222268 => 222269)
--- trunk/Source/WebCore/platform/network/curl/FormDataStreamCurl.h 2017-09-20 17:21:19 UTC (rev 222268)
+++ trunk/Source/WebCore/platform/network/curl/FormDataStreamCurl.h 2017-09-20 17:31:06 UTC (rev 222269)
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2017 Sony Interactive Entertainment Inc.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -22,42 +23,32 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef FormDataStreamCurl_h
-#define FormDataStreamCurl_h
-#include "config.h"
+#pragma once
-#include "FileSystem.h"
-#include "ResourceHandle.h"
#include <stdio.h>
namespace WebCore {
+class FormData;
+
class FormDataStream {
public:
- FormDataStream(ResourceHandle* handle)
- : m_resourceHandle(handle)
- , m_file(0)
- , m_formDataElementIndex(0)
- , m_formDataElementDataOffset(0)
- {
- }
-
+ FormDataStream() = default;
~FormDataStream();
+ void setHTTPBody(FormData* formData) { m_formData = formData; }
size_t read(void* ptr, size_t blockSize, size_t numberOfBlocks);
bool hasMoreElements() const;
private:
- // We can hold a weak reference to our ResourceHandle as it holds a strong reference
- // to us through its ResourceHandleInternal.
- ResourceHandle* m_resourceHandle;
+ // We can hold a weak reference to our ResourceRequest as it holds a strong reference
+ // to us through its owner.
+ FormData* m_formData { };
- FILE* m_file;
- size_t m_formDataElementIndex;
- size_t m_formDataElementDataOffset;
+ FILE* m_file { };
+ size_t m_formDataElementIndex { 0 };
+ size_t m_formDataElementDataOffset { 0 };
};
} // namespace WebCore
-
-#endif // FormDataStreamCurl_h
Modified: trunk/Source/WebCore/platform/network/curl/ResourceHandleCurlDelegate.cpp (222268 => 222269)
--- trunk/Source/WebCore/platform/network/curl/ResourceHandleCurlDelegate.cpp 2017-09-20 17:21:19 UTC (rev 222268)
+++ trunk/Source/WebCore/platform/network/curl/ResourceHandleCurlDelegate.cpp 2017-09-20 17:31:06 UTC (rev 222269)
@@ -49,7 +49,6 @@
ResourceHandleCurlDelegate::ResourceHandleCurlDelegate(ResourceHandle* handle)
: m_handle(handle)
- , m_formDataStream(handle)
, m_firstRequest(handle->firstRequest().isolatedCopy())
, m_customHTTPHeaderFields(m_firstRequest.httpHeaderFields().isolatedCopy())
, m_shouldUseCredentialStorage(handle->shouldUseCredentialStorage())
@@ -427,13 +426,16 @@
std::unique_lock<Lock> lock(m_workerThreadMutex);
- if (!m_formDataStream.hasMoreElements())
+ if (!m_formDataStream || !m_formDataStream->hasMoreElements()) {
+ m_workerThreadConditionVariable.notifyOne();
return;
+ }
- size_t size = m_formDataStream.read(buffer, blockSize, numberOfBlocks);
+ size_t size = m_formDataStream->read(buffer, blockSize, numberOfBlocks);
if (!size) {
// Something went wrong so cancel the job.
m_handle->cancel();
+ m_workerThreadConditionVariable.notifyOne();
return;
}
@@ -445,6 +447,8 @@
{
response().setDeprecatedNetworkLoadMetrics(networkLoadMetrics);
+ m_formDataStream = nullptr;
+
if (!m_handle)
return;
@@ -465,6 +469,8 @@
void ResourceHandleCurlDelegate::didFail(const ResourceError& resourceError)
{
+ m_formDataStream = nullptr;
+
if (!m_handle)
return;
@@ -620,6 +626,9 @@
m_curlHandle.setInFileSizeLarge(size);
}
+ m_formDataStream = std::make_unique<FormDataStream>();
+ m_formDataStream->setHTTPBody(m_firstRequest.httpBody());
+
m_curlHandle.setReadCallbackFunction(willSendDataCallback, this);
}
Modified: trunk/Source/WebCore/platform/network/curl/ResourceHandleCurlDelegate.h (222268 => 222269)
--- trunk/Source/WebCore/platform/network/curl/ResourceHandleCurlDelegate.h 2017-09-20 17:21:19 UTC (rev 222268)
+++ trunk/Source/WebCore/platform/network/curl/ResourceHandleCurlDelegate.h 2017-09-20 17:31:06 UTC (rev 222269)
@@ -42,6 +42,7 @@
class MultipartHandle;
class ProtectionSpace;
+class ResourceError;
class ResourceHandle;
class ThreadSafeDataBuffer;
@@ -104,7 +105,7 @@
// Used by main thread.
ResourceHandle* m_handle;
- FormDataStream m_formDataStream;
+ std::unique_ptr<FormDataStream> m_formDataStream;
std::unique_ptr<MultipartHandle> m_multipartHandle;
unsigned short m_authFailureCount { 0 };
CurlJobTicket m_job { nullptr };