Home | History | Annotate | Download | only in mac
      1 /*
      2  * Copyright (C) 2010 Apple Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  *
      8  * 1.  Redistributions of source code must retain the above copyright
      9  *     notice, this list of conditions and the following disclaimer.
     10  * 2.  Redistributions in binary form must reproduce the above copyright
     11  *     notice, this list of conditions and the following disclaimer in the
     12  *     documentation and/or other materials provided with the distribution.
     13  *
     14  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
     15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     16  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     17  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
     18  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     19  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     20  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
     21  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #import "config.h"
     27 #import "WebArchiveDumpSupport.h"
     28 
     29 #import <CFNetwork/CFHTTPMessage.h>
     30 #import <Foundation/Foundation.h>
     31 #import <WebKit/WebHTMLRepresentation.h>
     32 #import <wtf/RetainPtr.h>
     33 
     34 extern "C" {
     35 
     36 enum CFURLCacheStoragePolicy {
     37   kCFURLCacheStorageAllowed = 0,
     38   kCFURLCacheStorageAllowedInMemoryOnly = 1,
     39   kCFURLCacheStorageNotAllowed = 2
     40 };
     41 typedef enum CFURLCacheStoragePolicy CFURLCacheStoragePolicy;
     42 
     43 extern const CFStringRef kCFHTTPVersion1_1;
     44 
     45 CFURLResponseRef CFURLResponseCreate(CFAllocatorRef alloc, CFURLRef URL, CFStringRef mimeType, SInt64 expectedContentLength, CFStringRef textEncodingName, CFURLCacheStoragePolicy recommendedPolicy);
     46 CFURLResponseRef CFURLResponseCreateWithHTTPResponse(CFAllocatorRef alloc, CFURLRef URL, CFHTTPMessageRef httpResponse, CFURLCacheStoragePolicy recommendedPolicy);
     47 void CFURLResponseSetExpectedContentLength(CFURLResponseRef response, SInt64 length);
     48 void CFURLResponseSetMIMEType(CFURLResponseRef response, CFStringRef mimeType);
     49 
     50 }
     51 
     52 CFURLResponseRef createCFURLResponseFromResponseData(CFDataRef responseData)
     53 {
     54     // Decode NSURLResponse
     55     RetainPtr<NSKeyedUnarchiver> unarchiver(AdoptNS, [[NSKeyedUnarchiver alloc] initForReadingWithData:(NSData *)responseData]);
     56     NSURLResponse *response = [unarchiver.get() decodeObjectForKey:@"WebResourceResponse"]; // WebResourceResponseKey in WebResource.m
     57     [unarchiver.get() finishDecoding];
     58 
     59     if (![response isKindOfClass:[NSHTTPURLResponse class]])
     60         return CFURLResponseCreate(kCFAllocatorDefault, (CFURLRef)[response URL], (CFStringRef)[response MIMEType], [response expectedContentLength], (CFStringRef)[response textEncodingName], kCFURLCacheStorageAllowed);
     61 
     62     NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
     63 
     64     // NSURLResponse is not toll-free bridged to CFURLResponse.
     65     RetainPtr<CFHTTPMessageRef> httpMessage(AdoptCF, CFHTTPMessageCreateResponse(kCFAllocatorDefault, [httpResponse statusCode], 0, kCFHTTPVersion1_1));
     66 
     67     NSDictionary *headerFields = [httpResponse allHeaderFields];
     68     for (NSString *headerField in [headerFields keyEnumerator])
     69         CFHTTPMessageSetHeaderFieldValue(httpMessage.get(), (CFStringRef)headerField, (CFStringRef)[headerFields objectForKey:headerField]);
     70 
     71     return CFURLResponseCreateWithHTTPResponse(kCFAllocatorDefault, (CFURLRef)[response URL], httpMessage.get(), kCFURLCacheStorageAllowed);
     72 }
     73 
     74 CFArrayRef supportedNonImageMIMETypes()
     75 {
     76     return (CFArrayRef)[WebHTMLRepresentation supportedNonImageMIMETypes];
     77 }
     78