CFCachedURLResponseRef SynchronousResourceHandleCFURLConnectionDelegate::willCacheResponse(CFCachedURLResponseRef cachedResponse) { #if PLATFORM(WIN) // Workaround for <rdar://problem/6300990> Caching does not respect Vary HTTP header. // FIXME: WebCore cache has issues with Vary, too (bug 58797, bug 71509). CFURLResponseRef wrappedResponse = CFCachedURLResponseGetWrappedResponse(cachedResponse); if (CFHTTPMessageRef httpResponse = CFURLResponseGetHTTPResponse(wrappedResponse)) { ASSERT(CFHTTPMessageIsHeaderComplete(httpResponse)); RetainPtr<CFStringRef> varyValue = adoptCF(CFHTTPMessageCopyHeaderFieldValue(httpResponse, CFSTR("Vary"))); if (varyValue) return 0; } #endif // PLATFORM(WIN) #if PLATFORM(WIN) if (m_handle->client() && !m_handle->client()->shouldCacheResponse(m_handle, cachedResponse)) return 0; #else CFCachedURLResponseRef newResponse = m_handle->client()->willCacheResponse(m_handle, cachedResponse); if (newResponse != cachedResponse) return newResponse; #endif CFRetain(cachedResponse); return cachedResponse; }
static CFCachedURLResponseRef willCacheResponse(CFURLConnectionRef, CFCachedURLResponseRef cachedResponse, const void* clientInfo) { ResourceHandle* handle = static_cast<ResourceHandle*>(const_cast<void*>(clientInfo)); #if PLATFORM(WIN) if (handle->client() && !handle->client()->shouldCacheResponse(handle, cachedResponse)) return 0; #else CFCachedURLResponseRef newResponse = handle->client()->willCacheResponse(handle, cachedResponse); if (newResponse != cachedResponse) return newResponse; #endif CacheStoragePolicy policy = static_cast<CacheStoragePolicy>(CFCachedURLResponseGetStoragePolicy(cachedResponse)); if (handle->client()) handle->client()->willCacheResponse(handle, policy); if (static_cast<CFURLCacheStoragePolicy>(policy) != CFCachedURLResponseGetStoragePolicy(cachedResponse)) { RetainPtr<CFArrayRef> receiverData(AdoptCF, CFCachedURLResponseCopyReceiverDataArray(cachedResponse)); cachedResponse = CFCachedURLResponseCreateWithDataArray(kCFAllocatorDefault, CFCachedURLResponseGetWrappedResponse(cachedResponse), receiverData.get(), CFCachedURLResponseGetUserInfo(cachedResponse), static_cast<CFURLCacheStoragePolicy>(policy)); } else CFRetain(cachedResponse); return cachedResponse; }
static CFCachedURLResponseRef willCacheResponse(CFURLConnectionRef, CFCachedURLResponseRef cachedResponse, const void* clientInfo) { ResourceHandle* handle = static_cast<ResourceHandle*>(const_cast<void*>(clientInfo)); CFURLResponseRef wrappedResponse = CFCachedURLResponseGetWrappedResponse(cachedResponse); // Workaround for <rdar://problem/6300990> Caching does not respect Vary HTTP header. // FIXME: WebCore cache has issues with Vary, too (bug 58797, bug 71509). if (CFHTTPMessageRef httpResponse = CFURLResponseGetHTTPResponse(wrappedResponse)) { ASSERT(CFHTTPMessageIsHeaderComplete(httpResponse)); RetainPtr<CFStringRef> varyValue = adoptCF(CFHTTPMessageCopyHeaderFieldValue(httpResponse, CFSTR("Vary"))); if (varyValue) return 0; } #if PLATFORM(WIN) if (handle->client() && !handle->client()->shouldCacheResponse(handle, cachedResponse)) return 0; #else CFCachedURLResponseRef newResponse = handle->client()->willCacheResponse(handle, cachedResponse); if (newResponse != cachedResponse) return newResponse; #endif CFRetain(cachedResponse); return cachedResponse; }
bool ResourceLoader::shouldCacheResponse(ResourceHandle*, CFCachedURLResponseRef cachedResponse) { if (!m_sendResourceLoadCallbacks) return 0; CFURLResponseRef response = CFCachedURLResponseGetWrappedResponse(cachedResponse); CFDataRef data = CFCachedURLResponseGetReceiverData(cachedResponse); return frameLoader()->client()->shouldCacheResponse(documentLoader(), identifier(), response, CFDataGetBytePtr(data), CFDataGetLength(data)); }
String WebPage::cachedResponseMIMETypeForURL(const KURL& url) { #if USE(CFNETWORK) RetainPtr<CFCachedURLResponseRef> cachedResponse = cachedResponseForURL(this, url); CFURLResponseRef response = CFCachedURLResponseGetWrappedResponse(cachedResponse.get()); return response ? CFURLResponseGetMIMEType(response) : String(); #else return String(); #endif }
String WebPage::cachedSuggestedFilenameForURL(const KURL& url) { #if USE(CFNETWORK) RetainPtr<CFCachedURLResponseRef> cachedResponse = cachedResponseForURL(this, url); CFURLResponseRef response = CFCachedURLResponseGetWrappedResponse(cachedResponse.get()); if (!response) return String(); RetainPtr<CFStringRef> suggestedFilename(AdoptCF, CFURLResponseCopySuggestedFilename(response)); return suggestedFilename.get(); #else return String(); #endif }
CFCachedURLResponseRef willCacheResponse(CFURLConnectionRef conn, CFCachedURLResponseRef cachedResponse, const void* clientInfo) { ResourceHandle* handle = (ResourceHandle*)clientInfo; CacheStoragePolicy policy = static_cast<CacheStoragePolicy>(CFCachedURLResponseGetStoragePolicy(cachedResponse)); if (handle->client()) handle->client()->willCacheResponse(handle, policy); if (static_cast<CFURLCacheStoragePolicy>(policy) != CFCachedURLResponseGetStoragePolicy(cachedResponse)) cachedResponse = CFCachedURLResponseCreateWithUserInfo(kCFAllocatorDefault, CFCachedURLResponseGetWrappedResponse(cachedResponse), CFCachedURLResponseGetReceiverData(cachedResponse), CFCachedURLResponseGetUserInfo(cachedResponse), static_cast<CFURLCacheStoragePolicy>(policy)); CFRetain(cachedResponse); return cachedResponse; }
static CFCachedURLResponseRef willCacheResponse(CFURLConnectionRef, CFCachedURLResponseRef cachedResponse, const void* clientInfo) { ResourceHandle* handle = static_cast<ResourceHandle*>(const_cast<void*>(clientInfo)); CFURLResponseRef wrappedResponse = CFCachedURLResponseGetWrappedResponse(cachedResponse); // Workaround for <rdar://problem/6300990> Caching does not respect Vary HTTP header. // FIXME: WebCore cache has issues with Vary, too (bug 58797, bug 71509). if (CFHTTPMessageRef httpResponse = CFURLResponseGetHTTPResponse(wrappedResponse)) { ASSERT(CFHTTPMessageIsHeaderComplete(httpResponse)); RetainPtr<CFStringRef> varyValue = adoptCF(CFHTTPMessageCopyHeaderFieldValue(httpResponse, CFSTR("Vary"))); if (varyValue) return 0; } #if PLATFORM(WIN) if (handle->client() && !handle->client()->shouldCacheResponse(handle, cachedResponse)) return 0; #else CFCachedURLResponseRef newResponse = handle->client()->willCacheResponse(handle, cachedResponse); if (newResponse != cachedResponse) return newResponse; #endif CacheStoragePolicy policy = static_cast<CacheStoragePolicy>(CFCachedURLResponseGetStoragePolicy(cachedResponse)); if (handle->client()) handle->client()->willCacheResponse(handle, policy); if (static_cast<CFURLCacheStoragePolicy>(policy) != CFCachedURLResponseGetStoragePolicy(cachedResponse)) { RetainPtr<CFArrayRef> receiverData(AdoptCF, CFCachedURLResponseCopyReceiverDataArray(cachedResponse)); cachedResponse = CFCachedURLResponseCreateWithDataArray(kCFAllocatorDefault, wrappedResponse, receiverData.get(), CFCachedURLResponseGetUserInfo(cachedResponse), static_cast<CFURLCacheStoragePolicy>(policy)); } else CFRetain(cachedResponse); return cachedResponse; }