Changeset 226656 in webkit
- Timestamp:
- Jan 9, 2018 1:15:32 PM (6 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 1 added
- 1 deleted
- 4 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r226654 r226656 1 2018-01-09 Basuke Suzuki <Basuke.Suzuki@sony.com> 2 3 [Curl] Move FormData related tasks into new CurlFormDataStream class. 4 https://bugs.webkit.org/show_bug.cgi?id=181106 5 6 Reviewed by Alex Christensen. 7 8 No new tests because no behavior change. 9 10 * platform/Curl.cmake: 11 * platform/network/curl/CurlFormDataStream.cpp: Added. 12 (WebCore::CurlFormDataStream::CurlFormDataStream): 13 (WebCore::CurlFormDataStream::~CurlFormDataStream): 14 (WebCore::CurlFormDataStream::clean): 15 (WebCore::CurlFormDataStream::shouldUseChunkTransfer): 16 (WebCore::CurlFormDataStream::totalSize): 17 (WebCore::CurlFormDataStream::computeContentLength): 18 (WebCore::CurlFormDataStream::read): 19 (WebCore::CurlFormDataStream::readFromFile): 20 (WebCore::CurlFormDataStream::readFromData): 21 * platform/network/curl/CurlFormDataStream.h: Renamed from Source/WebCore/platform/network/curl/FormDataStreamCurl.h. 22 (WebCore::CurlFormDataStream::elementSize): 23 (WebCore::CurlFormDataStream::totalReadSize): 24 * platform/network/curl/CurlRequest.cpp: 25 (WebCore::CurlRequest::CurlRequest): 26 (WebCore::CurlRequest::willSendData): 27 (WebCore::CurlRequest::finalizeTransfer): 28 (WebCore::CurlRequest::setupPUT): 29 (WebCore::CurlRequest::setupPOST): 30 (WebCore::CurlRequest::setupSendData): 31 (WebCore::CurlRequest::resolveBlobReferences): Deleted. 32 (WebCore::CurlRequest::setupFormData): Deleted. 33 * platform/network/curl/CurlRequest.h: 34 * platform/network/curl/FormDataStreamCurl.cpp: Removed. 35 1 36 2018-01-09 Zalan Bujtas <zalan@apple.com> 2 37 -
trunk/Source/WebCore/platform/Curl.cmake
r224961 r226656 12 12 platform/network/curl/CurlContext.cpp 13 13 platform/network/curl/CurlDownload.cpp 14 platform/network/curl/CurlFormDataStream.cpp 14 15 platform/network/curl/CurlRequest.cpp 15 16 platform/network/curl/CurlRequestScheduler.cpp … … 17 18 platform/network/curl/CurlSSLVerifier.cpp 18 19 platform/network/curl/DNSCurl.cpp 19 platform/network/curl/FormDataStreamCurl.cpp20 20 platform/network/curl/MultipartHandle.cpp 21 21 platform/network/curl/NetworkStorageSessionCurl.cpp -
trunk/Source/WebCore/platform/network/curl/CurlFormDataStream.h
r226655 r226656 27 27 #pragma once 28 28 29 #include <stdio.h> 29 #include "FileSystem.h" 30 #include "FormData.h" 31 #include <wtf/Vector.h> 30 32 31 33 namespace WebCore { 32 34 33 class FormData; 35 class CurlFormDataStream { 36 public: 37 CurlFormDataStream(const FormData*); 38 ~CurlFormDataStream(); 34 39 35 class FormDataStream { 36 public: 37 FormDataStream() = default; 38 ~FormDataStream(); 40 void clean(); 39 41 40 void setHTTPBody(FormData* formData) { m_formData = formData; } 41 size_t read(void* ptr, size_t blockSize, size_t numberOfBlocks); 42 bool hasMoreElements() const; 42 size_t elementSize() { return m_formData ? m_formData->elements().size() : 0; } 43 44 std::optional<const Vector<char>&> getPostData(); 45 bool shouldUseChunkTransfer(); 46 unsigned long long totalSize(); 47 48 std::optional<size_t> read(char*, size_t); 49 unsigned long long totalReadSize() { return m_totalReadSize; } 43 50 44 51 private: 45 // We can hold a weak reference to our ResourceRequest as it holds a strong reference 46 // to us through its owner. 47 FormData* m_formData { }; 52 void computeContentLength(); 48 53 49 FILE* m_file { }; 50 size_t m_formDataElementIndex { 0 }; 51 size_t m_formDataElementDataOffset { 0 }; 54 std::optional<size_t> readFromFile(const FormDataElement&, char*, size_t); 55 std::optional<size_t> readFromData(const FormDataElement&, char*, size_t); 56 57 RefPtr<FormData> m_formData; 58 59 std::unique_ptr<Vector<char>> m_postData; 60 bool m_isContentLengthUpdated { false }; 61 bool m_shouldUseChunkTransfer { false }; 62 unsigned long long m_totalSize { 0 }; 63 unsigned long long m_totalReadSize { 0 }; 64 65 size_t m_elementPosition { 0 }; 66 67 FileSystem::PlatformFileHandle m_fileHandle { FileSystem::invalidPlatformFileHandle }; 68 size_t m_dataOffset { 0 }; 52 69 }; 53 70 -
trunk/Source/WebCore/platform/network/curl/CurlRequest.cpp
r226466 r226656 41 41 : m_request(request.isolatedCopy()) 42 42 , m_shouldSuspend(shouldSuspend) 43 , m_formDataStream(m_request.httpBody()) 43 44 { 44 45 ASSERT(isMainThread()); 45 46 46 47 setClient(client); 47 resolveBlobReferences(m_request);48 48 } 49 49 … … 236 236 // Carefully respect the given buffer size and fill the rest of the data at the next calls. 237 237 238 size_t CurlRequest::willSendData(char* ptr, size_t blockSize, size_t numberOfBlocks)238 size_t CurlRequest::willSendData(char* buffer, size_t blockSize, size_t numberOfBlocks) 239 239 { 240 240 if (isCompletedOrCancelled()) … … 242 242 243 243 if (!blockSize || !numberOfBlocks) 244 return 0; 245 246 if (!m_formDataStream || !m_formDataStream->hasMoreElements()) 247 return 0; 248 249 auto sendBytes = m_formDataStream->read(ptr, blockSize, numberOfBlocks); 244 return CURL_READFUNC_ABORT; 245 246 // Check for overflow. 247 if (blockSize > (std::numeric_limits<size_t>::max() / numberOfBlocks)) 248 return CURL_READFUNC_ABORT; 249 250 size_t bufferSize = blockSize * numberOfBlocks; 251 auto sendBytes = m_formDataStream.read(buffer, bufferSize); 250 252 if (!sendBytes) { 251 253 // Something went wrong so error the job. … … 253 255 } 254 256 255 return sendBytes;257 return *sendBytes; 256 258 } 257 259 … … 395 397 void CurlRequest::finalizeTransfer() 396 398 { 397 m_formDataStream = nullptr;398 399 closeDownloadFile(); 400 m_formDataStream.clean(); 399 401 m_curlHandle = nullptr; 400 }401 402 void CurlRequest::resolveBlobReferences(ResourceRequest& request)403 {404 ASSERT(isMainThread());405 406 auto body = request.httpBody();407 if (!body || body->isEmpty())408 return;409 410 // Resolve the blob elements so the formData can correctly report it's size.411 RefPtr<FormData> formData = body->resolveBlobReferences();412 request.setHTTPBody(WTFMove(formData));413 402 } 414 403 … … 420 409 m_curlHandle->removeRequestHeader("Expect"); 421 410 422 auto body = request.httpBody();423 if (! body || body->isEmpty())424 return; 425 426 setup FormData(request, false);411 auto elementSize = m_formDataStream.elementSize(); 412 if (!elementSize) 413 return; 414 415 setupSendData(true); 427 416 } 428 417 … … 431 420 m_curlHandle->enableHttpPostRequest(); 432 421 433 auto body = request.httpBody(); 434 if (!body || body->isEmpty()) 435 return; 436 437 auto numElements = body->elements().size(); 438 if (!numElements) 422 auto elementSize = m_formDataStream.elementSize(); 423 if (!elementSize) 439 424 return; 440 425 441 426 // Do not stream for simple POST data 442 if ( numElements== 1) {443 m_postBuffer = body->flatten();444 if ( m_postBuffer.size())445 m_curlHandle->setPostFields( m_postBuffer.data(), m_postBuffer.size());427 if (elementSize == 1) { 428 auto postData = m_formDataStream.getPostData(); 429 if (postData && postData->size()) 430 m_curlHandle->setPostFields(postData->data(), postData->size()); 446 431 } else 447 setupFormData(request, true); 448 } 449 450 void CurlRequest::setupFormData(ResourceRequest& request, bool isPostRequest) 451 { 452 static auto maxCurlOffT = CurlHandle::maxCurlOffT(); 453 454 // Obtain the total size of the form data 455 curl_off_t size = 0; 456 bool chunkedTransfer = false; 457 auto elements = request.httpBody()->elements(); 458 459 for (auto element : elements) { 460 if (element.m_type == FormDataElement::Type::EncodedFile) { 461 long long fileSizeResult; 462 if (FileSystem::getFileSize(element.m_filename, fileSizeResult)) { 463 if (fileSizeResult > maxCurlOffT) { 464 // File size is too big for specifying it to cURL 465 chunkedTransfer = true; 466 break; 467 } 468 size += fileSizeResult; 469 } else { 470 chunkedTransfer = true; 471 break; 472 } 473 } else 474 size += element.m_data.size(); 475 } 476 477 // cURL guesses that we want chunked encoding as long as we specify the header 478 if (chunkedTransfer) 432 setupSendData(false); 433 } 434 435 void CurlRequest::setupSendData(bool forPutMethod) 436 { 437 // curl guesses that we want chunked encoding as long as we specify the header 438 if (m_formDataStream.shouldUseChunkTransfer()) 479 439 m_curlHandle->appendRequestHeader("Transfer-Encoding: chunked"); 480 440 else { 481 if ( isPostRequest)482 m_curlHandle->set PostFieldLarge(size);441 if (forPutMethod) 442 m_curlHandle->setInFileSizeLarge(static_cast<curl_off_t>(m_formDataStream.totalSize())); 483 443 else 484 m_curlHandle->setInFileSizeLarge(size); 485 } 486 487 m_formDataStream = std::make_unique<FormDataStream>(); 488 m_formDataStream->setHTTPBody(request.httpBody()); 444 m_curlHandle->setPostFieldLarge(static_cast<curl_off_t>(m_formDataStream.totalSize())); 445 } 489 446 490 447 m_curlHandle->setReadCallbackFunction(willSendDataCallback, this); -
trunk/Source/WebCore/platform/network/curl/CurlRequest.h
r225743 r226656 26 26 #pragma once 27 27 28 #include "CurlFormDataStream.h" 28 29 #include "CurlRequestSchedulerClient.h" 29 30 #include "CurlResponse.h" 30 31 #include "CurlSSLVerifier.h" 31 32 #include "FileSystem.h" 32 #include "FormDataStreamCurl.h"33 33 #include "NetworkLoadMetrics.h" 34 34 #include "ResourceRequest.h" … … 105 105 106 106 // For POST and PUT method 107 void resolveBlobReferences(ResourceRequest&);108 107 void setupPOST(ResourceRequest&); 109 108 void setupPUT(ResourceRequest&); 110 void setup FormData(ResourceRequest&, bool);109 void setupSendData(bool forPutMethod); 111 110 112 111 // Processing for DidReceiveResponse … … 143 142 144 143 std::unique_ptr<CurlHandle> m_curlHandle; 145 std::unique_ptr<FormDataStream> m_formDataStream; 146 Vector<char> m_postBuffer; 144 CurlFormDataStream m_formDataStream; 147 145 CurlSSLVerifier m_sslVerifier; 148 146
Note: See TracChangeset
for help on using the changeset viewer.