Merge pull request #2990 from dreampiggy/feature_convenient_header
Add the convenient request/response modifier, which provide HTTP header directly
This commit is contained in:
commit
e85beab792
|
@ -30,7 +30,12 @@ A downloader response modifier class with block.
|
||||||
*/
|
*/
|
||||||
@interface SDWebImageDownloaderDecryptor : NSObject <SDWebImageDownloaderDecryptor>
|
@interface SDWebImageDownloaderDecryptor : NSObject <SDWebImageDownloaderDecryptor>
|
||||||
|
|
||||||
|
/// Create the data decryptor with block
|
||||||
|
/// @param block A block to control decrypt logic
|
||||||
- (nonnull instancetype)initWithBlock:(nonnull SDWebImageDownloaderDecryptorBlock)block;
|
- (nonnull instancetype)initWithBlock:(nonnull SDWebImageDownloaderDecryptorBlock)block;
|
||||||
|
|
||||||
|
/// Create the data decryptor with block
|
||||||
|
/// @param block A block to control decrypt logic
|
||||||
+ (nonnull instancetype)decryptorWithBlock:(nonnull SDWebImageDownloaderDecryptorBlock)block;
|
+ (nonnull instancetype)decryptorWithBlock:(nonnull SDWebImageDownloaderDecryptorBlock)block;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -29,7 +29,41 @@ typedef NSURLRequest * _Nullable (^SDWebImageDownloaderRequestModifierBlock)(NSU
|
||||||
*/
|
*/
|
||||||
@interface SDWebImageDownloaderRequestModifier : NSObject <SDWebImageDownloaderRequestModifier>
|
@interface SDWebImageDownloaderRequestModifier : NSObject <SDWebImageDownloaderRequestModifier>
|
||||||
|
|
||||||
|
/// Create the request modifier with block
|
||||||
|
/// @param block A block to control modifier logic
|
||||||
- (nonnull instancetype)initWithBlock:(nonnull SDWebImageDownloaderRequestModifierBlock)block;
|
- (nonnull instancetype)initWithBlock:(nonnull SDWebImageDownloaderRequestModifierBlock)block;
|
||||||
|
|
||||||
|
/// Create the request modifier with block
|
||||||
|
/// @param block A block to control modifier logic
|
||||||
+ (nonnull instancetype)requestModifierWithBlock:(nonnull SDWebImageDownloaderRequestModifierBlock)block;
|
+ (nonnull instancetype)requestModifierWithBlock:(nonnull SDWebImageDownloaderRequestModifierBlock)block;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
/**
|
||||||
|
A convenient request modifier to provide the HTTP request including HTTP Method, Headers and Body.
|
||||||
|
*/
|
||||||
|
@interface SDWebImageDownloaderRequestModifier (Conveniences)
|
||||||
|
|
||||||
|
/// Create the request modifier with HTTP Method.
|
||||||
|
/// @param method HTTP Method, nil means to GET.
|
||||||
|
/// @note This is for convenience, if you need code to control the logic, use block API instead.
|
||||||
|
- (nonnull instancetype)initWithMethod:(nullable NSString *)method;
|
||||||
|
|
||||||
|
/// Create the request modifier with HTTP Headers.
|
||||||
|
/// @param headers HTTP Headers. Case insensitive according to HTTP/1.1(HTTP/2) standard. The headers will overide the same fileds from original request.
|
||||||
|
/// @note This is for convenience, if you need code to control the logic, use block API instead.
|
||||||
|
- (nonnull instancetype)initWithHeaders:(nullable NSDictionary<NSString *, NSString *> *)headers;
|
||||||
|
|
||||||
|
/// Create the request modifier with HTTP Body.
|
||||||
|
/// @param body HTTP Body.
|
||||||
|
/// @note This is for convenience, if you need code to control the logic, use block API instead.
|
||||||
|
- (nonnull instancetype)initWithBody:(nullable NSData *)body;
|
||||||
|
|
||||||
|
/// Create the request modifier with HTTP Method, Headers and Body.
|
||||||
|
/// @param method HTTP Method, nil means to GET.
|
||||||
|
/// @param headers HTTP Headers. Case insensitive according to HTTP/1.1(HTTP/2) standard. The headers will overide the same fileds from original request.
|
||||||
|
/// @param body HTTP Body.
|
||||||
|
/// @note This is for convenience, if you need code to control the logic, use block API instead.
|
||||||
|
- (nonnull instancetype)initWithMethod:(nullable NSString *)method headers:(nullable NSDictionary<NSString *, NSString *> *)headers body:(nullable NSData *)body;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
|
@ -37,3 +37,35 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@implementation SDWebImageDownloaderRequestModifier (Conveniences)
|
||||||
|
|
||||||
|
- (instancetype)initWithMethod:(NSString *)method {
|
||||||
|
return [self initWithMethod:method headers:nil body:nil];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (instancetype)initWithHeaders:(NSDictionary<NSString *,NSString *> *)headers {
|
||||||
|
return [self initWithMethod:nil headers:headers body:nil];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (instancetype)initWithBody:(NSData *)body {
|
||||||
|
return [self initWithMethod:nil headers:nil body:body];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (instancetype)initWithMethod:(NSString *)method headers:(NSDictionary<NSString *,NSString *> *)headers body:(NSData *)body {
|
||||||
|
method = [method copy];
|
||||||
|
headers = [headers copy];
|
||||||
|
body = [body copy];
|
||||||
|
return [self initWithBlock:^NSURLRequest * _Nullable(NSURLRequest * _Nonnull request) {
|
||||||
|
NSMutableURLRequest *mutableRequest = [request mutableCopy];
|
||||||
|
mutableRequest.HTTPMethod = method;
|
||||||
|
mutableRequest.HTTPBody = body;
|
||||||
|
for (NSString *header in headers) {
|
||||||
|
NSString *value = headers[header];
|
||||||
|
[mutableRequest setValue:value forHTTPHeaderField:header];
|
||||||
|
}
|
||||||
|
return [mutableRequest copy];
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
|
@ -29,7 +29,41 @@ typedef NSURLResponse * _Nullable (^SDWebImageDownloaderResponseModifierBlock)(N
|
||||||
*/
|
*/
|
||||||
@interface SDWebImageDownloaderResponseModifier : NSObject <SDWebImageDownloaderResponseModifier>
|
@interface SDWebImageDownloaderResponseModifier : NSObject <SDWebImageDownloaderResponseModifier>
|
||||||
|
|
||||||
|
/// Create the response modifier with block
|
||||||
|
/// @param block A block to control modifier logic
|
||||||
- (nonnull instancetype)initWithBlock:(nonnull SDWebImageDownloaderResponseModifierBlock)block;
|
- (nonnull instancetype)initWithBlock:(nonnull SDWebImageDownloaderResponseModifierBlock)block;
|
||||||
|
|
||||||
|
/// Create the response modifier with block
|
||||||
|
/// @param block A block to control modifier logic
|
||||||
+ (nonnull instancetype)responseModifierWithBlock:(nonnull SDWebImageDownloaderResponseModifierBlock)block;
|
+ (nonnull instancetype)responseModifierWithBlock:(nonnull SDWebImageDownloaderResponseModifierBlock)block;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
/**
|
||||||
|
A convenient response modifier to provide the HTTP response including HTTP Status Code, Version and Headers.
|
||||||
|
*/
|
||||||
|
@interface SDWebImageDownloaderResponseModifier (Conveniences)
|
||||||
|
|
||||||
|
/// Create the response modifier with HTTP Status code.
|
||||||
|
/// @param statusCode HTTP Status Code.
|
||||||
|
/// @note This is for convenience, if you need code to control the logic, use block API instead.
|
||||||
|
- (nonnull instancetype)initWithStatusCode:(NSInteger)statusCode;
|
||||||
|
|
||||||
|
/// Create the response modifier with HTTP Version. Status code defaults to 200.
|
||||||
|
/// @param version HTTP Version, nil means "HTTP/1.1".
|
||||||
|
/// @note This is for convenience, if you need code to control the logic, use block API instead.
|
||||||
|
- (nonnull instancetype)initWithVersion:(nullable NSString *)version;
|
||||||
|
|
||||||
|
/// Create the response modifier with HTTP Headers. Status code defaults to 200.
|
||||||
|
/// @param headers HTTP Headers. Case insensitive according to HTTP/1.1(HTTP/2) standard. The headers will overide the same fileds from original response.
|
||||||
|
/// @note This is for convenience, if you need code to control the logic, use block API instead.
|
||||||
|
- (nonnull instancetype)initWithHeaders:(nullable NSDictionary<NSString *, NSString *> *)headers;
|
||||||
|
|
||||||
|
/// Create the response modifier with HTTP Status Code, Version and Headers.
|
||||||
|
/// @param statusCode HTTP Status Code.
|
||||||
|
/// @param version HTTP Version, nil means "HTTP/1.1".
|
||||||
|
/// @param headers HTTP Headers. Case insensitive according to HTTP/1.1(HTTP/2) standard. The headers will overide the same fileds from original response.
|
||||||
|
/// @note This is for convenience, if you need code to control the logic, use block API instead.
|
||||||
|
- (nonnull instancetype)initWithStatusCode:(NSInteger)statusCode version:(nullable NSString *)version headers:(nullable NSDictionary<NSString *, NSString *> *)headers;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
|
@ -38,3 +38,36 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@implementation SDWebImageDownloaderResponseModifier (Conveniences)
|
||||||
|
|
||||||
|
- (instancetype)initWithStatusCode:(NSInteger)statusCode {
|
||||||
|
return [self initWithStatusCode:statusCode version:nil headers:nil];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (instancetype)initWithVersion:(NSString *)version {
|
||||||
|
return [self initWithStatusCode:200 version:version headers:nil];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (instancetype)initWithHeaders:(NSDictionary<NSString *,NSString *> *)headers {
|
||||||
|
return [self initWithStatusCode:200 version:nil headers:headers];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (instancetype)initWithStatusCode:(NSInteger)statusCode version:(NSString *)version headers:(NSDictionary<NSString *,NSString *> *)headers {
|
||||||
|
version = version ? [version copy] : @"HTTP/1.1";
|
||||||
|
headers = [headers copy];
|
||||||
|
return [self initWithBlock:^NSURLResponse * _Nullable(NSURLResponse * _Nonnull response) {
|
||||||
|
if (![response isKindOfClass:NSHTTPURLResponse.class]) {
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
NSMutableDictionary *mutableHeaders = [((NSHTTPURLResponse *)response).allHeaderFields mutableCopy];
|
||||||
|
for (NSString *header in headers) {
|
||||||
|
NSString *value = headers[header];
|
||||||
|
mutableHeaders[header] = value;
|
||||||
|
}
|
||||||
|
NSHTTPURLResponse *httpResponse = [[NSHTTPURLResponse alloc] initWithURL:response.URL statusCode:statusCode HTTPVersion:version headerFields:[mutableHeaders copy]];
|
||||||
|
return httpResponse;
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
|
@ -502,7 +502,14 @@
|
||||||
- (void)test23ThatDownloadRequestModifierWorks {
|
- (void)test23ThatDownloadRequestModifierWorks {
|
||||||
XCTestExpectation *expectation = [self expectationWithDescription:@"Download request modifier not works"];
|
XCTestExpectation *expectation = [self expectationWithDescription:@"Download request modifier not works"];
|
||||||
SDWebImageDownloader *downloader = [[SDWebImageDownloader alloc] init];
|
SDWebImageDownloader *downloader = [[SDWebImageDownloader alloc] init];
|
||||||
SDWebImageDownloaderRequestModifier *requestModifier = [SDWebImageDownloaderRequestModifier requestModifierWithBlock:^NSURLRequest * _Nullable(NSURLRequest * _Nonnull request) {
|
|
||||||
|
// Test conveniences modifier
|
||||||
|
SDWebImageDownloaderRequestModifier *requestModifier = [[SDWebImageDownloaderRequestModifier alloc] initWithHeaders:@{@"Biz" : @"Bazz"}];
|
||||||
|
NSURLRequest *testRequest = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:kTestJPEGURL]];
|
||||||
|
testRequest = [requestModifier modifiedRequestWithRequest:testRequest];
|
||||||
|
expect(testRequest.allHTTPHeaderFields).equal(@{@"Biz" : @"Bazz"});
|
||||||
|
|
||||||
|
requestModifier = [SDWebImageDownloaderRequestModifier requestModifierWithBlock:^NSURLRequest * _Nullable(NSURLRequest * _Nonnull request) {
|
||||||
if ([request.URL.absoluteString isEqualToString:kTestPNGURL]) {
|
if ([request.URL.absoluteString isEqualToString:kTestPNGURL]) {
|
||||||
// Test that return a modified request
|
// Test that return a modified request
|
||||||
NSMutableURLRequest *mutableRequest = [request mutableCopy];
|
NSMutableURLRequest *mutableRequest = [request mutableCopy];
|
||||||
|
@ -550,8 +557,15 @@
|
||||||
|
|
||||||
SDWebImageDownloader *downloader = [[SDWebImageDownloader alloc] init];
|
SDWebImageDownloader *downloader = [[SDWebImageDownloader alloc] init];
|
||||||
|
|
||||||
|
// Test conveniences modifier
|
||||||
|
SDWebImageDownloaderResponseModifier *responseModifier = [[SDWebImageDownloaderResponseModifier alloc] initWithHeaders:@{@"Biz" : @"Bazz"}];
|
||||||
|
NSURLResponse *testResponse = [[NSHTTPURLResponse alloc] initWithURL:[NSURL URLWithString:kTestPNGURL] statusCode:404 HTTPVersion:@"HTTP/1.1" headerFields:nil];
|
||||||
|
testResponse = [responseModifier modifiedResponseWithResponse:testResponse];
|
||||||
|
expect(((NSHTTPURLResponse *)testResponse).allHeaderFields).equal(@{@"Biz" : @"Bazz"});
|
||||||
|
expect(((NSHTTPURLResponse *)testResponse).statusCode).equal(200);
|
||||||
|
|
||||||
// 1. Test webURL to response custom status code and header
|
// 1. Test webURL to response custom status code and header
|
||||||
SDWebImageDownloaderResponseModifier *responseModifier = [SDWebImageDownloaderResponseModifier responseModifierWithBlock:^NSURLResponse * _Nullable(NSURLResponse * _Nonnull response) {
|
responseModifier = [SDWebImageDownloaderResponseModifier responseModifierWithBlock:^NSURLResponse * _Nullable(NSURLResponse * _Nonnull response) {
|
||||||
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
|
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
|
||||||
NSMutableDictionary *mutableHeaderFields = [httpResponse.allHeaderFields mutableCopy];
|
NSMutableDictionary *mutableHeaderFields = [httpResponse.allHeaderFields mutableCopy];
|
||||||
mutableHeaderFields[@"Foo"] = @"Bar";
|
mutableHeaderFields[@"Foo"] = @"Bar";
|
||||||
|
|
Loading…
Reference in New Issue