in Source/TNLRequest.m [166:246]
BOOL TNLRequestEqualToRequest(id<TNLRequest> __nullable request1,
id<TNLRequest> __nullable request2,
BOOL quickBodyCheck)
{
if (request1 == request2) {
return YES;
}
if (![request1 respondsToSelector:@selector(URL)] || ![request2 respondsToSelector:@selector(URL)]) {
return NO;
}
TNLHTTPMethod method = TNLRequestGetHTTPMethodValue(request1);
if (TNLRequestGetHTTPMethodValue(request2) != method) {
return NO;
}
if (![request1.URL isEqual:request2.URL]) {
return NO;
}
NSDictionary *headers1 = [request1 respondsToSelector:@selector(allHTTPHeaderFields)] ? [request1 allHTTPHeaderFields] : nil;
NSDictionary *headers2 = [request2 respondsToSelector:@selector(allHTTPHeaderFields)] ? [request2 allHTTPHeaderFields] : nil;
if (headers1 != headers2) {
if (headers1.count != headers2.count) {
return NO;
}
NSDictionary *lowerCaseHeaders1 = [headers1 tnl_mutableCopyWithLowercaseKeys] ?: @{};
NSDictionary *lowerCaseHeaders2 = [headers2 tnl_mutableCopyWithLowercaseKeys] ?: @{};
if (![lowerCaseHeaders1 isEqualToDictionary:lowerCaseHeaders2]) {
return NO;
}
}
if (quickBodyCheck) {
return TNLRequestHasBody(request1) == TNLRequestHasBody(request2);
}
NSData *data1 = [request1 respondsToSelector:@selector(HTTPBody)] ? [request1 HTTPBody] : nil;
NSData *data2 = [request2 respondsToSelector:@selector(HTTPBody)] ? [request2 HTTPBody] : nil;
if (data1 != data2) {
// Compare Data
if (data1.length != data2.length) {
return NO;
} else if (!data1 || !data2) {
return NO;
} else if (data1.length > kMaxBytesToCompare) {
// If the body is too large, don't bother comparing as it would be too expensive
return NO;
} else if (![data1 isEqualToData:data2]) {
return NO;
}
} else {
if (!data1 /* both are nil */) {
NSString *file1 = [request1 respondsToSelector:@selector(HTTPBodyFilePath)] ? [request1 HTTPBodyFilePath] : nil;
NSString *file2 = [request2 respondsToSelector:@selector(HTTPBodyFilePath)] ? [request2 HTTPBodyFilePath] : nil;
if (!file1 && !file2) {
// Compare streams
NSInputStream *input1 = [request1 respondsToSelector:@selector(HTTPBodyStream)] ? [request1 HTTPBodyStream] : nil;
NSInputStream *input2 = [request2 respondsToSelector:@selector(HTTPBodyStream)] ? [request2 HTTPBodyStream] : nil;
if (input1 != input2) {
return NO;
}
} else {
// Compare files
if (!file1 || !file2 || ![file1 isEqualToString:file2]) {
return NO;
}
}
}
}
return YES;
}