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