EMASCurlWeb/EMASCurlWebURLResponseCache.m (64 lines of code) (raw):
//
// EMASCurlHybridURLCache.m
#import "EMASCurlWebURLResponseCache.h"
#import "NSCachedURLResponse+EMASCurl.h"
#import <objc/message.h>
@interface EMASCurlWebURLResponseCache ()
@property (nonatomic, strong) NSURLCache *urlCache;
@end
@implementation EMASCurlWebURLResponseCache
- (instancetype)init {
if (self = [super init]) {
_urlCache = [NSURLCache sharedURLCache];
}
return self;
}
- (void)cacheWithHTTPURLResponse:(NSHTTPURLResponse *)response
data:(NSData *)data
request:(NSURLRequest *)request {
if (!request) {
return;
}
NSCachedURLResponse *cachedResponse = [NSCachedURLResponse emas_cachedResponseWithResponse:response
data:data
url:request.URL];
if (cachedResponse) {
[self.urlCache storeCachedResponse:cachedResponse forRequest:request];
}
}
- (nullable NSCachedURLResponse *)getCachedResponseWithRequest:(NSURLRequest *)request {
if (!request) {
return nil;
}
NSCachedURLResponse *cachedResponse = [self.urlCache cachedResponseForRequest:request];
if (!cachedResponse) {
return nil;
}
if ([cachedResponse emas_isExpired]) {
if (![cachedResponse emas_etag] && ![cachedResponse emas_lastModified]) {
[self.urlCache removeCachedResponseForRequest:request];
return nil;
}
}
return cachedResponse;
}
- (nullable NSCachedURLResponse *)updateCachedResponseWithURLResponse:(NSHTTPURLResponse *)newResponse
request:(NSURLRequest *)request {
if (!request) {
return nil;
}
NSCachedURLResponse *cachedResponse = [self.urlCache cachedResponseForRequest:request];
if (!cachedResponse) {
return nil;
}
if (![cachedResponse emas_isExpired]) {
return cachedResponse;
}
NSCachedURLResponse *updatedResponse = [cachedResponse emas_updatedResponseWithHeaderFields:newResponse.allHeaderFields];
if ([updatedResponse emas_canCache]) {
[self.urlCache storeCachedResponse:updatedResponse forRequest:request];
return updatedResponse;
} else {
[self.urlCache removeCachedResponseForRequest:request];
return nil;
}
}
@end