BOOL TNLRequestEqualToRequest()

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;
}