18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 2635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ResourceRequestCFNet.h" 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ResourceRequest.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if PLATFORM(MAC) 322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "ResourceLoadPriority.h" 332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "WebCoreSystemInterface.h" 342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif 352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if USE(CFNETWORK) 372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "FormDataStreamCFNet.h" 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <CFNetwork/CFURLRequestPriv.h> 395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include <WebKitSystemInterface/WebKitSystemInterface.h> 402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochbool ResourceRequest::s_httpPipeliningEnabled = false; 452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if USE(CFNETWORK) 472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 48635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projecttypedef void (*CFURLRequestSetContentDispositionEncodingFallbackArrayFunction)(CFMutableURLRequestRef, CFArrayRef); 49635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projecttypedef CFArrayRef (*CFURLRequestCopyContentDispositionEncodingFallbackArrayFunction)(CFURLRequestRef); 50635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 51635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic HMODULE findCFNetworkModule() 52635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 53cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#ifndef DEBUG_ALL 54cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return GetModuleHandleA("CFNetwork"); 55cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#else 56635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return GetModuleHandleA("CFNetwork_debug"); 57cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#endif 58635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 59635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 60635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic CFURLRequestSetContentDispositionEncodingFallbackArrayFunction findCFURLRequestSetContentDispositionEncodingFallbackArrayFunction() 61635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 62635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return reinterpret_cast<CFURLRequestSetContentDispositionEncodingFallbackArrayFunction>(GetProcAddress(findCFNetworkModule(), "_CFURLRequestSetContentDispositionEncodingFallbackArray")); 63635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 64635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 65635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic CFURLRequestCopyContentDispositionEncodingFallbackArrayFunction findCFURLRequestCopyContentDispositionEncodingFallbackArrayFunction() 66635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 67635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return reinterpret_cast<CFURLRequestCopyContentDispositionEncodingFallbackArrayFunction>(GetProcAddress(findCFNetworkModule(), "_CFURLRequestCopyContentDispositionEncodingFallbackArray")); 68635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 69635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 70635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic void setContentDispositionEncodingFallbackArray(CFMutableURLRequestRef request, CFArrayRef fallbackArray) 71635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 72635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project static CFURLRequestSetContentDispositionEncodingFallbackArrayFunction function = findCFURLRequestSetContentDispositionEncodingFallbackArrayFunction(); 73635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (function) 74635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project function(request, fallbackArray); 75635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 76635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 77635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic CFArrayRef copyContentDispositionEncodingFallbackArray(CFURLRequestRef request) 78635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 79635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project static CFURLRequestCopyContentDispositionEncodingFallbackArrayFunction function = findCFURLRequestCopyContentDispositionEncodingFallbackArrayFunction(); 80635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!function) 81635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return 0; 82635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return function(request); 83635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 84635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCFURLRequestRef ResourceRequest::cfURLRequest() const 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project updatePlatformRequest(); 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_cfRequest.get(); 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 92cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockstatic inline void setHeaderFields(CFMutableURLRequestRef request, const HTTPHeaderMap& requestHeaders) 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 94cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block // Remove existing headers first, as some of them may no longer be present in the map. 95cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block RetainPtr<CFDictionaryRef> oldHeaderFields(AdoptCF, CFURLRequestCopyAllHTTPHeaderFields(request)); 96cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block CFIndex oldHeaderFieldCount = CFDictionaryGetCount(oldHeaderFields.get()); 97cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (oldHeaderFieldCount) { 98cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block Vector<CFStringRef> oldHeaderFieldNames(oldHeaderFieldCount); 99cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block CFDictionaryGetKeysAndValues(oldHeaderFields.get(), reinterpret_cast<const void**>(&oldHeaderFieldNames[0]), 0); 100cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block for (CFIndex i = 0; i < oldHeaderFieldCount; ++i) 101cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block CFURLRequestSetHTTPHeaderFieldValue(request, oldHeaderFieldNames[i], 0); 102cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } 103cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HTTPHeaderMap::const_iterator end = requestHeaders.end(); 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (HTTPHeaderMap::const_iterator it = requestHeaders.begin(); it != end; ++it) { 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFStringRef key = it->first.createCFString(); 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFStringRef value = it->second.createCFString(); 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFURLRequestSetHTTPHeaderFieldValue(request, key, value); 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFRelease(key); 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFRelease(value); 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ResourceRequest::doUpdatePlatformRequest() 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFMutableURLRequestRef cfRequest; 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RetainPtr<CFURLRef> url(AdoptCF, ResourceRequest::url().createCFURL()); 1195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian RetainPtr<CFURLRef> firstPartyForCookies(AdoptCF, ResourceRequest::firstPartyForCookies().createCFURL()); 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_cfRequest) { 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project cfRequest = CFURLRequestCreateMutableCopy(0, m_cfRequest.get()); 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFURLRequestSetURL(cfRequest, url.get()); 1235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian CFURLRequestSetMainDocumentURL(cfRequest, firstPartyForCookies.get()); 1245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian CFURLRequestSetCachePolicy(cfRequest, (CFURLRequestCachePolicy)cachePolicy()); 1255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian CFURLRequestSetTimeoutInterval(cfRequest, timeoutInterval()); 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 1275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian cfRequest = CFURLRequestCreateMutable(0, url.get(), (CFURLRequestCachePolicy)cachePolicy(), timeoutInterval(), firstPartyForCookies.get()); 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RetainPtr<CFStringRef> requestMethod(AdoptCF, httpMethod().createCFString()); 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFURLRequestSetHTTPRequestMethod(cfRequest, requestMethod.get()); 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 133cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block setHeaderFields(cfRequest, httpHeaderFields()); 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebCore::setHTTPBody(cfRequest, httpBody()); 135231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block CFURLRequestSetShouldHandleHTTPCookies(cfRequest, allowCookies()); 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 137635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project unsigned fallbackCount = m_responseContentDispositionEncodingFallbackArray.size(); 138635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project RetainPtr<CFMutableArrayRef> encodingFallbacks(AdoptCF, CFArrayCreateMutable(kCFAllocatorDefault, fallbackCount, 0)); 139635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (unsigned i = 0; i != fallbackCount; ++i) { 140635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project RetainPtr<CFStringRef> encodingName(AdoptCF, m_responseContentDispositionEncodingFallbackArray[i].createCFString()); 141635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project CFStringEncoding encoding = CFStringConvertIANACharSetNameToEncoding(encodingName.get()); 142635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (encoding != kCFStringEncodingInvalidId) 143635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project CFArrayAppendValue(encodingFallbacks.get(), reinterpret_cast<const void*>(encoding)); 144635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 145635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project setContentDispositionEncodingFallbackArray(cfRequest, encodingFallbacks.get()); 146635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_cfRequest) { 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RetainPtr<CFHTTPCookieStorageRef> cookieStorage(AdoptCF, CFURLRequestCopyHTTPCookieStorage(m_cfRequest.get())); 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (cookieStorage) 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFURLRequestSetHTTPCookieStorage(cfRequest, cookieStorage.get()); 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFURLRequestSetHTTPCookieStorageAcceptPolicy(cfRequest, CFURLRequestGetHTTPCookieStorageAcceptPolicy(m_cfRequest.get())); 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFURLRequestSetSSLProperties(cfRequest, CFURLRequestGetSSLProperties(m_cfRequest.get())); 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_cfRequest.adoptCF(cfRequest); 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ResourceRequest::doUpdateResourceRequest() 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 160967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch if (!m_cfRequest) { 161967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch *this = ResourceRequest(); 162967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch return; 163967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch } 164967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_url = CFURLRequestGetURL(m_cfRequest.get()); 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_cachePolicy = (ResourceRequestCachePolicy)CFURLRequestGetCachePolicy(m_cfRequest.get()); 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_timeoutInterval = CFURLRequestGetTimeoutInterval(m_cfRequest.get()); 1695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_firstPartyForCookies = CFURLRequestGetMainDocumentURL(m_cfRequest.get()); 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (CFStringRef method = CFURLRequestCopyHTTPRequestMethod(m_cfRequest.get())) { 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_httpMethod = method; 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFRelease(method); 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 174231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_allowCookies = CFURLRequestShouldHandleHTTPCookies(m_cfRequest.get()); 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 176cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block m_httpHeaderFields.clear(); 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (CFDictionaryRef headers = CFURLRequestCopyAllHTTPHeaderFields(m_cfRequest.get())) { 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFIndex headerCount = CFDictionaryGetCount(headers); 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Vector<const void*, 128> keys(headerCount); 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Vector<const void*, 128> values(headerCount); 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFDictionaryGetKeysAndValues(headers, keys.data(), values.data()); 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (int i = 0; i < headerCount; ++i) 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_httpHeaderFields.set((CFStringRef)keys[i], (CFStringRef)values[i]); 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFRelease(headers); 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 187635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_responseContentDispositionEncodingFallbackArray.clear(); 188635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project RetainPtr<CFArrayRef> encodingFallbacks(AdoptCF, copyContentDispositionEncodingFallbackArray(m_cfRequest.get())); 189635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (encodingFallbacks) { 190635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project CFIndex count = CFArrayGetCount(encodingFallbacks.get()); 191635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (CFIndex i = 0; i < count; ++i) { 192635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project CFStringEncoding encoding = reinterpret_cast<CFIndex>(CFArrayGetValueAtIndex(encodingFallbacks.get(), i)); 193635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (encoding != kCFStringEncodingInvalidId) 1945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_responseContentDispositionEncodingFallbackArray.append(CFStringConvertEncodingToIANACharSetName(encoding)); 195635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 196635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 197635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_httpBody = httpBodyFromRequest(m_cfRequest.get()); 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(CFURLSTORAGESESSIONS) 20281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 20381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid ResourceRequest::setStorageSession(CFURLStorageSessionRef storageSession) 20481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 20581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch CFMutableURLRequestRef cfRequest = CFURLRequestCreateMutableCopy(0, m_cfRequest.get()); 20681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch wkSetRequestStorageSession(storageSession, cfRequest); 20781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_cfRequest.adoptCF(cfRequest); 20881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 20981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 21081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif 21181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 2122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif // USE(CFNETWORK) 2132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 2142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochbool ResourceRequest::httpPipeliningEnabled() 2152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 2162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return s_httpPipeliningEnabled; 2172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 2182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid ResourceRequest::setHTTPPipeliningEnabled(bool flag) 2202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 2212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch s_httpPipeliningEnabled = flag; 2222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 2232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianunsigned initializeMaximumHTTPConnectionCountPerHost() 2255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 2265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian static const unsigned preferredConnectionCount = 6; 2272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block static const unsigned unlimitedConnectionCount = 10000; 2282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 2292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // Always set the connection count per host, even when pipelining. 2302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block unsigned maximumHTTPConnectionCountPerHost = wkInitializeMaximumHTTPConnectionCountPerHost(preferredConnectionCount); 2312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 2322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if PLATFORM(MAC) 2332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (ResourceRequest::httpPipeliningEnabled()) { 2342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch wkSetHTTPPipeliningMaximumPriority(ResourceLoadPriorityHighest); 2352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch wkSetHTTPPipeliningMinimumFastLanePriority(ResourceLoadPriorityMedium); 2362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // When pipelining do not rate-limit requests sent from WebCore since CFNetwork handles that. 2372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return unlimitedConnectionCount; 2382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 2392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif 2402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 2412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return maximumHTTPConnectionCountPerHost; 2425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 2435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 2442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} // namespace WebCore 245