Source/NSHTTPCookieStorage+TNLAdditions.m (67 lines of code) (raw):
//
// NSHTTPCookieStorage+TNLAdditions.m
// TwitterNetworkLayer
//
// Created on 2/9/15.
// Copyright © 2020 Twitter. All rights reserved.
//
#import "NSHTTPCookieStorage+TNLAdditions.h"
#import "TNL_Project.h"
#import "TNLRequestConfiguration_Project.h"
NS_ASSUME_NONNULL_BEGIN
@interface TNLSharedCookieStorageProxy : NSProxy
@end
@interface TNLHTTPCookieStorageDemuxProxy : TNLSharedCookieStorageProxy
@end
NSHTTPCookieStorage *TNLGetHTTPCookieStorageDemuxProxy()
{
static TNLHTTPCookieStorageDemuxProxy *sProxy;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sProxy = [TNLHTTPCookieStorageDemuxProxy alloc];
});
return (id)sProxy;
}
@implementation NSHTTPCookieStorage (TNLAdditions)
+ (NSHTTPCookieStorage *)tnl_sharedHTTPCookieStorageProxy
{
static TNLSharedCookieStorageProxy *sProxy;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sProxy = [TNLSharedCookieStorageProxy alloc];
});
return (id)sProxy;
}
@end
@implementation TNLSharedCookieStorageProxy
- (nullable NSMethodSignature *)methodSignatureForSelector:(SEL)sel
{
return [[NSHTTPCookieStorage sharedHTTPCookieStorage] methodSignatureForSelector:sel];
}
- (void)forwardInvocation:(NSInvocation *)invocation
{
[invocation invokeWithTarget:[NSHTTPCookieStorage sharedHTTPCookieStorage]];
}
- (NSString *)description
{
// NSHTTPCookieStorage has a very severe bug in its `description` method that can lead to
// corruption, crashing or an invalid string.
// Let's avoid this in our proxy by overriding it
// TODO:[nobrien] - investigate swizzling out the description method of NSHTTPCookieStorage for safety
return [NSString stringWithFormat:@"<%@ %p>", NSStringFromClass([self class]), self];
}
@end
@implementation TNLHTTPCookieStorageDemuxProxy
// Legacy is not supported since there isn't a good place to associate the request config with the URL
// Modern - API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0))
- (void)storeCookies:(NSArray<NSHTTPCookie *> *)cookies
forTask:(NSURLSessionTask *)task
{
TNLRequestConfiguration *config = TNLRequestConfigurationGetAssociatedWithRequest(task.originalRequest);
NSHTTPCookieStorage *store = TNLUnwrappedCookieStorage(config.cookieStorage);
if (store) {
[store storeCookies:cookies
forTask:task];
}
}
- (void)getCookiesForTask:(NSURLSessionTask *)task
completionHandler:(void (^) (NSArray<NSHTTPCookie *> * _Nullable cookies))completionHandler
{
TNLRequestConfiguration *config = TNLRequestConfigurationGetAssociatedWithRequest(task.originalRequest);
NSHTTPCookieStorage *store = TNLUnwrappedCookieStorage(config.cookieStorage);
if (store) {
[store getCookiesForTask:task
completionHandler:completionHandler];
} else {
completionHandler(nil);
}
}
@end
NS_ASSUME_NONNULL_END