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