Changeset 226656 in webkit


Ignore:
Timestamp:
Jan 9, 2018 1:15:32 PM (6 years ago)
Author:
commit-queue@webkit.org
Message:

[Curl] Move FormData related tasks into new CurlFormDataStream class.
https://bugs.webkit.org/show_bug.cgi?id=181106

Patch by Basuke Suzuki <Basuke Suzuki> on 2018-01-09
Reviewed by Alex Christensen.

No new tests because no behavior change.

  • platform/Curl.cmake:
  • platform/network/curl/CurlFormDataStream.cpp: Added.

(WebCore::CurlFormDataStream::CurlFormDataStream):
(WebCore::CurlFormDataStream::~CurlFormDataStream):
(WebCore::CurlFormDataStream::clean):
(WebCore::CurlFormDataStream::shouldUseChunkTransfer):
(WebCore::CurlFormDataStream::totalSize):
(WebCore::CurlFormDataStream::computeContentLength):
(WebCore::CurlFormDataStream::read):
(WebCore::CurlFormDataStream::readFromFile):
(WebCore::CurlFormDataStream::readFromData):

  • platform/network/curl/CurlFormDataStream.h: Renamed from Source/WebCore/platform/network/curl/FormDataStreamCurl.h.

(WebCore::CurlFormDataStream::elementSize):
(WebCore::CurlFormDataStream::totalReadSize):

  • platform/network/curl/CurlRequest.cpp:

(WebCore::CurlRequest::CurlRequest):
(WebCore::CurlRequest::willSendData):
(WebCore::CurlRequest::finalizeTransfer):
(WebCore::CurlRequest::setupPUT):
(WebCore::CurlRequest::setupPOST):
(WebCore::CurlRequest::setupSendData):
(WebCore::CurlRequest::resolveBlobReferences): Deleted.
(WebCore::CurlRequest::setupFormData): Deleted.

  • platform/network/curl/CurlRequest.h:
  • platform/network/curl/FormDataStreamCurl.cpp: Removed.
Location:
trunk/Source/WebCore
Files:
1 added
1 deleted
4 edited
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r226654 r226656  
     12018-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
    1362018-01-09  Zalan Bujtas  <zalan@apple.com>
    237
  • trunk/Source/WebCore/platform/Curl.cmake

    r224961 r226656  
    1212    platform/network/curl/CurlContext.cpp
    1313    platform/network/curl/CurlDownload.cpp
     14    platform/network/curl/CurlFormDataStream.cpp
    1415    platform/network/curl/CurlRequest.cpp
    1516    platform/network/curl/CurlRequestScheduler.cpp
     
    1718    platform/network/curl/CurlSSLVerifier.cpp
    1819    platform/network/curl/DNSCurl.cpp
    19     platform/network/curl/FormDataStreamCurl.cpp
    2020    platform/network/curl/MultipartHandle.cpp
    2121    platform/network/curl/NetworkStorageSessionCurl.cpp
  • trunk/Source/WebCore/platform/network/curl/CurlFormDataStream.h

    r226655 r226656  
    2727#pragma once
    2828
    29 #include <stdio.h>
     29#include "FileSystem.h"
     30#include "FormData.h"
     31#include <wtf/Vector.h>
    3032
    3133namespace WebCore {
    3234
    33 class FormData;
     35class CurlFormDataStream {
     36public:
     37    CurlFormDataStream(const FormData*);
     38    ~CurlFormDataStream();
    3439
    35 class FormDataStream {
    36 public:
    37     FormDataStream() = default;
    38     ~FormDataStream();
     40    void clean();
    3941
    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; }
    4350
    4451private:
    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();
    4853
    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 };
    5269};
    5370
  • trunk/Source/WebCore/platform/network/curl/CurlRequest.cpp

    r226466 r226656  
    4141    : m_request(request.isolatedCopy())
    4242    , m_shouldSuspend(shouldSuspend)
     43    , m_formDataStream(m_request.httpBody())
    4344{
    4445    ASSERT(isMainThread());
    4546
    4647    setClient(client);
    47     resolveBlobReferences(m_request);
    4848}
    4949
     
    236236// Carefully respect the given buffer size and fill the rest of the data at the next calls.
    237237
    238 size_t CurlRequest::willSendData(char* ptr, size_t blockSize, size_t numberOfBlocks)
     238size_t CurlRequest::willSendData(char* buffer, size_t blockSize, size_t numberOfBlocks)
    239239{
    240240    if (isCompletedOrCancelled())
     
    242242
    243243    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);
    250252    if (!sendBytes) {
    251253        // Something went wrong so error the job.
     
    253255    }
    254256
    255     return sendBytes;
     257    return *sendBytes;
    256258}
    257259
     
    395397void CurlRequest::finalizeTransfer()
    396398{
    397     m_formDataStream = nullptr;
    398399    closeDownloadFile();
     400    m_formDataStream.clean();
    399401    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));
    413402}
    414403
     
    420409    m_curlHandle->removeRequestHeader("Expect");
    421410
    422     auto body = request.httpBody();
    423     if (!body || body->isEmpty())
    424         return;
    425 
    426     setupFormData(request, false);
     411    auto elementSize = m_formDataStream.elementSize();
     412    if (!elementSize)
     413        return;
     414
     415    setupSendData(true);
    427416}
    428417
     
    431420    m_curlHandle->enableHttpPostRequest();
    432421
    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)
    439424        return;
    440425
    441426    // 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());
    446431    } 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
     435void 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())
    479439        m_curlHandle->appendRequestHeader("Transfer-Encoding: chunked");
    480440    else {
    481         if (isPostRequest)
    482             m_curlHandle->setPostFieldLarge(size);
     441        if (forPutMethod)
     442            m_curlHandle->setInFileSizeLarge(static_cast<curl_off_t>(m_formDataStream.totalSize()));
    483443        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    }
    489446
    490447    m_curlHandle->setReadCallbackFunction(willSendDataCallback, this);
  • trunk/Source/WebCore/platform/network/curl/CurlRequest.h

    r225743 r226656  
    2626#pragma once
    2727
     28#include "CurlFormDataStream.h"
    2829#include "CurlRequestSchedulerClient.h"
    2930#include "CurlResponse.h"
    3031#include "CurlSSLVerifier.h"
    3132#include "FileSystem.h"
    32 #include "FormDataStreamCurl.h"
    3333#include "NetworkLoadMetrics.h"
    3434#include "ResourceRequest.h"
     
    105105
    106106    // For POST and PUT method
    107     void resolveBlobReferences(ResourceRequest&);
    108107    void setupPOST(ResourceRequest&);
    109108    void setupPUT(ResourceRequest&);
    110     void setupFormData(ResourceRequest&, bool);
     109    void setupSendData(bool forPutMethod);
    111110
    112111    // Processing for DidReceiveResponse
     
    143142
    144143    std::unique_ptr<CurlHandle> m_curlHandle;
    145     std::unique_ptr<FormDataStream> m_formDataStream;
    146     Vector<char> m_postBuffer;
     144    CurlFormDataStream m_formDataStream;
    147145    CurlSSLVerifier m_sslVerifier;
    148146
Note: See TracChangeset for help on using the changeset viewer.