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