18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2004, 2006 Apple Computer, Inc.  All rights reserved.
3e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * Copyright (C) 2010 Patrick Gansterer <paroga@paroga.com>
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ResourceHandle.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "DataURL.h"
31bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "HTTPParsers.h"
32bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "MIMETypeRegistry.h"
33bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "MainThread.h"
34bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "NotImplemented.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ResourceError.h"
3606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "ResourceHandleClient.h"
3706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "ResourceHandleInternal.h"
38bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "SharedBuffer.h"
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Timer.h"
40bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "UnusedParam.h"
41dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <wtf/text/CString.h>
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <windows.h>
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wininet.h>
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenstatic inline HINTERNET createInternetHandle(const String& userAgent, bool asynchronous)
48bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
49bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    String userAgentString = userAgent;
50bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    HINTERNET internetHandle = InternetOpenW(userAgentString.charactersWithNullTermination(), INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, asynchronous ? INTERNET_FLAG_ASYNC : 0);
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
52bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (asynchronous)
53bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        InternetSetStatusCallback(internetHandle, &ResourceHandle::internetStatusCallback);
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return internetHandle;
56bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
58bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenstatic HINTERNET asynchronousInternetHandle(const String& userAgent)
59bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
60bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    static HINTERNET internetHandle = createInternetHandle(userAgent, true);
61bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return internetHandle;
62bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockstatic String queryHTTPHeader(HINTERNET requestHandle, DWORD infoLevel)
65e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
66e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    DWORD bufferSize = 0;
67e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    HttpQueryInfoW(requestHandle, infoLevel, 0, &bufferSize, 0);
68e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
69e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    Vector<UChar> characters(bufferSize / sizeof(UChar));
70e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
71e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (!HttpQueryInfoW(requestHandle, infoLevel, characters.data(), &bufferSize, 0))
72e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        return String();
73e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
74e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    characters.removeLast(); // Remove NullTermination.
75e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    return String::adopt(characters);
76e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
77e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
78e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
79ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochclass WebCoreSynchronousLoader : public ResourceHandleClient {
80ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    WTF_MAKE_NONCOPYABLE(WebCoreSynchronousLoader);
81e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockpublic:
82e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    WebCoreSynchronousLoader(ResourceError&, ResourceResponse&, Vector<char>&, const String& userAgent);
83bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    ~WebCoreSynchronousLoader();
84bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
85bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    HINTERNET internetHandle() const { return m_internetHandle; }
86e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
87e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&);
882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    virtual void didReceiveData(ResourceHandle*, const char*, int, int encodedDataLength);
8968513a70bcd92384395513322f1b801e7bf9c729Steve Block    virtual void didFinishLoading(ResourceHandle*, double /*finishTime*/);
90e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    virtual void didFail(ResourceHandle*, const ResourceError&);
91e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
92e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockprivate:
93e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    ResourceError& m_error;
94e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    ResourceResponse& m_response;
95e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    Vector<char>& m_data;
96bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    HINTERNET m_internetHandle;
97e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block};
98e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
99e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockWebCoreSynchronousLoader::WebCoreSynchronousLoader(ResourceError& error, ResourceResponse& response, Vector<char>& data, const String& userAgent)
100e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    : m_error(error)
101e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    , m_response(response)
102e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    , m_data(data)
103bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    , m_internetHandle(createInternetHandle(userAgent, false))
104bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
105bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
106bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
107bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebCoreSynchronousLoader::~WebCoreSynchronousLoader()
108e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
109bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    InternetCloseHandle(m_internetHandle);
110e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
111e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
112e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockvoid WebCoreSynchronousLoader::didReceiveResponse(ResourceHandle*, const ResourceResponse& response)
113e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
114e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    m_response = response;
115e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
116e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
117e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockvoid WebCoreSynchronousLoader::didReceiveData(ResourceHandle*, const char* data, int length, int)
118e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
119e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    m_data.append(data, length);
120e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
121e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
12268513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid WebCoreSynchronousLoader::didFinishLoading(ResourceHandle*, double)
123e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
124e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
125e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
126e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockvoid WebCoreSynchronousLoader::didFail(ResourceHandle*, const ResourceError& error)
127e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
128e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    m_error = error;
129e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
130e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
131e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceHandleInternal::~ResourceHandleInternal()
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceHandle::~ResourceHandle()
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
140bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenstatic void callOnRedirect(void* context)
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
142bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    ResourceHandle* handle = static_cast<ResourceHandle*>(context);
143bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    handle->onRedirect();
144bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
146bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenstatic void callOnRequestComplete(void* context)
147bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
148bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    ResourceHandle* handle = static_cast<ResourceHandle*>(context);
149bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    handle->onRequestComplete();
150bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
151bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
152bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid ResourceHandle::internetStatusCallback(HINTERNET internetHandle, DWORD_PTR context, DWORD internetStatus,
153bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                                                     LPVOID statusInformation, DWORD statusInformationLength)
154bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
155bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    ResourceHandle* handle = reinterpret_cast<ResourceHandle*>(context);
156bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
157bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    switch (internetStatus) {
158bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    case INTERNET_STATUS_REDIRECT:
159bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        handle->d->m_redirectUrl = String(static_cast<UChar*>(statusInformation), statusInformationLength);
160bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        callOnMainThread(callOnRedirect, handle);
161bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        break;
162bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
163bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    case INTERNET_STATUS_REQUEST_COMPLETE:
164bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        callOnMainThread(callOnRequestComplete, handle);
165bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        break;
166bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
167bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    default:
168bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        break;
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
172bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid ResourceHandle::onRedirect()
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
174bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    ResourceRequest newRequest = firstRequest();
175bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    newRequest.setURL(KURL(ParsedURLString, d->m_redirectUrl));
176bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
177bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    ResourceResponse response(firstRequest().url(), String(), 0, String(), String());
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
179bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (ResourceHandleClient* resourceHandleClient = client())
180bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        resourceHandleClient->willSendRequest(this, newRequest, response);
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
183bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenbool ResourceHandle::onRequestComplete()
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
185bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!d->m_internetHandle) { // 0 if canceled.
186bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        deref(); // balances ref in start
187bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return false;
188bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
189bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
190bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (d->m_bytesRemainingToWrite) {
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DWORD bytesWritten;
192bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        InternetWriteFile(d->m_requestHandle,
193bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                          d->m_formData.data() + (d->m_formData.size() - d->m_bytesRemainingToWrite),
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                          d->m_bytesRemainingToWrite,
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                          &bytesWritten);
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        d->m_bytesRemainingToWrite -= bytesWritten;
197bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (d->m_bytesRemainingToWrite)
198bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            return true;
199bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        d->m_formData.clear();
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
202bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!d->m_sentEndRequest) {
203bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        HttpEndRequestW(d->m_requestHandle, 0, 0, reinterpret_cast<DWORD_PTR>(this));
204bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        d->m_sentEndRequest = true;
205bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return true;
206bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static const int bufferSize = 32768;
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    char buffer[bufferSize];
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    INTERNET_BUFFERSA buffers;
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    buffers.dwStructSize = sizeof(INTERNET_BUFFERSA);
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    buffers.lpvBuffer = buffer;
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    buffers.dwBufferLength = bufferSize;
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
215e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    BOOL ok = FALSE;
216bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    while ((ok = InternetReadFileExA(d->m_requestHandle, &buffers, d->m_loadSynchronously ? 0 : IRF_NO_WAIT, reinterpret_cast<DWORD_PTR>(this))) && buffers.dwBufferLength) {
217bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!d->m_hasReceivedResponse) {
218bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            d->m_hasReceivedResponse = true;
219bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ResourceResponse response;
221e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            response.setURL(firstRequest().url());
222e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
223e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            String httpStatusText = queryHTTPHeader(d->m_requestHandle, HTTP_QUERY_STATUS_TEXT);
224e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            if (!httpStatusText.isNull())
225e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block                response.setHTTPStatusText(httpStatusText);
226e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
227e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            String httpStatusCode = queryHTTPHeader(d->m_requestHandle, HTTP_QUERY_STATUS_CODE);
228e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            if (!httpStatusCode.isNull())
229e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block                response.setHTTPStatusCode(httpStatusCode.toInt());
230e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
231e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            String httpContentLength = queryHTTPHeader(d->m_requestHandle, HTTP_QUERY_CONTENT_LENGTH);
232e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            if (!httpContentLength.isNull())
233e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block                response.setExpectedContentLength(httpContentLength.toInt());
234e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
235e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            String httpContentType = queryHTTPHeader(d->m_requestHandle, HTTP_QUERY_CONTENT_TYPE);
236e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            if (!httpContentType.isNull()) {
237e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block                response.setMimeType(extractMIMETypeFromMediaType(httpContentType));
238e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block                response.setTextEncodingName(extractCharsetFromMediaType(httpContentType));
239e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            }
240e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
241bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            if (ResourceHandleClient* resourceHandleClient = client())
242bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                resourceHandleClient->didReceiveResponse(this, response);
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
244bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
2452bde8e466a4451c7319e3a072d118917957d6554Steve Block        // FIXME: https://bugs.webkit.org/show_bug.cgi?id=19793
2462bde8e466a4451c7319e3a072d118917957d6554Steve Block        // -1 means we do not provide any data about transfer size to inspector so it would use
2472bde8e466a4451c7319e3a072d118917957d6554Steve Block        // Content-Length headers or content size to show transfer size.
248bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (ResourceHandleClient* resourceHandleClient = client())
2492bde8e466a4451c7319e3a072d118917957d6554Steve Block            resourceHandleClient->didReceiveData(this, buffer, buffers.dwBufferLength, -1);
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        buffers.dwBufferLength = bufferSize;
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
253bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!ok && GetLastError() == ERROR_IO_PENDING)
254bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return true;
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
256bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (ResourceHandleClient* resourceHandleClient = client())
257bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        resourceHandleClient->didFinishLoading(this, 0);
258bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
259bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    InternetCloseHandle(d->m_requestHandle);
260bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    InternetCloseHandle(d->m_connectHandle);
261bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    deref(); // balances ref in start
262bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return false;
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
265bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenbool ResourceHandle::start(NetworkingContext* context)
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
267a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (firstRequest().url().isLocalFile() || firstRequest().url().protocolIsData()) {
268bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        ref(); // balanced by deref in fileLoadTimer
269bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (d->m_loadSynchronously)
270bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            fileLoadTimer(0);
271bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        else
272bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            d->m_fileLoadTimer.startOneShot(0.0);
273bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return true;
274bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
276bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!d->m_internetHandle)
277bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        d->m_internetHandle = asynchronousInternetHandle(context->userAgent());
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
279bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!d->m_internetHandle)
280bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return false;
281bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
282bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    DWORD flags = INTERNET_FLAG_KEEP_CONNECTION
283bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        | INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS
284e14391e94c850b8bd03680c23b38978db68687a8John Reck        | INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP
285e14391e94c850b8bd03680c23b38978db68687a8John Reck        | INTERNET_FLAG_DONT_CACHE
286e14391e94c850b8bd03680c23b38978db68687a8John Reck        | INTERNET_FLAG_RELOAD;
287bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
288bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    d->m_connectHandle = InternetConnectW(d->m_internetHandle, firstRequest().url().host().charactersWithNullTermination(), firstRequest().url().port(),
289bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                                          0, 0, INTERNET_SERVICE_HTTP, flags, reinterpret_cast<DWORD_PTR>(this));
290bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
291bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!d->m_connectHandle)
292bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return false;
293bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
294bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    String urlStr = firstRequest().url().path();
295bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    String urlQuery = firstRequest().url().query();
296bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
297bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!urlQuery.isEmpty()) {
298bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        urlStr.append('?');
299bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        urlStr.append(urlQuery);
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
302bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    String httpMethod = firstRequest().httpMethod();
303bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    String httpReferrer = firstRequest().httpReferrer();
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
305bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    LPCWSTR httpAccept[] = { L"*/*", 0 };
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
307bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    d->m_requestHandle = HttpOpenRequestW(d->m_connectHandle, httpMethod.charactersWithNullTermination(), urlStr.charactersWithNullTermination(),
308bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                                          0, httpReferrer.charactersWithNullTermination(), httpAccept, flags, reinterpret_cast<DWORD_PTR>(this));
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
310bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!d->m_requestHandle) {
311bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        InternetCloseHandle(d->m_connectHandle);
312bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return false;
313bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
314bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
315bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (firstRequest().httpBody()) {
316bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        firstRequest().httpBody()->flatten(d->m_formData);
317bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        d->m_bytesRemainingToWrite = d->m_formData.size();
318bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
319bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
320bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    Vector<UChar> httpHeaders;
321bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    const HTTPHeaderMap& httpHeaderFields = firstRequest().httpHeaderFields();
322bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
323bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    for (HTTPHeaderMap::const_iterator it = httpHeaderFields.begin(); it != httpHeaderFields.end(); ++it) {
324bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (equalIgnoringCase(it->first, "Accept") || equalIgnoringCase(it->first, "Referer") || equalIgnoringCase(it->first, "User-Agent"))
325bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            continue;
326bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
327bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!httpHeaders.isEmpty())
328bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            httpHeaders.append('\n');
329bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
330bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        httpHeaders.append(it->first.characters(), it->first.length());
331bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        httpHeaders.append(':');
332bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        httpHeaders.append(it->second.characters(), it->second.length());
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
334bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
335bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    INTERNET_BUFFERSW internetBuffers;
336bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    ZeroMemory(&internetBuffers, sizeof(internetBuffers));
337bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    internetBuffers.dwStructSize = sizeof(internetBuffers);
338bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    internetBuffers.lpcszHeader = httpHeaders.data();
339bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    internetBuffers.dwHeadersLength = httpHeaders.size();
340bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    internetBuffers.dwBufferTotal = d->m_bytesRemainingToWrite;
341bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
342bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    HttpSendRequestExW(d->m_requestHandle, &internetBuffers, 0, 0, reinterpret_cast<DWORD_PTR>(this));
343bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
344bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    ref(); // balanced by deref in onRequestComplete
345bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
346bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (d->m_loadSynchronously)
347bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        while (onRequestComplete()) {
348bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            // Loop until finished.
349bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
350bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
351bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return true;
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
354e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockvoid ResourceHandle::fileLoadTimer(Timer<ResourceHandle>*)
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
356e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    RefPtr<ResourceHandle> protector(this);
357e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    deref(); // balances ref in start
358e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
359a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (firstRequest().url().protocolIsData()) {
360a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        handleDataURL(this);
361a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return;
362a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
363a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
364e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    String fileName = firstRequest().url().fileSystemPath();
365e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    HANDLE fileHandle = CreateFileW(fileName.charactersWithNullTermination(), GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
366e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
367e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (fileHandle == INVALID_HANDLE_VALUE) {
368e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        client()->didFail(this, ResourceError());
369e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        return;
370e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    }
371e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ResourceResponse response;
373e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
374e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    int dotPos = fileName.reverseFind('.');
375e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    int slashPos = fileName.reverseFind('/');
376e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
377e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (slashPos < dotPos && dotPos != -1) {
378e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        String ext = fileName.substring(dotPos + 1);
379e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        response.setMimeType(MIMETypeRegistry::getMIMETypeForExtension(ext));
380e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    }
381e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    client()->didReceiveResponse(this, response);
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool result = false;
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DWORD bytesRead = 0;
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    do {
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const int bufferSize = 8192;
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        char buffer[bufferSize];
390e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        result = ReadFile(fileHandle, &buffer, bufferSize, &bytesRead, 0);
3912bde8e466a4451c7319e3a072d118917957d6554Steve Block        // FIXME: https://bugs.webkit.org/show_bug.cgi?id=19793
3922bde8e466a4451c7319e3a072d118917957d6554Steve Block        // -1 means we do not provide any data about transfer size to inspector so it would use
3932bde8e466a4451c7319e3a072d118917957d6554Steve Block        // Content-Length headers or content size to show transfer size.
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (result && bytesRead)
3952bde8e466a4451c7319e3a072d118917957d6554Steve Block            client()->didReceiveData(this, buffer, bytesRead, -1);
396e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        // Check for end of file.
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } while (result && bytesRead);
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
399e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    CloseHandle(fileHandle);
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40168513a70bcd92384395513322f1b801e7bf9c729Steve Block    client()->didFinishLoading(this, 0);
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ResourceHandle::cancel()
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
406bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (d->m_requestHandle) {
407bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        d->m_internetHandle = 0;
408bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        InternetCloseHandle(d->m_requestHandle);
409bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        InternetCloseHandle(d->m_connectHandle);
410bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    } else
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        d->m_fileLoadTimer.stop();
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
414bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid ResourceHandle::loadResourceSynchronously(NetworkingContext* context, const ResourceRequest& request, StoredCredentials storedCredentials, ResourceError& error, ResourceResponse& response, Vector<char>& data)
415e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
416e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    UNUSED_PARAM(storedCredentials);
417e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
418e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    WebCoreSynchronousLoader syncLoader(error, response, data, request.httpUserAgent());
419e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    ResourceHandle handle(request, &syncLoader, true, false);
420e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
421bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    handle.setSynchronousInternetHandle(syncLoader.internetHandle());
422bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    handle.start(context);
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
425bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid ResourceHandle::setSynchronousInternetHandle(HINTERNET internetHandle)
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
427bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    d->m_internetHandle = internetHandle;
428bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    d->m_loadSynchronously = true;
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
431e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockbool ResourceHandle::willLoadFromCache(ResourceRequest&, Frame*)
432e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
433e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    notImplemented();
434e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    return false;
435e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
436e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
437e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockvoid prefetchDNS(const String&)
438e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
439e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    notImplemented();
440e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
441e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
442e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockPassRefPtr<SharedBuffer> ResourceHandle::bufferedData()
443e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
444e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    ASSERT_NOT_REACHED();
445e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    return 0;
446e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
447e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
448e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockbool ResourceHandle::supportsBufferedData()
449e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
450e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    return false;
451e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
452e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
453e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockbool ResourceHandle::loadsBlocked()
454e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
455e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    return false;
456e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
457e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
458e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockvoid ResourceHandle::platformSetDefersLoading(bool)
459e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
460e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    notImplemented();
461e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
462e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
464