ResourceRequestMac.mm revision cad810f21b803229eb11403f9209855525a25d57
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#import "config.h"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "ResourceRequest.h"
28cad810f21b803229eb11403f9209855525a25d57Steve Block
29cad810f21b803229eb11403f9209855525a25d57Steve Block#if !USE(CFNETWORK)
30cad810f21b803229eb11403f9209855525a25d57Steve Block
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebCoreSystemInterface.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "FormDataStreamMac.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <Foundation/Foundation.h>
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifdef BUILDING_ON_TIGER
38635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projecttypedef unsigned NSUInteger;
39635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
40635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
41635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project@interface NSURLRequest (WebCoreContentDispositionEncoding)
42635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (NSArray *)contentDispositionEncodingFallbackArray;
43635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project@end
44635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
45635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project@interface NSMutableURLRequest (WebCoreContentDispositionEncoding)
46635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)setContentDispositionEncodingFallbackArray:(NSArray *)theEncodingFallbackArray;
47635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project@end
48635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSURLRequest* ResourceRequest::nsURLRequest() const
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    updatePlatformRequest();
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[m_nsRequest.get() retain] autorelease];
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ResourceRequest::doUpdateResourceRequest()
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_url = [m_nsRequest.get() URL];
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_cachePolicy = (ResourceRequestCachePolicy)[m_nsRequest.get() cachePolicy];
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_timeoutInterval = [m_nsRequest.get() timeoutInterval];
635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    m_firstPartyForCookies = [m_nsRequest.get() mainDocumentURL];
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (NSString* method = [m_nsRequest.get() HTTPMethod])
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_httpMethod = method;
67231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    m_allowCookies = [m_nsRequest.get() HTTPShouldHandleCookies];
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSDictionary *headers = [m_nsRequest.get() allHTTPHeaderFields];
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSEnumerator *e = [headers keyEnumerator];
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString *name;
72cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    m_httpHeaderFields.clear();
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while ((name = [e nextObject]))
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_httpHeaderFields.set(name, [headers objectForKey:name]);
75635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
76635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // The below check can be removed once we require a version of Foundation with -[NSURLRequest contentDispositionEncodingFallbackArray] method.
77635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    static bool supportsContentDispositionEncodingFallbackArray = [NSURLRequest instancesRespondToSelector:@selector(contentDispositionEncodingFallbackArray)];
78635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (supportsContentDispositionEncodingFallbackArray) {
79635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_responseContentDispositionEncodingFallbackArray.clear();
80635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NSArray *encodingFallbacks = [m_nsRequest.get() contentDispositionEncodingFallbackArray];
81635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NSUInteger count = [encodingFallbacks count];
82635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        for (NSUInteger i = 0; i < count; ++i) {
83635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CFStringEncoding encoding = CFStringConvertNSStringEncodingToEncoding([(NSNumber *)[encodingFallbacks objectAtIndex:i] unsignedLongValue]);
84635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (encoding != kCFStringEncodingInvalidId)
855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                m_responseContentDispositionEncodingFallbackArray.append(CFStringConvertEncodingToIANACharSetName(encoding));
86635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
87635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
88635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (NSData* bodyData = [m_nsRequest.get() HTTPBody])
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_httpBody = FormData::create([bodyData bytes], [bodyData length]);
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (NSInputStream* bodyStream = [m_nsRequest.get() HTTPBodyStream])
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (FormData* formData = httpBodyFromStream(bodyStream))
93635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            m_httpBody = formData;
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ResourceRequest::doUpdatePlatformRequest()
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (isNull()) {
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_nsRequest = nil;
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSMutableURLRequest* nsRequest = [m_nsRequest.get() mutableCopy];
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (nsRequest)
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [nsRequest setURL:url()];
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        nsRequest = [[NSMutableURLRequest alloc] initWithURL:url()];
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef BUILDING_ON_TIGER
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    wkSupportsMultipartXMixedReplace(nsRequest);
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [nsRequest setCachePolicy:(NSURLRequestCachePolicy)cachePolicy()];
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (timeoutInterval() != unspecifiedTimeoutInterval)
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [nsRequest setTimeoutInterval:timeoutInterval()];
1175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    [nsRequest setMainDocumentURL:firstPartyForCookies()];
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!httpMethod().isEmpty())
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [nsRequest setHTTPMethod:httpMethod()];
120231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    [nsRequest setHTTPShouldHandleCookies:allowCookies()];
121cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
122cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    // Cannot just use setAllHTTPHeaderFields here, because it does not remove headers.
123cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    NSArray *oldHeaderFieldNames = [[nsRequest allHTTPHeaderFields] allKeys];
124cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    for (unsigned i = [oldHeaderFieldNames count]; i != 0; --i)
125cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        [nsRequest setValue:nil forHTTPHeaderField:[oldHeaderFieldNames objectAtIndex:i - 1]];
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HTTPHeaderMap::const_iterator end = httpHeaderFields().end();
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (HTTPHeaderMap::const_iterator it = httpHeaderFields().begin(); it != end; ++it)
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [nsRequest setValue:it->second forHTTPHeaderField:it->first];
129635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // The below check can be removed once we require a version of Foundation with -[NSMutableURLRequest setContentDispositionEncodingFallbackArray:] method.
1318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    static bool supportsContentDispositionEncodingFallbackArray = [NSMutableURLRequest instancesRespondToSelector:@selector(setContentDispositionEncodingFallbackArray:)];
132635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (supportsContentDispositionEncodingFallbackArray) {
133635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NSMutableArray *encodingFallbacks = [NSMutableArray array];
134635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        unsigned count = m_responseContentDispositionEncodingFallbackArray.size();
135635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        for (unsigned i = 0; i != count; ++i) {
136635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CFStringRef encodingName = m_responseContentDispositionEncodingFallbackArray[i].createCFString();
137635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            unsigned long nsEncoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding(encodingName));
138635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CFRelease(encodingName);
139635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (nsEncoding != kCFStringEncodingInvalidId)
140635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                [encodingFallbacks addObject:[NSNumber numberWithUnsignedLong:nsEncoding]];
141635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
142635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        [nsRequest setContentDispositionEncodingFallbackArray:encodingFallbacks];
143635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
144635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<FormData> formData = httpBody();
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (formData && !formData->isEmpty())
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebCore::setHTTPBody(nsRequest, formData);
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_nsRequest.adoptNS(nsRequest);
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ResourceRequest::applyWebArchiveHackForMail()
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Hack because Mail checks for this property to detect data / archive loads
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [NSURLProtocol setProperty:@"" forKey:@"WebDataRequest" inRequest:(NSMutableURLRequest *)nsURLRequest()];
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianunsigned initializeMaximumHTTPConnectionCountPerHost()
1595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
1605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    static const unsigned preferredConnectionCount = 6;
1615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return wkInitializeMaximumHTTPConnectionCountPerHost(preferredConnectionCount);
1625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
164cad810f21b803229eb11403f9209855525a25d57Steve Block} // namespace WebCore
165cad810f21b803229eb11403f9209855525a25d57Steve Block
166cad810f21b803229eb11403f9209855525a25d57Steve Block#endif // !USE(CFNETWORK)
167