Changeset 68147 in webkit


Ignore:
Timestamp:
Sep 23, 2010 9:12:57 AM (14 years ago)
Author:
Patrick Gansterer
Message:

2010-09-23 Patrick Gansterer <Patrick Gansterer>

Reviewed by Adam Roben.

Cleanup network communication code in ResourceHandleWin
https://bugs.webkit.org/show_bug.cgi?id=46200

Add logic for request handling directly into ResourceHandle::start and fix style.
Use Unicode instead of ASCII Windows API functions.

  • platform/network/ResourceHandleInternal.h: (WebCore::ResourceHandleInternal::ResourceHandleInternal):
  • platform/network/win/ResourceHandleWin.cpp: (WebCore::ResourceHandle::onRequestComplete): (WebCore::ResourceHandle::start):
Location:
trunk/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r68146 r68147  
     12010-09-23  Patrick Gansterer  <paroga@webkit.org>
     2
     3        Reviewed by Adam Roben.
     4
     5        Cleanup network communication code in ResourceHandleWin
     6        https://bugs.webkit.org/show_bug.cgi?id=46200
     7
     8        Add logic for request handling directly into ResourceHandle::start and fix style.
     9        Use Unicode instead of ASCII Windows API functions.
     10
     11        * platform/network/ResourceHandleInternal.h:
     12        (WebCore::ResourceHandleInternal::ResourceHandleInternal):
     13        * platform/network/win/ResourceHandleWin.cpp:
     14        (WebCore::ResourceHandle::onRequestComplete):
     15        (WebCore::ResourceHandle::start):
     16
    1172010-09-23  Luiz Agostini  <luiz.agostini@openbossa.org>
    218
  • trunk/WebCore/platform/network/ResourceHandleInternal.h

    r68144 r68147  
    9797            , m_jobId(0)
    9898            , m_threadId(0)
     99            , m_internetHandle(0)
     100            , m_connectHandle(0)
     101            , m_requestHandle(0)
    99102            , m_sentEndRequest(false)
    100103            , m_bytesRemainingToWrite(0)
     
    170173        unsigned m_jobId;
    171174        DWORD m_threadId;
     175        HINTERNET m_internetHandle;
     176        HINTERNET m_connectHandle;
     177        HINTERNET m_requestHandle;
    172178        bool m_sentEndRequest;
    173179        Vector<char> m_formData;
  • trunk/WebCore/platform/network/win/ResourceHandleWin.cpp

    r68144 r68147  
    382382    }
    383383
    384     PlatformDataStruct platformData;
    385     platformData.errorString = 0;
    386     platformData.error = 0;
    387     platformData.loaded = ok;
    388 
    389     if (!ok) {
    390         int error = GetLastError();
    391         if (error == ERROR_IO_PENDING)
    392             return;
    393         DWORD errorStringChars = 0;
    394         if (!InternetGetLastResponseInfo(&platformData.error, 0, &errorStringChars)) {
    395             if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
    396                 platformData.errorString = new TCHAR[errorStringChars];
    397                 InternetGetLastResponseInfo(&platformData.error, platformData.errorString, &errorStringChars);
    398             }
    399         }
    400 #ifdef RESOURCE_LOADER_DEBUG
    401         char buf[64];
    402         _snprintf(buf, sizeof(buf), "Load error: %i\n", error);
    403         OutputDebugStringA(buf);
    404 #endif
    405     }
    406    
    407     if (d->m_secondaryHandle)
    408         InternetCloseHandle(d->m_secondaryHandle);
    409     InternetCloseHandle(d->m_resourceHandle);
     384    if (!ok && GetLastError() == ERROR_IO_PENDING)
     385        return;
    410386
    411387    client()->didFinishLoading(this, 0);
    412     delete this;
     388    InternetCloseHandle(d->m_requestHandle);
     389    InternetCloseHandle(d->m_connectHandle);
     390    deref(); // balances ref in start
     391    return;
    413392}
    414393
     
    468447bool ResourceHandle::start(NetworkingContext* context)
    469448{
    470     ref();
    471449    if (request().url().isLocalFile()) {
     450        ref(); // balanced by deref in fileLoadTimer
    472451        d->m_fileLoadTimer.startOneShot(0.0);
    473452        return true;
    474     } else {
    475         static HINTERNET internetHandle = 0;
    476         if (!internetHandle) {
    477             String userAgentStr = context->userAgent() + String("", 1);
    478             LPCWSTR userAgent = reinterpret_cast<const WCHAR*>(userAgentStr.characters());
    479             // leak the Internet for now
    480             internetHandle = InternetOpen(userAgent, INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, INTERNET_FLAG_ASYNC);
    481         }
    482         if (!internetHandle) {
    483             delete this;
    484             return false;
    485         }
    486         static INTERNET_STATUS_CALLBACK callbackHandle =
    487             InternetSetStatusCallback(internetHandle, transferJobStatusCallback);
    488 
    489         initializeOffScreenResourceHandleWindow();
    490         d->m_jobId = addToOutstandingJobs(this);
    491 
    492         DWORD flags =
    493             INTERNET_FLAG_KEEP_CONNECTION |
    494             INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS |
    495             INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP;
    496 
    497         // For form posting, we can't use InternetOpenURL.  We have to use
    498         // InternetConnect followed by HttpSendRequest.
    499         HINTERNET urlHandle;
    500         String referrer = context->referrer();
    501         if (request().httpMethod() == "POST") {
    502             d->m_postReferrer = referrer;
    503             String host = request().url().host();
    504             urlHandle = InternetConnectA(internetHandle, host.latin1().data(),
    505                                          request().url().port(),
    506                                          NULL, // no username
    507                                          NULL, // no password
    508                                          INTERNET_SERVICE_HTTP,
    509                                          flags, (DWORD_PTR)d->m_jobId);
    510         } else {
    511             String urlStr = request().url().string();
    512             int fragmentIndex = urlStr.find('#');
    513             if (fragmentIndex != -1)
    514                 urlStr = urlStr.left(fragmentIndex);
    515             String headers;
    516             if (!referrer.isEmpty())
    517                 headers += String("Referer: ") + referrer + "\r\n";
    518 
    519             urlHandle = InternetOpenUrlA(internetHandle, urlStr.latin1().data(),
    520                                          headers.latin1().data(), headers.length(),
    521                                          flags, (DWORD_PTR)d->m_jobId);
    522         }
    523 
    524         if (urlHandle == INVALID_HANDLE_VALUE) {
    525             delete this;
    526             return false;
    527         }
    528         d->m_threadId = GetCurrentThreadId();
    529 
    530         return true;
    531     }
     453    }
     454
     455    if (!d->m_internetHandle)
     456        d->m_internetHandle = asynchronousInternetHandle(context->userAgent());
     457
     458    if (!d->m_internetHandle)
     459        return false;
     460
     461    DWORD flags = INTERNET_FLAG_KEEP_CONNECTION
     462        | INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS
     463        | INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP;
     464
     465    d->m_connectHandle = InternetConnectW(d->m_internetHandle, firstRequest().url().host().charactersWithNullTermination(), firstRequest().url().port(),
     466                                          0, 0, INTERNET_SERVICE_HTTP, flags, reinterpret_cast<DWORD_PTR>(this));
     467
     468    if (!d->m_connectHandle)
     469        return false;
     470
     471    String urlStr = firstRequest().url().path();
     472    String urlQuery = firstRequest().url().query();
     473
     474    if (!urlQuery.isEmpty()) {
     475        urlStr.append('?');
     476        urlStr.append(urlQuery);
     477    }
     478
     479    String httpMethod = firstRequest().httpMethod();
     480    String httpReferrer = firstRequest().httpReferrer();
     481
     482    LPCWSTR httpAccept[] = { L"*/*", 0 };
     483
     484    d->m_requestHandle = HttpOpenRequestW(d->m_connectHandle, httpMethod.charactersWithNullTermination(), urlStr.charactersWithNullTermination(),
     485                                          0, httpReferrer.charactersWithNullTermination(), httpAccept, flags, reinterpret_cast<DWORD_PTR>(this));
     486
     487    if (!d->m_requestHandle) {
     488        InternetCloseHandle(d->m_connectHandle);
     489        return false;
     490    }
     491
     492    INTERNET_BUFFERSW internetBuffers;
     493    ZeroMemory(&internetBuffers, sizeof(internetBuffers));
     494    internetBuffers.dwStructSize = sizeof(internetBuffers);
     495
     496    HttpSendRequestExW(d->m_requestHandle, &internetBuffers, 0, 0, reinterpret_cast<DWORD_PTR>(this));
     497
     498    ref(); // balanced by deref in onRequestComplete
     499
     500    return true;
    532501}
    533502
Note: See TracChangeset for help on using the changeset viewer.