Changeset 103487 in webkit


Ignore:
Timestamp:
Dec 21, 2011 6:50:12 PM (12 years ago)
Author:
leo.yang@torchmobile.com.cn
Message:

Upstream the Multipart feature in Blackberry port
https://bugs.webkit.org/show_bug.cgi?id=73533

Patch by Chris Guan <chris.guan@torchmobile.com.cn> on 2011-12-21
Reviewed by Rob Buis.

I refactored Multipart code of Blackberry port. Moved Multipart into
Blackerry network layer and removed the dependence of std::string.

Initial upstream, no new test cases.

  • platform/network/blackberry/DeferredData.cpp:

(WebCore::DeferredData::deferMultipartHeaderReceived):
(WebCore::DeferredData::processHeaders):
(WebCore::DeferredData::processDeferredData):

  • platform/network/blackberry/DeferredData.h:

(WebCore::DeferredData::hasDeferredData):

  • platform/network/blackberry/NetworkJob.cpp:

(WebCore::NetworkJob::notifyMultipartHeaderReceived):
(WebCore::NetworkJob::handleNotifyMultipartHeaderReceived):
(WebCore::NetworkJob::handleNotifyDataReceived):
(WebCore::NetworkJob::handleNotifyClose):
(WebCore::NetworkJob::startNewJobWithRequest):
(WebCore::NetworkJob::sendResponseIfNeeded):
(WebCore::NetworkJob::sendMultipartResponseIfNeeded):

  • platform/network/blackberry/NetworkJob.h:
Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r103486 r103487  
     12011-12-21  Chris Guan  <chris.guan@torchmobile.com.cn>
     2
     3        Upstream the Multipart feature in Blackberry port
     4        https://bugs.webkit.org/show_bug.cgi?id=73533
     5
     6        Reviewed by Rob Buis.
     7
     8        I refactored Multipart code of Blackberry port. Moved Multipart into
     9        Blackerry network layer and removed the dependence of std::string.
     10
     11        Initial upstream, no new test cases.
     12
     13        * platform/network/blackberry/DeferredData.cpp:
     14        (WebCore::DeferredData::deferMultipartHeaderReceived):
     15        (WebCore::DeferredData::processHeaders):
     16        (WebCore::DeferredData::processDeferredData):
     17        * platform/network/blackberry/DeferredData.h:
     18        (WebCore::DeferredData::hasDeferredData):
     19        * platform/network/blackberry/NetworkJob.cpp:
     20        (WebCore::NetworkJob::notifyMultipartHeaderReceived):
     21        (WebCore::NetworkJob::handleNotifyMultipartHeaderReceived):
     22        (WebCore::NetworkJob::handleNotifyDataReceived):
     23        (WebCore::NetworkJob::handleNotifyClose):
     24        (WebCore::NetworkJob::startNewJobWithRequest):
     25        (WebCore::NetworkJob::sendResponseIfNeeded):
     26        (WebCore::NetworkJob::sendMultipartResponseIfNeeded):
     27        * platform/network/blackberry/NetworkJob.h:
     28
    1292011-12-21  Eric Carlson  <eric.carlson@apple.com>
    230
  • trunk/Source/WebCore/platform/network/blackberry/DeferredData.cpp

    r102433 r103487  
    5656}
    5757
     58void DeferredData::deferMultipartHeaderReceived(const String& key, const String& value)
     59{
     60    m_multipartHeaderKeys.append(key);
     61    m_multipartheaderValues.append(value);
     62}
     63
    5864void DeferredData::deferDataSent(unsigned long long bytesSent, unsigned long long totalBytesToBeSent)
    5965{
     
    7278    m_deferredCloseStatus = status;
    7379    m_deferredClose = true;
     80}
     81
     82bool DeferredData::processHeaders(Vector<String>& headerKeys, Vector<String>& headerValues, HandleHeadersFunction function)
     83{
     84    size_t numHeaders = headerKeys.size();
     85    ASSERT(headerValues.size() == numHeaders);
     86    for (size_t i = 0; i < numHeaders; ++i) {
     87        (m_job.*function)(headerKeys[i], headerValues[i]);
     88
     89        if (m_job.isDeferringLoading()) {
     90            // Remove all the headers that have already been processed.
     91            headerKeys.remove(0, i + 1);
     92            headerValues.remove(0, i + 1);
     93            return false;
     94        }
     95
     96        if (m_job.isCancelled()) {
     97            // Don't bother removing headers; job will be deleted.
     98            return false;
     99        }
     100    }
     101    headerKeys.clear();
     102    headerValues.clear();
     103    return true;
    74104}
    75105
     
    101131    }
    102132
    103     size_t numHeaders = m_headerKeys.size();
    104     ASSERT(m_headerValues.size() == numHeaders);
    105     for (unsigned i = 0; i < numHeaders; ++i) {
    106         m_job.handleNotifyHeaderReceived(m_headerKeys[i], m_headerValues[i]);
    107 
    108         if (m_job.isDeferringLoading()) {
    109             // Remove all the headers that have already been processed.
    110             m_headerKeys.remove(0, i + 1);
    111             m_headerValues.remove(0, i + 1);
    112             return;
    113         }
    114 
    115         if (m_job.isCancelled()) {
    116             // Don't bother removing headers; job will be deleted.
    117             return;
    118         }
    119     }
    120     m_headerKeys.clear();
    121     m_headerValues.clear();
     133    if (!processHeaders(m_headerKeys, m_headerValues, &NetworkJob::handleNotifyHeaderReceived)
     134        || !processHeaders(m_multipartHeaderKeys, m_multipartheaderValues, &NetworkJob::handleNotifyMultipartHeaderReceived))
     135        return;
    122136
    123137    // Only process 32k of data at a time to avoid blocking the event loop for too long.
  • trunk/Source/WebCore/platform/network/blackberry/DeferredData.h

    r102433 r103487  
    5454    void deferWMLOverride();
    5555    void deferHeaderReceived(const String& key, const String& value);
     56    void deferMultipartHeaderReceived(const String& key, const String& value);
    5657    void deferDataReceived(const char* buf, size_t len);
    5758    void deferDataSent(unsigned long long bytesSent, unsigned long long totalBytesToBeSent);
     
    6061    bool hasDeferredData() const
    6162    {
    62         return m_deferredStatusReceived || m_deferredWMLOverride || !m_headerKeys.isEmpty() || !m_dataSegments.isEmpty() || m_deferredClose;
     63        return m_deferredStatusReceived || m_deferredWMLOverride || !m_headerKeys.isEmpty() || !m_multipartHeaderKeys.isEmpty() || !m_dataSegments.isEmpty() || m_deferredClose;
    6364    }
    6465
     
    7273
    7374private:
     75    typedef void (NetworkJob::*HandleHeadersFunction)(const String& key, const String& value);
     76
     77    // Returns false if the job is deferred or canceled, otherwise returns true.
     78    bool processHeaders(Vector<String>& headerKeys, Vector<String>& headerValues, HandleHeadersFunction);
     79
    7480    void fireProcessDataTimer(Timer<DeferredData>*);
    7581    NetworkJob& m_job;
     
    8187    Vector<String> m_headerKeys;
    8288    Vector<String> m_headerValues;
     89    Vector<String> m_multipartHeaderKeys;
     90    Vector<String> m_multipartheaderValues;
    8391    Deque<Vector<char> > m_dataSegments;
    8492    unsigned long long m_bytesSent;
  • trunk/Source/WebCore/platform/network/blackberry/NetworkJob.cpp

    r102937 r103487  
    3838#include <BlackBerryPlatformWebKitCredits.h>
    3939#include <BuildInformation.h>
     40#include <network/MultipartStream.h>
    4041#include <network/NetworkRequest.h>
    4142#include <network/NetworkStreamFactory.h>
     
    280281}
    281282
     283void NetworkJob::notifyMultipartHeaderReceived(const char* key, const char* value)
     284{
     285    if (shouldDeferLoading())
     286        m_deferredData.deferMultipartHeaderReceived(key, value);
     287    else
     288        handleNotifyMultipartHeaderReceived(key, value);
     289}
     290
    282291void NetworkJob::notifyStringHeaderReceived(const String& key, const String& value)
    283292{
     
    314323
    315324    m_response.setHTTPHeaderField(key, value);
     325}
     326
     327void NetworkJob::handleNotifyMultipartHeaderReceived(const String& key, const String& value)
     328{
     329    if (!m_multipartResponse) {
     330        // Create a new response based on the original set of headers + the
     331        // replacement headers. We only replace the same few headers that gecko
     332        // does. See netwerk/streamconv/converters/nsMultiMixedConv.cpp.
     333        m_multipartResponse = adoptPtr(new ResourceResponse);
     334        m_multipartResponse->setURL(m_response.url());
     335
     336        // The list of BlackBerry::Platform::replaceHeaders that we do not copy from the original
     337        // response when generating a response.
     338        const WebCore::HTTPHeaderMap& map = m_response.httpHeaderFields();
     339
     340        for (WebCore::HTTPHeaderMap::const_iterator it = map.begin(); it != map.end(); ++it) {
     341            bool needsCopyfromOriginalResponse = true;
     342            int replaceHeadersIndex = 0;
     343            while (BlackBerry::Platform::MultipartStream::replaceHeaders[replaceHeadersIndex]) {
     344                if (it->first.lower() == BlackBerry::Platform::MultipartStream::replaceHeaders[replaceHeadersIndex]) {
     345                    needsCopyfromOriginalResponse = false;
     346                    break;
     347                }
     348                replaceHeadersIndex++;
     349            }
     350            if (needsCopyfromOriginalResponse)
     351                m_multipartResponse->setHTTPHeaderField(it->first, it->second);
     352        }
     353
     354        m_multipartResponse->setIsMultipartPayload(true);
     355    } else {
     356        if (key.lower() == "content-type") {
     357            String contentType = value.lower();
     358            m_multipartResponse->setMimeType(extractMIMETypeFromMediaType(contentType));
     359            m_multipartResponse->setTextEncodingName(extractCharsetFromMediaType(contentType));
     360        }
     361        m_multipartResponse->setHTTPHeaderField(key, value);
     362    }
    316363}
    317364
     
    351398    if (shouldSendClientData()) {
    352399        sendResponseIfNeeded();
     400        sendMultipartResponseIfNeeded();
    353401        if (clientIsOk()) {
    354             if (m_multipartDelegate)
    355                 m_multipartDelegate->onReceivedData(buf, len, len);
    356             else {
    357                 RecursionGuard guard(m_callingClient);
    358                 m_handle->client()->didReceiveData(m_handle.get(), buf, len, len);
    359            }
     402            RecursionGuard guard(m_callingClient);
     403            m_handle->client()->didReceiveData(m_handle.get(), buf, len, len);
    360404        }
    361405    }
     
    420464            sendResponseIfNeeded();
    421465            if (clientIsOk()) {
    422                 if (m_multipartDelegate)
    423                     m_multipartDelegate->onCompletedRequest();
    424466
    425467                RecursionGuard guard(m_callingClient);
     
    440482    // Detach from the ResourceHandle in any case.
    441483    m_handle = 0;
    442     m_multipartDelegate = nullptr;
     484    m_multipartResponse = nullptr;
    443485}
    444486
     
    488530    RefPtr<ResourceHandle> handle = m_handle;
    489531    m_handle = 0;
    490     m_multipartDelegate = nullptr;
     532    m_multipartResponse = nullptr;
    491533
    492534    NetworkManager::instance()->startJob(m_playerId,
     
    583625        RecursionGuard guard(m_callingClient);
    584626        m_handle->client()->didReceiveResponse(m_handle.get(), m_response);
    585 
    586         if (mimeType == "multipart/x-mixed-replace") {
    587             std::string boundary;
    588             bool isReadBoundary = MultipartResponseDelegate::readMultipartBoundary(m_contentType.lower().utf8().data(), boundary);
    589             if (isReadBoundary && !boundary.empty())
    590                 m_multipartDelegate = adoptPtr(new MultipartResponseDelegate(m_handle, m_response, boundary));
    591         }
     627    }
     628}
     629
     630void NetworkJob::sendMultipartResponseIfNeeded()
     631{
     632    if (m_multipartResponse && clientIsOk()) {
     633        m_handle->client()->didReceiveResponse(m_handle.get(), *m_multipartResponse);
     634        m_multipartResponse = nullptr;
    592635    }
    593636}
  • trunk/Source/WebCore/platform/network/blackberry/NetworkJob.h

    r102433 r103487  
    2121
    2222#include "DeferredData.h"
    23 #include "MultipartResponseDelegate.h"
    2423#include "PlatformString.h"
    2524#include "ProtectionSpace.h"
     
    7170    void handleNotifyWMLOverride() { m_response.setIsWML(true); }
    7271    virtual void notifyHeaderReceived(const char* key, const char* value);
     72    virtual void notifyMultipartHeaderReceived(const char* key, const char* value);
    7373    // Exists only to resolve ambiguity between char* and String parameters
    7474    void notifyStringHeaderReceived(const String& key, const String& value);
    7575    void handleNotifyHeaderReceived(const String& key, const String& value);
     76    void handleNotifyMultipartHeaderReceived(const String& key, const String& value);
    7677    void handleSetCookieHeader(const String& value);
    7778    void notifyDataReceivedPlain(const char* buf, size_t len);
     
    109110    // This can cause m_cancelled to be set to true, if it passes up an error to m_handle->client() which causes the job to be cancelled
    110111    void sendResponseIfNeeded();
     112    void sendMultipartResponseIfNeeded();
    111113
    112114    void fireLoadDataTimer(Timer<NetworkJob>*)
     
    150152    Timer<NetworkJob> m_loadDataTimer;
    151153    Timer<NetworkJob> m_loadAboutTimer;
    152     OwnPtr<MultipartResponseDelegate> m_multipartDelegate;
     154    OwnPtr<ResourceResponse> m_multipartResponse;
    153155    Timer<NetworkJob> m_deleteJobTimer;
    154156    String m_contentType;
Note: See TracChangeset for help on using the changeset viewer.